FORUM Tom's Hardware » Programmation » Autre » boucle if & macro
 

boucle if & macro

Il y a 277 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : boucle if & macro
 
Plus d'informations

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 :  
 

Code :
  1. Sub Macro()
  2. n = 2
  3. If Cells(B, n).Values = 0
  4. Else: Range(Cells(B, n)).Select
  5.     Selection.Copy
  6.     Sheets("detail paye" ).Select
  7.     Range("B4" ).Select
  8.     ActiveSheet.Paste
  9.     Range("B6" ).Select
  10.     Application.CutCopyMode = False
  11.     Selection.Copy
  12.     Sheets("sommaire" ).Select
  13.     Range(Cells(B, n)).Select
  14.     Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
  15.         False, Transpose:=False
  16.     Sheets("detail paye" ).Select
  17.     Range("B10" ).Select
  18.     Application.CutCopyMode = False
  19.     Selection.Copy
  20.     Sheets("sommaire" ).Select
  21.     Range(Cells(B, n)).Select
  22.     Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
  23.         False, Transpose:=False
  24.     n = n + 1
  25. End If
  26. End Sub


 
j'espère que je m'embrouille pas trop...


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.

zeb
Profil : Modérateur libre
Plus d'informations

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 :

Code :
  1. Sub Macro()
  2.     n = 2
  3.     If Sheets("feuille indéterminée" ).Cells(B, n).Values <> 0 Then
  4.  
  5.         Sheets("feuille indéterminée" ).Cells(B, n).Copy
  6.         Sheets("detail paye" ).Range("B4" ).Paste
  7.  
  8.         Sheets("detail paye" ).Range("B6" ).Copy
  9.         Sheets("sommaire" ).Cells(B, n).PasteSpecial Paste:=xlValues, Operation:=xlNone, _
  10.                                                      SkipBlanks:=False, Transpose:=False
  11.  
  12.         Sheets("detail paye" ).Range("B10" ).Copy
  13.         Sheets("sommaire" ).Cells(B, n).PasteSpecial Paste:=xlValues, Operation:=xlNone, _
  14.                                                      SkipBlanks:=False, Transpose:=False
  15.  
  16.         n = n + 1
  17.     End If
  18. 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 :

Code :
  1. Sub Macro()
  2.     n = 2
  3.     If Sheets("sommaire" ).Cells(B, n).Value <> 0 Then
  4.         Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B4" )
  5.         Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B6" )
  6.         Sheets("sommaire" ).Cells(B, n) = Sheets("detail paye" ).Range("B10" )
  7.     End If
  8. End Sub
 

Bon, en fait tu écris tout dans la même cellule B x n. Spa normal :/


Message édité par zeb le 17-10-2007 à 10:47:09

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

 
Code :
  1. Sub Macro9()
  2.      n = 2
  3.      If Sheets("sommaire" ).Cells(B, n).Value  s  /*<-- parasite!*/   <> 0 Then
  4.          Sheets("detail paye" ).Range("B4" ) = Sheets("sommaire" ).Cells(B, n)
  5.          Sheets("sommaire" ).Cells(C, n) = Sheets("detail paye" ).Range("B6" ).Values
  6.          Sheets("sommaire" ).Cells(D, n) = Sheets("detail paye" ).Range("B10" ).Values
  7.          n=n+1
  8.     End If
  9. 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.

 


Message édité par zeb le 17-10-2007 à 10:48:48

---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Je repose les mêmes questions :
 
Qu'est-ce qu'une "boucle if" ?
Où est définie la variable B ?
Que contient-elle ?
Pourquoi la ligne 7 ?
 
 
(La réponse est dans la question)


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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.


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Citation :

pour moi, une boucle if est en fait "if..then...endif"


Spa une boucle, c'est une "condition de branchement"  :lol: :lol:

 
Citation :

Cells(B,n), c'est la cellule Bn


Ben 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 :)

Message cité 1 fois
Message édité par zeb le 15-10-2007 à 16:59:19

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
85*85? Voilà ce que j'en pense!
Plus d'informations

zeb a écrit :

Citation :

pour moi, une boucle if est en fait "if..then...endif"


Spa une boucle, c'est une "condition de branchement"  :lol: :lol:
 

Citation :

Cells(B,n), c'est la cellule Bn


Ben 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 :)


 

Code :
  1. n = 2
  2. Do While Sheets("sommaire" ).Cells(B, n).Values <> 0
  3.          Sheets("detail paye" ).Range("B4" ) = Sheets("sommaire" ).Cells(B, n)
  4.          Sheets("sommaire" ).Cells(C, n) = Sheets("detail paye" ).Range("B6" ).Values
  5.          Sheets("sommaire" ).Cells(D, n) = Sheets("detail paye" ).Range("B10" ).Values
  6.          n=n+1
  7. loop


