boucle if & macro
Dernière réponse : dans Programmation
bonjour
Je souhaite faire une synthèse de résulat avec exel. (je débute dans l'utilisation de macro !!)
Je m'explique : j'ai un onglet qui renseigne une personne et son nombre de jour travaillé
j'ai un autre onglet qui calcul son salaire (brut et net) avec le detail des retenus.
Faire un bouton pour que, une fois qu'on a remplis le nombre de jour, le salaire brut et net s'affiche dans les case voisine des lors qu'on appuis sur le bouton. l'avantage est ne pas surcharger une feuille.
Mon problème, est que je voudrais généralisé... si j'ai plusieurs personnes....
Donc j'ai mis une boucle if. La cellule Bn represente le nombre de jour travaillé par l'opérateur en ligne n.
mais voila...cela ne marche pas !
Quelqu'un pourrai-t-il m'aider ?
voici :
j'espère que je m'embrouille pas trop...
Je souhaite faire une synthèse de résulat avec exel. (je débute dans l'utilisation de macro !!)
Je m'explique : j'ai un onglet qui renseigne une personne et son nombre de jour travaillé
j'ai un autre onglet qui calcul son salaire (brut et net) avec le detail des retenus.
Faire un bouton pour que, une fois qu'on a remplis le nombre de jour, le salaire brut et net s'affiche dans les case voisine des lors qu'on appuis sur le bouton. l'avantage est ne pas surcharger une feuille.
Mon problème, est que je voudrais généralisé... si j'ai plusieurs personnes....
Donc j'ai mis une boucle if. La cellule Bn represente le nombre de jour travaillé par l'opérateur en ligne n.
mais voila...cela ne marche pas !
Quelqu'un pourrai-t-il m'aider ?
voici :
Sub Macro()
n = 2
If Cells(B, n).Values = 0
Else: Range(Cells(B, n)).Select
Selection.Copy
Sheets("detail paye").Select
Range("B4").Select
ActiveSheet.Paste
Range("B6").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("sommaire").Select
Range(Cells(B, n)).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Sheets("detail paye").Select
Range("B10").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("sommaire").Select
Range(Cells(B, n)).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
n = n + 1
End If
End Sub
j'espère que je m'embrouille pas trop...
Autres pages sur : boucle macro
Lassé par la pub ? Créez un compte
Qu'est-ce qu'une "boucle if" ?
Beurk. Quel code horrible.
Heureusement que tu précises que tu es novice.
Si je ne l'ai pas dit 100 fois sur ce site, je ne l'ai jamais dit :
PAS DE SELECT/SELECTION
(Au lieu de Truc.Select / Selection.Machin, écrire directement Truc.Machin)
PAS DE COPY/PASTE/CUTCOPYMODE=OFF
(Utiliser Copy Destination:=...)
Il n'y a pas de clause ALORS dans ton SI mais il y a une clause SINON. Donc inverse la clause de test. (L3)
Range et Cells renvoient tous deux un objet Range. Pas besoin de les imbriquer (L3)
Tu changes la page courante (L6, 12, 16, 20). Bref, au début, faut pas se tromper de feuille au départ. De toute façon, ce n'est pas beau. Au lieu de ça, indique pour chaque Range ou chaque Cells la feuille d'appartenance.
Je réécris ton code sans les SELECT/SELECTION/ACTIVETRUC et en précisant quelles cellules de quelles feuilles je considère :
Lignes 5 et 6, je me dis qu'il y a un problème d'inversion des feuilles.
Où est définie la variable B ? Que contient-elle ?
Pourquoi la ligne 16 ?
Je réécris ton code sans les COPY/PASTE, en faisant l'inversion pour les lignes 5 et 6 précédentes et en considérant que la feuille de départ est le sommaire :
Bon, en fait tu écris tout dans la même cellule B x n. Spa normal
Beurk. Quel code horrible.
Heureusement que tu précises que tu es novice.
Si je ne l'ai pas dit 100 fois sur ce site, je ne l'ai jamais dit :
(Au lieu de Truc.Select / Selection.Machin, écrire directement Truc.Machin)
(Utiliser Copy Destination:=...)
Il n'y a pas de clause ALORS dans ton SI mais il y a une clause SINON. Donc inverse la clause de test. (L3)
Range et Cells renvoient tous deux un objet Range. Pas besoin de les imbriquer (L3)
Tu changes la page courante (L6, 12, 16, 20). Bref, au début, faut pas se tromper de feuille au départ. De toute façon, ce n'est pas beau. Au lieu de ça, indique pour chaque Range ou chaque Cells la feuille d'appartenance.
Je réécris ton code sans les SELECT/SELECTION/ACTIVETRUC et en précisant quelles cellules de quelles feuilles je considère :
Sub Macro() n = 2 If Sheets("feuille indéterminée" ).Cells(B, n).Values <> 0 Then Sheets("feuille indéterminée" ).Cells(B, n).Copy Sheets("detail paye" ).Range("B4" ).Paste Sheets("detail paye" ).Range("B6" ).Copy Sheets("sommaire" ).Cells(B, n).PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Sheets("detail paye" ).Range("B10" ).Copy Sheets("sommaire" ).Cells(B, n).PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False n = n + 1 End If End Sub
Lignes 5 et 6, je me dis qu'il y a un problème d'inversion des feuilles.
Où est définie la variable B ? Que contient-elle ?
Pourquoi la ligne 16 ?
Je réécris ton code sans les COPY/PASTE, en faisant l'inversion pour les lignes 5 et 6 précédentes et en considérant que la feuille de départ est le sommaire :
Sub Macro() n = 2 If Sheets("sommaire" ).Cells(B, n).Value <> 0 Then Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B4" ) Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B6" ) Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B10" ) End If End Sub
Bon, en fait tu écris tout dans la même cellule B x n. Spa normal
Merci pour cette correction...
J'ai modifié les nom de cellule et j'ai rajouté des ".Value" pour les cellules ou je voulais avoir que la valeur et non la formule.
J'ai toujours (je l'avais aussi avant) une "erreur 1004" qui serais dans la 3ème ligne
dans chacune des cellules, il y a un chiffre. Disons que je prends une information dans la case BN du sommaire, je l'envoie dans la cellule B4 du "detail paye", puis je reprends les informations des cellules du "detail paye" pour les ramener dans le sommaire.
J'ai modifié les nom de cellule et j'ai rajouté des ".Value" pour les cellules ou je voulais avoir que la valeur et non la formule.
J'ai toujours (je l'avais aussi avant) une "erreur 1004" qui serais dans la 3ème ligne
Sub Macro9() n = 2 If Sheets("sommaire").Cells(B, n).Value s /*<-- parasite!*/ <> 0 Then Sheets("detail paye").Range("B4") = Sheets("sommaire").Cells(B, n) Sheets("sommaire").Cells(C, n) = Sheets("detail paye").Range("B6").Values Sheets("sommaire").Cells(D, n) = Sheets("detail paye").Range("B10").Values n=n+1 End If End Sub
dans chacune des cellules, il y a un chiffre. Disons que je prends une information dans la case BN du sommaire, je l'envoie dans la cellule B4 du "detail paye", puis je reprends les informations des cellules du "detail paye" pour les ramener dans le sommaire.
pour moi, une boucle if est en fait "if..then...endif"
Cells(B,n), c'est la cellule Bn de mon tableau... Cette case de mon tableau est déjà remplie. Elle contient déjà un chiffre...
La ligne 7, c'est pour dire qu'une fois les opérations fini, on recommence l'operation... l'opération faites sur la cellule B2, on la recommence avec B3 jusqu'à avoir une valeur Bn=0 (ou neant ?).. c'est dailleur peut etre la mon problème...
mais je ne sais pas....
mais même en enlevant la ligne 7, mon programme ne marche pas.
Cells(B,n), c'est la cellule Bn de mon tableau... Cette case de mon tableau est déjà remplie. Elle contient déjà un chiffre...
La ligne 7, c'est pour dire qu'une fois les opérations fini, on recommence l'operation... l'opération faites sur la cellule B2, on la recommence avec B3 jusqu'à avoir une valeur Bn=0 (ou neant ?).. c'est dailleur peut etre la mon problème...
mais je ne sais pas....
mais même en enlevant la ligne 7, mon programme ne marche pas.
Citation :
pour moi, une boucle if est en fait "if..then...endif" Spa une boucle, c'est une "condition de branchement"
Citation :
Cells(B,n), c'est la cellule BnBen non. Non, et re-non. Relis l'aide de Cells. Attention à l'ordre des paramètres (Ligne, Colonne) et B n'est pas un nom de colonne mais une variable que tu n'as pas initialisée. Je suppose que tu as oublié de mettre l'option explicit. C'est mal. (Voir l'aide d'excel sur le mot Option).
La line 4, tu es sûr de ne pas avoir inversé les noms de feuilles !
La ligne 7 !
Mais où vois-tu la boucle pour faire remonter ton programme à la ligne 2 ? C'est sans doute ça ton problème.
En français, tu veux faire :
n = 2
Tant Que la cellule (n, 2) n'est pas vide Faire
La cellule (n, 2) de la feuille "sommaire" reçoit la valeur de la cellule B4 de la feuille "detail"
La cellule (n, 3) de la feuille "sommaire" reçoit la valeur de la cellule B6 de la feuille "detail"
La cellule (n, 4) de la feuille "sommaire" reçoit la valeur de la cellule B10 de la feuille "detail"
Incrémenter n de 1
Fin Tant Que
YAPLUKA traduire ça en VB
zeb a dit :
Citation :
pour moi, une boucle if est en fait "if..then...endif" Spa une boucle, c'est une "condition de branchement"
Citation :
Cells(B,n), c'est la cellule BnBen non. Non, et re-non. Relis l'aide de Cells. Attention à l'ordre des paramètres (Ligne, Colonne) et B n'est pas un nom de colonne mais une variable que tu n'as pas initialisée. Je suppose que tu as oublié de mettre l'option explicit. C'est mal. (Voir l'aide d'excel sur le mot Option).
La line 4, tu es sûr de ne pas avoir inversé les noms de feuilles !
La ligne 7 !
Mais où vois-tu la boucle pour faire remonter ton programme à la ligne 2 ? C'est sans doute ça ton problème.
En français, tu veux faire :
n = 2
Tant Que la cellule (n, 2) n'est pas vide Faire
La cellule (n, 2) de la feuille "sommaire" reçoit la valeur de la cellule B4 de la feuille "detail"
La cellule (n, 3) de la feuille "sommaire" reçoit la valeur de la cellule B6 de la feuille "detail"
La cellule (n, 4) de la feuille "sommaire" reçoit la valeur de la cellule B10 de la feuille "detail"
Incrémenter n de 1
Fin Tant Que
YAPLUKA traduire ça en VB
n = 2
Do While Sheets("sommaire" ).Cells(B, n).Values <> 0
Sheets("detail paye" ).Range("B4" ) = Sheets("sommaire" ).Cells(B, n)
Sheets("sommaire" ).Cells(C, n) = Sheets("detail paye" ).Range("B6" ).Values
Sheets("sommaire" ).Cells(D, n) = Sheets("detail paye" ).Range("B10" ).Values
n=n+1
loop
EDIT: Bordel je suis rouillé en VBA / Macro... j'ai mis next
Je n'y arrive toujours pas !!
pour reprendre ce que je veux faire en français :
n = 2
Tant Que la cellule (n, 2) n'est pas vide Faire
La cellule B4 de la feuille "detail" reçoit la valeur de la cellule (n, 2) de la feuille "sommaire"
La cellule (n, 3) de la feuille "sommaire" reçoit la valeur de la cellule B6 de la feuille "detail"
La cellule (n, 4) de la feuille "sommaire" reçoit la valeur de la cellule B10 de la feuille "detail"
Incrémenter n de 1
Fin Tant Que
je définis mes objets :
cellule (n,2) signifie la cellule B n
cellule (n, 2) de la feuille "sommaire" = chiffre
cellule B6 de la feuille "detail" = formule (donc je veux que le chiffre resultant, d'ou le ".Values")
cellule B10 de la feuille "detail" = (donc je veux que le chiffre resultant, d'ou le ".Values")
voici le code :
pour reprendre ce que je veux faire en français :
n = 2
Tant Que la cellule (n, 2) n'est pas vide Faire
La cellule B4 de la feuille "detail" reçoit la valeur de la cellule (n, 2) de la feuille "sommaire"
La cellule (n, 3) de la feuille "sommaire" reçoit la valeur de la cellule B6 de la feuille "detail"
La cellule (n, 4) de la feuille "sommaire" reçoit la valeur de la cellule B10 de la feuille "detail"
Incrémenter n de 1
Fin Tant Que
je définis mes objets :
cellule (n,2) signifie la cellule B n
cellule (n, 2) de la feuille "sommaire" = chiffre
cellule B6 de la feuille "detail" = formule (donc je veux que le chiffre resultant, d'ou le ".Values")
cellule B10 de la feuille "detail" = (donc je veux que le chiffre resultant, d'ou le ".Values")
voici le code :
n = 2
Do While Sheets("sommaire").Cells(n, 2) <> 0
Sheets("detail paye").Range("B4") = Sheets("sommaire").Cells(n, 2)
Sheets("sommaire").Cells(n, 3) = Sheets("detail paye").Range("B6").Values
Sheets("sommaire").Cells(n, 4) = Sheets("detail paye").Range("B10").Values
n = n + 1
Loop
Réponds à toutes les questions s'il te plaît !
J'insiste : A la ligne 4, es-tu sûr de ne pas avoir inversé les noms des feuilles ?
Bon, alors. Un S parasite s'est glissé quelque part. (Et le pire, c'est que c'est moi qui l'ai mis
) En fait, c'est LA valeur, donc il faut écrire VALUE sans s à la fin.
Ca va mieux comme ça ?
J'insiste : A la ligne 4, es-tu sûr de ne pas avoir inversé les noms des feuilles ?
Bon, alors. Un S parasite s'est glissé quelque part. (Et le pire, c'est que c'est moi qui l'ai mis
) En fait, c'est LA valeur, donc il faut écrire VALUE sans s à la fin.Ca va mieux comme ça ?
De rien.
Supplément gratuit :
Cells renvoie une seule cellule dont on précise les coordonnées avec des entiers. C'est ce dont tu avais besoin.
Range renvoie une plage de cellules dont on précise les coordonnées avec une chaîne de caractère plus facile à comprendre. Mais une plage de cellules peut se réduire à une seule cellule. Un singleton en langage ensembliste (aimes-tu les maths ?
)
Cells (n, 2) c'est la cellule Bn. Pour construire cette chaîne, on peut écrire :
Exemple :
Par ailleurs, Sheets est la collection de tous les onglets d'un classeur. Par principe, tu ne considères que les feuilles de calcul, un sous-ensemble des onglets. La collection des feuille de calcul est Worksheets.
Ton code revu et corrigé :
Ne trouves-tu pas ça un peu lourd de te traîner ses WorkSheets tout du long. Etudie-ça si tu veux bien :
Reviens avec tes questions quand tu veux.
Supplément gratuit :
Cells renvoie une seule cellule dont on précise les coordonnées avec des entiers. C'est ce dont tu avais besoin.
Range renvoie une plage de cellules dont on précise les coordonnées avec une chaîne de caractère plus facile à comprendre. Mais une plage de cellules peut se réduire à une seule cellule. Un singleton en langage ensembliste (aimes-tu les maths ?
)Cells (n, 2) c'est la cellule Bn. Pour construire cette chaîne, on peut écrire :
"B" & n
Exemple :
n = 2 Do While Sheets("sommaire" ).Cells(n, 2) <> 0 Sheets("detail paye" ).Range("B4" ) = Sheets("sommaire" ).Range("B" & n).Value Sheets("sommaire" ).Range("C" & n) = Sheets("detail paye" ).Range("B6" ).Value Sheets("sommaire" ).Cells("D" & n) = Sheets("detail paye" ).Range("B10" ).Value n = n + 1 Loop
Par ailleurs, Sheets est la collection de tous les onglets d'un classeur. Par principe, tu ne considères que les feuilles de calcul, un sous-ensemble des onglets. La collection des feuille de calcul est Worksheets.
Ton code revu et corrigé :
n = 2 Do While WorkSheets("sommaire" ).Cells(n, 2) <> 0 WorkSheets("detail paye" ).Range("B4" ) = WorkSheets("sommaire" ).Range("B" & n).Value WorkSheets("sommaire" ).Range("C" & n) = WorkSheets("detail paye" ).Range("B6" ).Value WorkSheets("sommaire" ).Cells("D" & n) = WorkSheets("detail paye" ).Range("B10" ).Value n = n + 1 Loop
Ne trouves-tu pas ça un peu lourd de te traîner ses WorkSheets tout du long. Etudie-ça si tu veux bien :
Dim som As WorkSheet Dim det As WorkSheet Set som = WorkSheets("sommaire" ) Set det = WorkSheets("detail paye" ) n = 2 Do While som.Cells(n, 2) <> 0 det.Range("B4" ) = som.Range("B" & n).Value som.Range("C" & n) = det.Range("B6" ).Value som.Cells("D" & n) = det.Range("B10" ).Value n = n + 1 Loop
Reviens avec tes questions quand tu veux.
Bien sûr : http://www.presence-pc.com/forum/ppc/Programmation/vous...
Si lors de tes périgrinations sur le net tu trouves un excellent tuto, n'hésite pas à nous en faire part.
Si lors de tes périgrinations sur le net tu trouves un excellent tuto, n'hésite pas à nous en faire part.
Lassé par la pub ? Créez un compte