vba excel

dany67700

Nouveau membre
Bonsoir,

Je fais face à un blocage sur excel et je vous sollicite afin de me dépanner. Je dispose d'un fichier excel composé d'une 50e de ligne dont je souhaiterais effectuer une macro vba constitué d'une commande conditionnel sur l'une des colonnes de mon tableau (exemple sur la colonne E du fichier que je vais essayer de mettre en pièce jointe).
Mon objectif : SI le texte dans la colonne E = A ALORS copier la ligne entière et me l'inclure dans la feuil1 SINON ne pas l'inclure dans la feuil1.
Sur votre forum, j'ai réussit à retrouver un sujet quasiment similaire à ma demande : https://forum.tomshardware.fr/threads/copier-coller-ligne-complète-si-une-condition-est-respectée.895999/page-5
Par contre celà ne marche pas dans mon cas (sur la feuil 1 figure uniquement la colonne E et pas les lignes dont le fournisseur est A + en prime un message d'erreur est affiché). Ci-dessous ma macro modifiée:
Code:
Sub test()

    Dim cel As Range
    Dim source As Range
    Dim destination As Range

    Worksheets("feuil1").UsedRange.Clear
    Set destination = Worksheets("feuil1").Range("B3")
    Sheets("TOUS").Range("E6:E96").Copy destination
    Set destination = destination.Offset(1, 0)

    With Sheets("TOUS")
        For Each cel In .Range("g3:g" & .Range("g" & .Rows.Count).End(xlUp).Row)
            If cel.MergeCells Then
                If source Is Nothing Then
                    Set source = cel.MergeArea.EntireRow
                Else
                    Set source = Union(source, cel.MergeArea.EntireRow)
                End If
            ElseIf cel.Value = "A" Then
                If source Is Nothing Then
                    Set source = cel.EntireRow
                Else
                    Set source = Union(source, cel.EntireRow)
                End If
            End If
         Next
    End With

    source.Copy destination
    Worksheets("TOUS").Activate
    Worksheets("TOUS").Range("A1").Select

End Sub

PS : le fichier .xlsm n'est pas autorisé en pièce jointe
 
Dernière édition par un modérateur:

drul

Obscur pro du hardware
Staff
Euh c'est un forum, on est pas aussi rapide que ça. je regarde demain.
et non pas de macro en échange
une image de ton fichier est la bienvenue par contre.
 
Dernière édition:

drul

Obscur pro du hardware
Staff
Bon question 1:
- as-tu des cellules fusionnées ?

Ensuite l'approche faite ici impliquait une copie unique des données, mais cela pose souvent problème, pour plus de simplicité, copier ligne à ligne.
 

MONADESIGN

Nouveau membre
Bonjour à tous,

Je vous sollicite car je fais face à un point bloquant sur un code que je mets en place pour mon fichier de suivi des commandes.
J'ai créé un Userform que je vais utiliser comme menu qui me permettra à la création d'un bon de commande d'insérer les dates des visas des différents acteurs de la chaine exécution de la commande. Tout ce que j'ai écrit fonctionne, je renseigne les dates au fur et à mesure de l'avancement du bon de commande.
J'ai cependant trouvé une faille. C'est pour le calcul des délais... Dans le fichier Excel, les cellules de la colonne "DV" contiennent une formule, (=DT1-DL1 ... =DT423-DL425 etc), c'est en fait la différence entre deux dates qui me donne la durée de traitement. Même chose avec la colonne "EE"...
Lorsque je dois apporter une modification (suite à une erreur par exemple), je vais donc ouvrir mon Userform, selectionner le BC qui m'interesse. Les dates vont apparaitre respectivement dans les TextBox associées. Si je modifie quelconque date, mais plus particulièrement une date ayant une influence sur mes formules, et bien à l'exécution de la modification (une fois que je valide en appuyant sur le CommandButton "modifier"), ce sont les données contenues dans les TextBox qui vont être renvoyée dans les cellules de mon fichier Excel. Pour les dates, pas de soucis, c'est même le but recherché. Par contre, les chiffres (résultats des formules qui figurent dans les Textbox des délais) vont être reportés dans les cellules Excel (DV et/ou EE) en écrasant la formule présente... Ce qui est donc problèmatique car si une date doit changer, et faire évoluer ce délai, il ne bougera pas du fait qu'il n'y a plus de formule...

En résumé, je présume, au niveau des "range" pour les range "DV et EE" il faut modifier le code car actuellement avec "Value" c'est la valeur qui est renvoyée. Un code qui permet d'exécuter la formule "DT-DL" au lieu de reporter son résultat.

J'espère que j'ai été assez clair, désolé si ce n'est pas le cas et n'hésitez pas à me demander de clarifier ce qui mérite de l'être.

Dans l'attente d'une / des réponse(s) , belle journée à vous tous.

François

Code entier :
 

Fichiers joints

  • MENU.png
    MENU.png
    35.7 KB · Affichages: 3
Dernière édition:

MONADESIGN

Nouveau membre
Code:
Option Explicit

Dim Ws As Worksheet

Private Sub Label3_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub TextBox11_Change()

End Sub

'Pour le formulaire

Private Sub UserForm_Initialize()

Dim J As Long
Dim I As Integer

Set Ws = Sheets("BC") 'Correspond au nom de l'onglet dans le fichier Excel

With Me.ComboBox1

    For J = 1 To Ws.Range("H" & Rows.Count).End(xlUp).Row
       .AddItem Ws.Range("H" & J)
    Next J

End With

For I = 1 To 20
     Me.Controls("TextBox" & I).Visible = True
Next I

End Sub

'Pour la liste déroulante BC

Private Sub ComboBox1_Change()

Dim Ligne As Long
Dim I As Integer

If Me.ComboBox1.ListIndex = -1 Then Exit Sub

  Ligne = Me.ComboBox1.ListIndex + 1

  For I = 1 To 20
     Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 115)
  Next I

