Boucle For et avec conditon simple
Bonjour à tous
Novice en VBA je pensais que mon niveau actuel me permettrait de réaliser la condition suivant "if_else" au sein d'une boucle for, bien mal embarqué j'en appel à un petit coup de pouce
Mon exercice est le suivant, j'ai trois feuilles :
- Une première feuille : "Production" qui est la feuille dans laquelle je désire récupérer les données pour pouvoir les traiter
- Une seconde feuille : "Pricer production" qui importe les données de la première et les retraite sous conditions en cellule E5
- UNe troisième feuille : "DonneesProduction" qui compile les conditions que j'utilise pour le traitement de mes données dans la feuille n°2
Venons en à ce que je désire faire :
Dans la feuille "Pricer production" je souhaite traiter les données se trouvant dans la feuille "Production" sous conditions. A savoir un peu sur le même modèle qu'une formule SQL SI(ET je souhaite en cellule E5 importer les données de la cellule "Production" cellule (8, 9) et les diviser par 1000 soit Sheets("Production").Cells(j, 9) /1000. Vous l'aurez compris afin de pouvor étirer mon calcul à l'ensemble des lignes de ma colonne 9 je déclare une boucle "for" j = 2 to 50 en début de code sur la feuille "Production" et fait de même sur la feuille "Pricer production" grâce à une boucle for i = 4 to 50.
Ca se complique un peu quand j'y ajoute mes conditions "VRAI" ou "FAUX" déterminées dans ma feuille "DonneesProduction" compris entre les cellules B40 à B48. Les conditions doivent permettre d'effectuer ce calcul uniquement si elles sont respectées.
Pressé d'avoir une petite aide afin de mieux comprendre mon erreur je vous mets ci dessous le code que j'ai pour le moment écrit :
EN vous remerciant toutes et tous pour votre aide précieuse.
Private Sub hydro_Click()
Dim i As Integer
Dim j As Integer
For i = 4 To 50
For j = 2 To 50
If Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "VRAI" And Sheets("DonneesProduction").Cells(2, 48).Value = "FAUX" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
ElseIf Sheets("DonneesProduction").Cells(3, 40).Value = 1 And Sheets("DonneesProduction").Cells(2, 40).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 41).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 42).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 43).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 44).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 45).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 46).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 47).Value = "FAUX" And Sheets("DonneesProduction").Cells(2, 48).Value = "VRAI" Then
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 3
Else
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * 10^ - 6
End If
Next j
Next i
End SubBonjour,
de la manière dont tu as imbriqué tes boucles, tes cellules en colonne D4 à D50 recevront la valeur de I50 divisé par 1e-3 ou par 1e-6. Je ne pense pas que ce soit ce que tu cherches. Si tu cherches à mettre en colonne(D) la valeur de la colonne(I) divisée par 0.001 ou 0.000001 et ceci sur les lignes 4 à 50. en simplifiant tes tests, voici
Private Sub hydro_Click()
Dim i As Integer,plage,asum
Set plage = Sheets("DonneesProduction").Cells(2, 40).Resize(1, 9)
asum = Application.WorksheetFunction.CountIf(plage, "VRAI") 'on compte le nombre de VRAI dans la plage AN2:AV2
If Sheets("DonneesProduction").Cells(3, 40) = 1 And asum = 1 Then coef = 0.001 Else coef = 0.000001
For i = 4 To 50
Sheets("Pricer_production").Cells(i, 4).Value = Sheets("Production").Cells(i, 9) * coef
Next i
End Sub- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Bonjour,
J'avais écrit sensiblement la même chose vers 18h40 mais n'avais que peu de réseau et apparemment ce n'est pas passé.
Je précisais qu'il me semblait bien que la cellule B40 est cells(40,2) et non pas
Cells(2,40)
Bonsoir JoyeuxNoel
Je précisais qu'il me semblait bien que la cellule B40 est cells(40,2) et non pas
Cells(2,40)
Bien vu, je n'avais pas remarqué. Il faudra donc adapter le code en fonction des adresses qui vont bien.
Bonjour à tous.
Tout d'abord je vous remercie pour votre aide sur ce sujet. Effecivement dans un premier temps je me suis trompé sur les variables à déclarer en inversant colonnes et lignes. Secondement si je comprends le code dans son ensemble,et qu'il fonctionne plutôt comme je désire, je ne comprends pas la fonction "resize" utilisée. Pouvez vos me l'expliquer afin de la réutiliser ultérieurement.
Merci à tous les deux
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Bonjour,
Je réponds vite fait avant que h2so4 ne vienne confirmer/infirmer/rectifier
Maintenant que tu as en tête que c'est cells(ligne, colonne),
Plage = B40
Puis on redimensionne (resize) plage pour qu'elle fasse 1 colonne et 9 lignes. Donc de B40 à B49.
Je ne maîtrise pas autant que h2so4, mais j'imagine que vu l'exemple, 8 suffisait.
On aurait aussi pu mettre directement plage = range("B40:B48"), voire même ne pas passer par des variables. Ça aurait été plus simple ici pour la compréhension.
Mais ce code de h2so4 est beaucoup plus évolutif et dans beaucoup de contextes se révélera plus performant.
Bonjour,
edit : je vois que JoyeuxNoel (que je salue) t'a déjà répondu. (ps : de B40 à B48, il y a bien 9 lignes et donc resize(8,1) ne prend pas B48)
l'idée est compter le nombre de VRAI qui se trouvent dans la plage de cellule B40:B48
Pour définir la plage, plusieurs façon de faire. A la lumière des derniers éléments que tu as fournis, le plus simple
set plage=Sheets("DonneesProduction").range("B40:B48")
plus compliqué avec resize et range
Sheets("DonneesProduction").range("B40").Resize(9,1) 'on définit la plage comme partant de la cellule B40 sur 9 lignes et 1 colonne
avec resize et cells
Sheets("DonneesProduction").Cells(40, 2).Resize(9, 1)
Merci pour ces explications h2so4, cependant je viens de m'apercevoir d'un léger problème.
En effet dans le code que tu m'as fait parvenir il y a une boucle for i = 4 to 50 qui fonctionne sur deux feuilles distinctes à savoir "Pricer production" et "Production" cependant les deux feuilles ne commencent pas à la même cellule. La feuillle pricer production débute bien en ligne 4 alors que la feuille "Production" débute en ligne 2. Pour corriger cela j'ai créer une seconde boucle for avec j, et ca ne marche pas non plus, en effet la boucle prend la dernière valeur de la feuille "Production" et applique le résultat à toutes les cases précedentes. Comment faire, voici mon code qui ne fonctionne pas... (la même chose se passe si j'inverse l'ordre d'apparition des boucle for i et for j)
Merci par avance pour ta contribution
Private Sub hydro_Click()
Dim i As Integer, plage, asum
Set plage = Sheets("DonneesProduction").Cells(40, 2).Resize(9, 1)
asum = Application.WorksheetFunction.CountIf(plage, "VRAI") 'on compte le nombre de VRAI dans la plage AN2:AV2
If Sheets("DonneesProduction").Cells(40, 3) = 1 And asum = 1 Then coef = 0.001 Else coef = 0.000001
For j = 2 To 48
For i = 4 To 50
Sheets("Pricer production").Cells(i, 4).Value = Sheets("Production").Cells(j, 9) * coef
Next i
Next j
End Subbonjour,
pour ton cas la relation entre ton i et ton j est donnée par la formule suivante i=j+2, tu fais donc une simple boucle tu prends chaque ligne de production avec j et tu prends la ligne correspondante sur pricer production en ajoutant 2 à j.
Private Sub hydro_Click()
Dim i As Integer, plage, asum
Set plage = Sheets("DonneesProduction").Cells(40, 2).Resize(9, 1)
asum = Application.WorksheetFunction.CountIf(plage, "VRAI") 'on compte le nombre de VRAI dans la plage B40:B48
If Sheets("DonneesProduction").Cells(40, 3) = 1 And asum = 1 Then coef = 0.001 Else coef = 0.000001
For j = 2 To 48
Sheets("Pricer production").Cells(j+2, 4).Value = Sheets("Production").Cells(j, 9) * coef
Next j
End SubMerci pour votre aide, j'ai pu adapter mon code pour les différentes conditions !