:jap:
EDIT: Bordel je suis rouillé en VBA / Macro... j'ai mis next:D


Message édité par magellan le 16-10-2007 à 16:44:31

---------------
Le destin a voulu que Magellan périsse sous les coups de JeFaisPeurALaFoule...
Puis tel Jésus il revint plus fringuant que jamais :o
http://jefaispeuralafoule.blogspot.com  
JE SUIS CONTRE LE 85*85
Plus d'informations

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 :

Code :
  1. n = 2
  2.     Do While Sheets("sommaire" ).Cells(n, 2) <> 0
  3.               Sheets("detail paye" ).Range("B4" ) = Sheets("sommaire" ).Cells(n, 2)
  4.               Sheets("sommaire" ).Cells(n, 3) = Sheets("detail paye" ).Range("B6" ).Values
  5.               Sheets("sommaire" ).Cells(n, 4) = Sheets("detail paye" ).Range("B10" ).Values
  6.               n = n + 1
  7.      Loop


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

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 :pfff: ) En fait, c'est LA valeur, donc il faut écrire VALUE sans s à la fin.

 

Ca va mieux comme ça ?


Message édité par zeb le 17-10-2007 à 10:50:18

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

merci, ca marche !!!
je n'avais pas inversé la ligne 4, c'etait bien ce que je voulais (c'est pour sa que j'avais repris l'exemple en français !)
 
Vous etes trop fort !!! du coup, je reviendrais pour d'autres questions dans d'autres sujets !!!
 
Merci à tous.


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

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 ? :lol: )

 

Cells (n, 2) c'est la cellule Bn. Pour construire cette chaîne, on peut écrire :

"B" & n

 

Exemple :

Code :
  1. n = 2
  2. Do While Sheets("sommaire" ).Cells(n, 2) <> 0
  3.     Sheets("detail paye" ).Range("B4"   ) = Sheets("sommaire"    ).Range("B" & n).Value
  4.     Sheets("sommaire"    ).Range("C" & n) = Sheets("detail paye" ).Range("B6"   ).Value
  5.     Sheets("sommaire"    ).Cells("D" & n) = Sheets("detail paye" ).Range("B10"  ).Value
  6.     n = n + 1
  7. 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é :

Code :
  1. n = 2
  2. Do While WorkSheets("sommaire" ).Cells(n, 2) <> 0
  3.     WorkSheets("detail paye" ).Range("B4"   ) = WorkSheets("sommaire"    ).Range("B" & n).Value
  4.     WorkSheets("sommaire"    ).Range("C" & n) = WorkSheets("detail paye" ).Range("B6"   ).Value
  5.     WorkSheets("sommaire"    ).Cells("D" & n) = WorkSheets("detail paye" ).Range("B10"  ).Value
  6.     n = n + 1
  7. Loop
 

Ne trouves-tu pas ça un peu lourd de te traîner ses WorkSheets tout du long. Etudie-ça si tu veux bien :

Code :
  1. Dim som As WorkSheet
  2. Dim det As WorkSheet
  3. Set som = WorkSheets("sommaire" )
  4. Set det = WorkSheets("detail paye" )
  5. n = 2
  6. Do While som.Cells(n, 2) <> 0
  7.     det.Range("B4"   ) = som.Range("B" & n).Value
  8.     som.Range("C" & n) = det.Range("B6"   ).Value
  9.     som.Cells("D" & n) = det.Range("B10"  ).Value
  10.     n = n + 1
  11. Loop
 

Reviens avec tes questions quand tu veux.


Message édité par zeb le 17-10-2007 à 11:29:27

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

tout ca va vraiment finir par ressembler à du MAPLE !! lol
 
oui j'aime bien les maths.... :)
 
j'ai du mal a trouver des tutoriaux pour excel, car l'aide qu'il propose dans excel est pas top !
avant de vous submerger de question, tu as peux etre des suggestions de tuto à lire ?


---------------
    akela
 
Un sourire ne coûte rien et produit beaucoup.
zeb
Profil : Modérateur libre
Plus d'informations

Bien sûr : http://www.presence-pc.com/forum/p [...] 2941-1.htm
:sol:
 
Si lors de tes périgrinations sur le net tu trouves un excellent tuto, n'hésite pas à nous en faire part.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...

Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » Autre » boucle if & macro
 

Annonces Google
Publicité
Les ressources relatives