End Sub

'Pour le bouton Nouveau bon de commande

Private Sub CommandButton1_Click()

Dim L As Integer

If MsgBox("Confirmez-vous l'insertion d'un nouveau BC ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
     L = Sheets("BC").Range("h1048576").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau vide

     Range("H" & L).Value = ComboBox1
     Range("F" & L).Value = ComboBox2
     Range("DL" & L).Value = TextBox1
     Range("DM" & L).Value = TextBox2
     Range("DN" & L).Value = TextBox3
     Range("DO" & L).Value = TextBox4
     Range("DP" & L).Value = TextBox5
     Range("DQ" & L).Value = TextBox6
     Range("DR" & L).Value = TextBox7
     Range("DS" & L).Value = TextBox8
     Range("DT" & L).Value = TextBox9
     Range("DU" & L).Value = TextBox10
     Range("DV" & L).Value = TextBox11
     Range("DW" & L).Value = TextBox12
     Range("DX" & L).Value = TextBox13
     Range("DY" & L).Value = TextBox14
     Range("DZ" & L).Value = TextBox15
     Range("EA" & L).Value = TextBox16
     Range("EB" & L).Value = TextBox17
     Range("EC" & L).Value = TextBox18
     Range("ED" & L).Value = TextBox19
     Range("EE" & L).Value = TextBox20
End If

End Sub

'Pour le bouton Modifier

Private Sub CommandButton2_Click()

Dim Ligne As Long
Dim I As Integer

   If MsgBox("Confirmez-vous les modifications apportées ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
     If Me.ComboBox1.ListIndex = -1 Then Exit Sub

         Ligne = Me.ComboBox1.ListIndex + 1
       
     For I = 1 To 20
         If Me.Controls("TextBox" & I).Visible = True Then
            Ws.Cells(Ligne, I + 115) = Me.Controls("TextBox" & I)
         End If
     Next I
   End If

End Sub

'Pour le bouton Quitter

Private Sub CommandButton3_Click()

   Unload Me

End Sub
 

drul

Obscur pro du hardware
Staff
Le plus simple serait juste de ne pas mettre les delais dans ta userform, puisqu'il sont calculer automatiquement, ou sinon tu dois écrire via "formula" et pas via via "value"

dans le genre:
Code:
Range("A1").Formula = "=B1 + B2"
 

MONADESIGN

Nouveau membre
Le plus simple serait juste de ne pas mettre les delais dans ta userform, puisqu'il sont calculer automatiquement, ou sinon tu dois écrire via "formula" et pas via via "value"

dans le genre:
Code:
Range("A1").Formula = "=B1 + B2"

Effectivement ce serait plus simple 😅 mais je veux avoir l’information en visu « rapide » sur le userform.
Maintenant je pensais, si on enlève le range des délais. Peut être en mettant un code en dessous qui va chercher en tant réel le résultat et l’affiche sur le userform, sans qu’il n’agisse lorsque je fais une modification. En gros, un peu comme si on faisait un =C154 (report d’info d’une cellule dans une autre) sauf que la ce serait report de la cellule dans le userform
 

MONADESIGN

Nouveau membre
Effectivement ce serait plus simple 😅 mais je veux avoir l’information en visu « rapide » sur le userform.
Maintenant je pensais, si on enlève le range des délais. Peut être en mettant un code en dessous qui va chercher en tant réel le résultat et l’affiche sur le userform, sans qu’il n’agisse lorsque je fais une modification. En gros, un peu comme si on faisait un =C154 (report d’info d’une cellule dans une autre) sauf que la ce serait report de la cellule dans le userform

j’avais essayé avec formula, mais cela ne fonctionne pas. J’ai le résultat qui s’affiche dans le userform et ce même résultat qui se reporte et écrase la cellule lorsque je fais une modification.
 

drul

Obscur pro du hardware
Staff
Ben à l'init et tu vas lire la valeur ...
dans:
Private Sub UserForm_Initialize()

un truc du genre: textbox_xx.value = Range(A1).Value
 

MONADESIGN

Nouveau membre
Ben à l'init et tu vas lire la valeur ...
dans:
Private Sub UserForm_Initialize()

un truc du genre: textbox_xx.value = Range(A1).Value

Bonjour,
Je comprends, mais la valeur recherchée change en fonction de la ligne que je sélectionne, elle n'est jamais la même.
Par exemple, si je sélectionne le BC 451 qui est à la ligne 430, il faut aller rechercher la valeur en "DV430" / Si BC 23 qui est à la ligne 15, il faut aller rechercher la valeur en "DV15" etc
 

MONADESIGN

Nouveau membre
Je viens également de me rendre compte de qqch.
Lorsque je souhaite changer une date et faire modifier (le suivi par date des BC se fait des colonnes DL à EE)
le code

Code:
'Pour le bouton Modifier

Private Sub CommandButton2_Click()

Dim Ligne As Long
Dim I As Integer

   If MsgBox("Confirmez-vous les modifications apportées ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
     If Me.ComboBox1.ListIndex = -1 Then Exit Sub

         Ligne = Me.ComboBox1.ListIndex + 1
        
     For I = 1 To 20
         If Me.Controls("TextBox" & I).Visible = True Then
            Ws.Cells(Ligne, I + 115) = Me.Controls("TextBox" & I)
         End If
     Next I
   End If

End Sub
Selection.row ...


Merci de ton aide, cependant je ne suis pas un expert en code VBA, je débute. Je n'arrive donc pas à voir comment écrire ce code...
 

drul

Obscur pro du hardware
Staff
Je part en vacances, désolé, mais je ne pourrai pas suivre correctement ton projet :/
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 055
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut