Résolu VBA : Condition for/if <="0,2" ne renvoie pas les valeurs <"0,1"

  • Auteur de la discussion CoC0n49
  • Date de début

CoC0n49

Nouveau membre
Bonjours à tous,

Je cherche à faire une macro qui viens copier coller des ligne d'une feuille à une autre selon une condition.

Je me suis beaucoup aider de ce liens :
https://forum.tomshardware.fr/threads/cr%C3%A9er-une-macro-sp%C3%A9ciale-dans-excel.529302/

Ma condition est la suivante, pour chaque ligne de la feuille, regarder la valeur dans la colonne 17, si cette valeur est <= à 0,2 alors copier la ligne vers l'autre feuille.

Le soucis, c'est que pour une raison que j'ignore, les valeurs < à 0,1 répondent "false" à la condition <= à 0,2

Voici mon code :
Code:
Sub Actualisation()
    
'Definir les variables

    Dim V_3X As Worksheet
    Dim MAY_EEE As Worksheet
    Dim A As Worksheet

    Dim LigneV_3X As Long
    Dim LigneMAY_EEE As Long

    Set V_3X = Worksheets("ER_V_FR_3X")
    Set MAY_EEE = Worksheets("ER_MAY_EEE")
    Set A = Worksheets("Analyse")

    LigneV_3X = 2
    LigneMAY_EEE = 2
    LigneA = A.Range("E" & Rows.Count).End(xlUp).Row
    LigneA = LigneA + 1
    
'Récupération des ligne à analyser

    Last_Line = V_3X.Range("D" & Rows.Count).End(xlUp).Row
    LigneCheck = LigneA
    For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
        If Ligne.Cells(1, 14).Value > "0" Then
            If Ligne.Cells(1, 17).Value <= "0,2" Then
            Ligne.Copy
            A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            LigneA = LigneA + 1
            End If
        End If
    Next
    
    If LigneCheck = LigneA Then
        For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
            If Ligne.Cells(1, 14).Value > "0" Then
                If Ligne.Cells(1, 16).Value <= "1" Then
                Ligne.Copy
                A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                LigneA = LigneA + 1
                End If
            End If
        Next
    End If
    
    Last_Line = MAY_EEE.Range("D" & Rows.Count).End(xlUp).Row
    LigneCheck = LigneA
    For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
        If Ligne.Cells(1, 14).Value > "0" Then
            If Ligne.Cells(1, 17).Value <= "0,20" Then
            Ligne.Copy
            A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            LigneA = LigneA + 1
            End If
        End If
    Next

    If LigneCheck = LigneA Then
        For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
            If Ligne.Cells(1, 14).Value > "0" Then
                If Ligne.Cells(1, 16).Value <= "1" Then
                Ligne.Copy
                A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                LigneA = LigneA + 1
                End If
            End If
        Next
    End If

End Sub

Pouvez-vous m'aider à comprendre ?
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Salut,

mais pourquoi diable as-tu mis des "" sur toutes tes constantes de comparaisons ? (ça devient des strings là, plus des nombres)
Sous quelles formes sont stockées tes valeurs dans ta feuille ?
 

magellan

Modérâleur
Staff
+1.
Les comparaisons de chaines ne renvoient absolument pas la même chose que les comparaisons numériques! Donc, il faut traiter la donnée en numérique et non chaîne, donc les convertir pour en faire des valeurs. Là, vu que tu as de la virgule, cela va être du "réel" et pas de "l'entier".
 

CoC0n49

Nouveau membre
Salut drul,

Merci pour ton temps.

Trés juste, j'ai voulu l'écrire en français, du coup la virgule du 0,2 provoquait une erreur de compilation.

J'ai modifier le code en enlevant les guillement et en remplaçant les "," par des "."

Et tout fonctionne correctement.

Je me suis mis dans le VBA que depuis hier, j'ai encore beaucoup à voir avant de "maitriser" l'outil.

Voici le code modifier :

Code:
Sub Actualisation()
    
'Definir les variables

    Dim V_3X As Worksheet
    Dim MAY_EEE As Worksheet
    Dim A As Worksheet

    Dim LigneV_3X As Long
    Dim LigneMAY_EEE As Long

    Set V_3X = Worksheets("ER_V_FR_3X")
    Set MAY_EEE = Worksheets("ER_MAY_EEE")
    Set A = Worksheets("Analyse")

    LigneV_3X = 2
    LigneMAY_EEE = 2
    LigneA = A.Range("E" & Rows.Count).End(xlUp).Row
    LigneA = LigneA + 1
    
'Récupération des ligne à analyser

    Last_Line = V_3X.Range("D" & Rows.Count).End(xlUp).Row
    LigneCheck = LigneA
    For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
        If Ligne.Cells(1, 14).Value > 0 Then
            If Ligne.Cells(1, 17).Value <= 0.2 Then
            Ligne.Copy
            A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            LigneA = LigneA + 1
            End If
        End If
    Next
    
    If LigneCheck = LigneA Then
        For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
            If Ligne.Cells(1, 14).Value > 0 Then
                If Ligne.Cells(1, 16).Value <= 1 Then
                Ligne.Copy
                A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                LigneA = LigneA + 1
                End If
            End If
        Next
    End If
    
    Last_Line = MAY_EEE.Range("D" & Rows.Count).End(xlUp).Row
    LigneCheck = LigneA
    For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
        If Ligne.Cells(1, 14).Value > 0 Then
            If Ligne.Cells(1, 17).Value <= 0.2 Then
            Ligne.Copy
            A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            LigneA = LigneA + 1
            End If
        End If
    Next

    If LigneCheck = LigneA Then
        For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
            If Ligne.Cells(1, 14).Value > 0 Then
                If Ligne.Cells(1, 16).Value <= 1 Then
                Ligne.Copy
                A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                LigneA = LigneA + 1
                End If
            End If
        Next
    End If

End Sub

Question rapide avant de clôturer le sujet.
Quand tu dit que ça devient des strings, c'est que le fait de mettre les constantes entre "" ça revient à les considérer comme du texte et non des valeurs ?
 

drul

Obscur pro du hardware
Staff
Oui, mais disons que vba est plutôt permissifs en matière de type de données (il fait pas mal de type casting automatiquement), si tu avais mis "0.2" au lieu de"0,2" ça aurait fonctionné.
 

drul

Obscur pro du hardware
Staff
Mais c'est mal !
N.b très beau travail pour une première macro. Un grand bravo
 

magellan

Modérâleur
Staff
J'applaudis aussi. C'est méthodique, structuré et bien réfléchi. Tu as des bases en développement sur d'autres langages? Si tu es autodidacte là je dois applaudir encore plus, parce que généralement les gens s'effondrent dès la première condition "if/end if"!!!

[s:p/1lge]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 832
Membres
1 586 367
Dernier membre
ramkin
Partager cette page
Haut