Votre question
Résolu

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

Tags :
  • VBA
  • Programmation
  • Microsoft Excel
  • Macro excel
  • If/for
  • Condition
Dernière réponse : dans Programmation
9 Août 2016 14:59:31

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 :
"Créer une macro spéciale dans Excel"

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 :
  1. Sub Actualisation()
  2.  
  3. 'Definir les variables
  4.  
  5. Dim V_3X As Worksheet
  6. Dim MAY_EEE As Worksheet
  7. Dim A As Worksheet
  8.  
  9. Dim LigneV_3X As Long
  10. Dim LigneMAY_EEE As Long
  11.  
  12. Set V_3X = Worksheets("ER_V_FR_3X")
  13. Set MAY_EEE = Worksheets("ER_MAY_EEE")
  14. Set A = Worksheets("Analyse")
  15.  
  16. LigneV_3X = 2
  17. LigneMAY_EEE = 2
  18. LigneA = A.Range("E" & Rows.Count).End(xlUp).Row
  19. LigneA = LigneA + 1
  20.  
  21. 'Récupération des ligne à analyser
  22.  
  23. Last_Line = V_3X.Range("D" & Rows.Count).End(xlUp).Row
  24. LigneCheck = LigneA
  25. For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
  26. If Ligne.Cells(1, 14).Value > "0" Then
  27. If Ligne.Cells(1, 17).Value <= "0,2" Then
  28. Ligne.Copy
  29. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  30. :=False, Transpose:=False
  31. LigneA = LigneA + 1
  32. End If
  33. End If
  34. Next
  35.  
  36. If LigneCheck = LigneA Then
  37. For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
  38. If Ligne.Cells(1, 14).Value > "0" Then
  39. If Ligne.Cells(1, 16).Value <= "1" Then
  40. Ligne.Copy
  41. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  42. :=False, Transpose:=False
  43. LigneA = LigneA + 1
  44. End If
  45. End If
  46. Next
  47. End If
  48.  
  49. Last_Line = MAY_EEE.Range("D" & Rows.Count).End(xlUp).Row
  50. LigneCheck = LigneA
  51. For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
  52. If Ligne.Cells(1, 14).Value > "0" Then
  53. If Ligne.Cells(1, 17).Value <= "0,20" Then
  54. Ligne.Copy
  55. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  56. :=False, Transpose:=False
  57. LigneA = LigneA + 1
  58. End If
  59. End If
  60. Next
  61.  
  62. If LigneCheck = LigneA Then
  63. For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
  64. If Ligne.Cells(1, 14).Value > "0" Then
  65. If Ligne.Cells(1, 16).Value <= "1" Then
  66. Ligne.Copy
  67. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  68. :=False, Transpose:=False
  69. LigneA = LigneA + 1
  70. End If
  71. End If
  72. Next
  73. End If
  74.  
  75. End Sub


Pouvez-vous m'aider à comprendre ?

Autres pages sur : vba condition for renvoie valeurs

Meilleure solution

a c 75 L Programmation
9 Août 2016 15:20:17

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 ?
partage
a b L Programmation
9 Août 2016 17:06:26

+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".
m
0
l
Contenus similaires
Pas de réponse à votre question ? Demandez !
9 Août 2016 17:11:04

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 :

  1. Sub Actualisation()
  2.  
  3. 'Definir les variables
  4.  
  5. Dim V_3X As Worksheet
  6. Dim MAY_EEE As Worksheet
  7. Dim A As Worksheet
  8.  
  9. Dim LigneV_3X As Long
  10. Dim LigneMAY_EEE As Long
  11.  
  12. Set V_3X = Worksheets("ER_V_FR_3X")
  13. Set MAY_EEE = Worksheets("ER_MAY_EEE")
  14. Set A = Worksheets("Analyse")
  15.  
  16. LigneV_3X = 2
  17. LigneMAY_EEE = 2
  18. LigneA = A.Range("E" & Rows.Count).End(xlUp).Row
  19. LigneA = LigneA + 1
  20.  
  21. 'Récupération des ligne à analyser
  22.  
  23. Last_Line = V_3X.Range("D" & Rows.Count).End(xlUp).Row
  24. LigneCheck = LigneA
  25. For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
  26. If Ligne.Cells(1, 14).Value > 0 Then
  27. If Ligne.Cells(1, 17).Value <= 0.2 Then
  28. Ligne.Copy
  29. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  30. :=False, Transpose:=False
  31. LigneA = LigneA + 1
  32. End If
  33. End If
  34. Next
  35.  
  36. If LigneCheck = LigneA Then
  37. For Each Ligne In V_3X.Range("A2:Q" & Last_Line).Rows
  38. If Ligne.Cells(1, 14).Value > 0 Then
  39. If Ligne.Cells(1, 16).Value <= 1 Then
  40. Ligne.Copy
  41. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  42. :=False, Transpose:=False
  43. LigneA = LigneA + 1
  44. End If
  45. End If
  46. Next
  47. End If
  48.  
  49. Last_Line = MAY_EEE.Range("D" & Rows.Count).End(xlUp).Row
  50. LigneCheck = LigneA
  51. For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
  52. If Ligne.Cells(1, 14).Value > 0 Then
  53. If Ligne.Cells(1, 17).Value <= 0.2 Then
  54. Ligne.Copy
  55. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  56. :=False, Transpose:=False
  57. LigneA = LigneA + 1
  58. End If
  59. End If
  60. Next
  61.  
  62. If LigneCheck = LigneA Then
  63. For Each Ligne In MAY_EEE.Range("A2:Q" & Last_Line).Rows
  64. If Ligne.Cells(1, 14).Value > 0 Then
  65. If Ligne.Cells(1, 16).Value <= 1 Then
  66. Ligne.Copy
  67. A.Rows(LigneA).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  68. :=False, Transpose:=False
  69. LigneA = LigneA + 1
  70. End If
  71. End If
  72. Next
  73. End If
  74.  
  75. 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 ?
m
0
l
a c 75 L Programmation
9 Août 2016 18:15:00

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é.
m
0
l
a c 75 L Programmation
9 Août 2016 18:16:15

Mais c'est mal !
N.b très beau travail pour une première macro. Un grand bravo
m
0
l
a b L Programmation
9 Août 2016 23:21:45

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"!!!

m
0
l