Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1487 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

Création d'une action en VBA Excel - Besoin d'aide

n°2173343
minimoack
Posté le 30-01-2013 à 15:26:30  profilanswer
 

Reprise du message précédent :
aaaaaah ok!  
 
C'est là ou on voit que je débute :D je n'ai encore jamais utilisé de boucle do, juste des while, for :)
 
Le ThisWorkbook est-il nécessaire à chaque fois?

Message cité 1 fois
Message édité par minimoack le 30-01-2013 à 15:27:03
mood
Publicité
Posté le 30-01-2013 à 15:26:30  profilanswer
 

n°2173344
minimoack
Posté le 30-01-2013 à 15:33:03  profilanswer
 

sh_kyra a écrit :


Quand tu cherches quelque chose avec une boucle, penses aussi à faire un Exit For/Do, pour pas continuer à boucler pour rien.


 
C'est pour éviter les boucles infinies que j'ai justement créé également un booléan, ça ne marche pas?

n°2173345
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 15:33:46  profilanswer
 

minimoack a écrit :

aaaaaah ok!

 

C'est là ou on voit que je débute :D je n'ai encore jamais utilisé de boucle do, juste des while, for :)

 

Le ThisWorkbook est-il nécessaire à chaque fois?

 

Non c'est pas nécessaire. Mais c'est très recommandé si tu ne variabilise pas ton code, donc je le mets, c'est mieux d'en mettre trop que pas assez et pas comprendre d'où viennent certains bugs.

 

Si tu écris Sheets ou même direct Cells il comprendra DANS l'ActiveWorkbook. Donc si tu passes d'un fichier Excel à un autre pendant l'exécution du code, le compilateur peut partir en vrille et chercher à continuer dans l'autre. Ne pas préciser est source de bugs ET de conflits. Le debug de ce genre de choses peut vite tourner à la calvitie :p

 

Le plus propre reste de faire:

 
Code :
  1. Dim IndexFeuille1 As Long
  2. Dim IndexFeuille2 As Long
  3. Dim oWorkbook As Workbook
  4. Dim Ws1 As Worksheet
  5. Dim Ws2 As Worksheet
  6. Dim ReferencePrecendente As String
  7. ReferencePrecendente = ""
  8. Set oWorkbook = ThisWorkbook
  9. Set Ws1 = oWorkbook.Worksheets(NOM_DE_TA_FEUILLE)
  10. Set Ws2 = oWorkbook.Worksheets(NOM_DE_TON_AUTRE_FEUILLE)
  11. Do While Not Ws1.Cells(IndexFeuille1, 1).Value = ""
  12.     'Tu vérifies si la référence précédente
  13.     If Ws1.Cells(IndexFeuille1, 1).Value = ReferencePrecendente Then
  14.         'Tu ajoutes la nouvelle valeur à l'ancien total de valeur stocké dans la feuille 2
  15.         Ws2.Cells(IndexFeuille2, 2).Value = Ws2.Cells(IndexFeuille2, 2).Value + Ws1.Cells(IndexFeuille1, 2).Value
  16.     Else
  17.         'Tu incrémentes l'index 2, vu que tu ajoutes une nouvelle ligne de valeur
  18.         IndexFeuille2 = IndexFeuille2 + 1
  19.         'Tu copies la référence
  20.         Ws2.Cells(IndexFeuille2, 1).Value = Ws1.Cells(IndexFeuille1, 1).Value
  21.         'Puis la valeur
  22.         Ws2.Cells(IndexFeuille2, 2).Value = Ws1.Cells(IndexFeuille1, 2).Value
  23.     End If
  24.     IndexFeuille1 = IndexFeuille1 + 1
  25.     'Tu stockes la référence précédente pour la prochaine comparaison
  26.     ReferencePrecendente = Ws1.Cells(IndexFeuille1, 1).Value
  27. Loop


Message édité par sh_kyra le 30-01-2013 à 15:35:30
n°2173347
minimoack
Posté le 30-01-2013 à 15:45:10  profilanswer
 

oui c'est sur que c'est beaucoup plus lisible :D
 
et pour ce qui est de mon booleen? (cf avant dernier de mes messages)

n°2173348
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 15:45:53  profilanswer
 

minimoack a écrit :


 
C'est pour éviter les boucles infinies que j'ai justement créé également un booléan, ça ne marche pas?


 
Ben elle sera effectivement pas infinie puisque tu as une condition de sortie. Mais ton booléen sert à rien, quand une boucle est DANS une boucle, la boucle intérieure doit se terminer avant de reprendre la boucle extérieure.  
 

Code :
  1. Dim Cell As Variant
  2. Dim nbLignes As Integer
  3. nbLignes = 0
  4. Columns("A:A" ).Select
  5.     For Each Cell In Selection
  6.         If Cell.Value <> "" Then
  7.             nbLignes = nbLignes + 1
  8.         Else
  9.             Exit For
  10.         End If
  11.     Next Cell


 
Ça fait ce que tu voulais faire ;)

n°2173350
minimoack
Posté le 30-01-2013 à 15:48:44  profilanswer
 

aaaaah ok!!! je savais pas qu'on pouvait faire ça ^^
j'ai un peu plus l'habitude de coder en C#, et on a appris à  mettre des booléens pour sortir des While, mais là c'est plus simple :D

n°2173351
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 15:53:16  profilanswer
 

minimoack a écrit :

aaaaah ok!!! je savais pas qu'on pouvait faire ça ^^
j'ai un peu plus l'habitude de coder en C#, et on a appris à  mettre des booléens pour sortir des While, mais là c'est plus simple :D


 
Même en C# ça n'aurait pas été mieux cela dit, comme je t'ai dit, la boucle supérieure ne peut se terminer tant que la boucle inférieure n'est pas terminée, même si la condition est remplie dans la boucle inférieure :)
 
Tu peux sortir des boucles en C# en utilisant break; ou return;  ;)


Message édité par sh_kyra le 30-01-2013 à 15:55:16
n°2173353
minimoack
Posté le 30-01-2013 à 15:57:01  profilanswer
 

Aaah oui c'est bon je vois le problème de mon code... il est obligé de finir de parcourir toutes les cellules (ouuuuh ma prof de C# devrait me frapper pour ce code!!!!)

n°2173354
Clochette0​307
Posté le 30-01-2013 à 16:02:13  profilanswer
 

Oulalala...
J'ai suivi votre conversation, mais là, je suis HORS COURSE...
On m'a mise sur un fichier à automatiser depuis jeudi, alors que je n'en avais jamais fait. J'ai appris petit à petit avec des documents (EXCEL PERFORMANCE, EXCEL POUR LES NULS) et avec l'enregistreur de MACRO.
En tous cas, vous avez beaucop de mérite à savoir faire ça, car personnelement, je trouve ça difficile

n°2173355
minimoack
Posté le 30-01-2013 à 16:05:04  profilanswer
 

:fou: ... Quelle horreur... comment j'ai pu écrire ça... :pfff: maintenant que tu me l'as fait remarquer, ça me parait vraiment énorme la faute que j'ai fait... j'ai honte...

mood
Publicité
Posté le 30-01-2013 à 16:05:04  profilanswer
 

n°2173356
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 16:05:43  profilanswer
 

minimoack a écrit :

:fou: ... Quelle horreur... comment j'ai pu écrire ça... :pfff: maintenant que tu me l'as fait remarquer, ça me parait vraiment énorme la faute que j'ai fait... j'ai honte...


 
 [:andromaque]

n°2173357
minimoack
Posté le 30-01-2013 à 16:06:58  profilanswer
 

Effectivement, ça doit etre dur d'apprendre en autoformation, moi j'ai vu les bases bases en cours, mais on n'a pas vraiment approfondi, mais c'est tout de même plus simple...
tu es bien courageuse tout de même :D

n°2173358
minimoack
Posté le 30-01-2013 à 16:07:23  profilanswer
 

ow trop mignon sh_kyra :D

n°2173359
Clochette0​307
Posté le 30-01-2013 à 16:12:38  profilanswer
 

Je te remercie minimoack :)
J'aurai aimé que notre prof d'info nous apprenne au moins les bases ^^
Le jour où je la revois je ne manquerai pas de lui en parler !
Heureusement que j'ai quand même de la doc à l'appuie

n°2173360
Clochette0​307
Posté le 30-01-2013 à 16:17:01  profilanswer
 

Et heureusement que j'ai des personnes gentilles comme vous sur le forum !
SInon je ne sais pas ce que je ferai :)
Encore MERCIIIIIIIIII

n°2173363
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 16:33:11  profilanswer
 

Code :
  1. Public Sub Calculer()
  2. Dim IndexFeuille1 As Long
  3. Dim oWs_PREPARATION_SIG As Worksheet
  4. Set oWs_PREPARATION_SIG = ThisWorkbook.Sheets("PREPARATION SIG" )
  5. IndexFeuille1 = 4 'vu que ça commence à 4 - à adapter si besoin
  6. Do While Not oWs_PREPARATION_SIG.Cells(IndexFeuille1, 1).Value = "" Or Not _
  7. oWs_PREPARATION_SIG.Cells(IndexFeuille1, 2).Value = ""
  8.    
  9.     'Si ta réf est pas vide
  10.     If Not oWs_PREPARATION_SIG.Cells(IndexFeuille1, 1).Value = "" Then
  11.         oWs_PREPARATION_SIG.Cells(IndexFeuille1, 3).Value = Trouver_Total_Par_Reference(oWs_PREPARATION_SIG.Cells(IndexFeuille1, 1).Value)
  12.     End If
  13.     IndexFeuille1 = IndexFeuille1 + 1
  14. Loop
  15. End Sub
  16. Private Function Trouver_Total_Par_Reference(ByVal Ref As String) As Double
  17. Dim Index As Long
  18. Dim oWs_BALANCE As Worksheet
  19. Dim Total As Double
  20. Set oWs_BALANCE = ThisWorkbook.Sheets("BALANCE" )
  21. Index = 1
  22. Do While Not oWs_BALANCE.Cells(Index, 1).Value = ""
  23.     If oWs_BALANCE.Cells(Index, 1).Value = Ref Then
  24.         Total = Total + CDbl(oWs_BALANCE.Cells(Index, 5).Value)
  25.     End If
  26.     Index = Index + 1
  27. Loop
  28. Trouver_Total_Par_Reference = Total
  29. End Function


 
Voila le code, je t'envoie le fichier mais je pense que c'est ce que tu voulais faire. ;)


Message édité par sh_kyra le 30-01-2013 à 16:33:24
n°2173373
Clochette0​307
Posté le 30-01-2013 à 17:00:01  profilanswer
 

Oh merci beaucoup sh_kyra !
Je viens de faire le test de ta formule que tu as posté sur le forum, je n'ai pas encore récupérer le fichier sur ma messagerie.
Le code que tu m'as envoyé met un message d'erreur :
Erreur Exécution '13'
Incompatibilité de type
Il me surligne en jaune cette partie là :
Total = Total + CDbl(oWs_BALANCE.Cells(Index, 5).Value)

n°2173374
minimoack
Posté le 30-01-2013 à 17:03:32  profilanswer
 

La ligne 37
"Trouver_Total_Par_Reference = Total"
correspond à un return en fait?

n°2173375
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 17:04:58  profilanswer
 

Clochette0307 a écrit :

Oh merci beaucoup sh_kyra !
Je viens de faire le test de ta formule que tu as posté sur le forum, je n'ai pas encore récupérer le fichier sur ma messagerie.
Le code que tu m'as envoyé met un message d'erreur :
Erreur Exécution '13'
Incompatibilité de type
Il me surligne en jaune cette partie là :
Total = Total + CDbl(oWs_BALANCE.Cells(Index, 5).Value)

 

La colonne 5 de ton onglet BALANCE est bien la valeur unitaire à totaliser de chaque ligne de ton onglet? Sinon mets le numéro correspondant à la colonne dans laquelle tu as une valeur. (A = 1, B = 2, C = 3 etc.)

 

Remplace ce bout de code par ça:

 
Code :
  1. If oWs_BALANCE.Cells(Index, 1).Value = Ref And IsNumeric(oWs_BALANCE.Cells(Index, 5).Value) Then
  2.         Total = Total + CDbl(oWs_BALANCE.Cells(Index, 5).Value)
  3. End If
 

Essayes de tripoter un peu par toi même quand même j'ai déjà bien mâché là... ;)


Message édité par sh_kyra le 30-01-2013 à 17:07:52
n°2173376
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 17:06:21  profilanswer
 

minimoack a écrit :

La ligne 37
"Trouver_Total_Par_Reference = Total"
correspond à un return en fait?

 

Oui sauf qu'en VBA à la différence du C, C# etc, ce retour n'interromps pas la fonction le code continuera à s'exécuter derrière, c'est juste que ta fonction aura cette valeur tant qu'elle est pas altérée.


Message édité par sh_kyra le 30-01-2013 à 17:06:53
n°2173377
minimoack
Posté le 30-01-2013 à 17:06:30  profilanswer
 

Et à quoi correspond le "CDb(....)l" de la ligne surlignée par l'erreur?

n°2173378
sh_kyra
Entre nous c'est Kyra
Posté le 30-01-2013 à 17:09:04  profilanswer
 

minimoack a écrit :

Et à quoi correspond le "CDb(....)l" de la ligne surlignée par l'erreur?

 

CDbl = Converti une variable en Double (Réel)

 

PS: Poses tes questions en MP par contre, on lui pourrit un peu le topic là ;)


Message édité par sh_kyra le 30-01-2013 à 17:10:25
n°2173379
minimoack
Posté le 30-01-2013 à 17:10:17  profilanswer
 

oki merci :)

n°2173380
Clochette0​307
Posté le 30-01-2013 à 17:11:30  profilanswer
 

Non pas du tout, elle peut continuer à mettre ses questions là
J'en apprends un peu plus comme ça sur la VBA ;)

n°2173381
minimoack
Posté le 30-01-2013 à 17:12:38  profilanswer
 

non mais je n'avais plus de question ;)
désolée d'avoir pourri un peu le topic :D

n°2173382
Clochette0​307
Posté le 30-01-2013 à 17:14:35  profilanswer
 

GENIAL !
Ton code marche super bien :)
MILLES MERCIS :D

n°2173383
Clochette0​307
Posté le 30-01-2013 à 17:16:09  profilanswer
 

Pas de soucis minimoack, moi ça m'a permis de comprendre de nouvelles choses et d'avoir des "explications" sur les codes.
Et non, tu n'as pas pourri mon topic, je suis certaines que ça aidera peut être d'autres personnes

n°2173385
minimoack
Posté le 30-01-2013 à 17:17:21  profilanswer
 

:D

n°2173504
Clochette0​307
Posté le 31-01-2013 à 14:33:57  profilanswer
 

Salut le forum, salut sh_kyra, salut minimoack :)
J'ai encore besoin de vos lumières aujourd'hui (désolée, j'abuse vraiment).
Grâce à vous, mon fichier marche super bien :D
Merci beaucoup.
 
Mais aujourd'hui, j'ai ajouté une nouvelle feuille
Et j'aimerai créer une MSGBOX afin de faire la chose suivante :
- Renseigner le mois dans la msgbox
- Si c'est par exemple janvier, je voudrais aller saisir mes résultats dans la colonne qui correspond
 
Une idée de la procédure à mettre en place ?

n°2173514
boomy29
PSN: tintine29
Posté le 31-01-2013 à 15:03:48  profilanswer
 

Dim reponse As String
reponse = InputBox("quel est le mois?" )  
 
tu testes la reponse pour te caller sur la bonne cas
 
range("A2" ).Select pour aller sur la case en A2 si tu as janvier en colonne A par exemple


---------------
[Ach] Just dance + cam PS4
n°2173515
minimoack
Posté le 31-01-2013 à 15:08:26  profilanswer
 

Pour compléter la réponse de boomy29, je te mets ce lien :)
http://www.excel-pratique.com/fr/v [...] alogue.php
 
Je trouve que ce cours sur les boites de dialogue est bien fait :D il t'aidera peut-être!

n°2173516
vave
Nice to meet me
Posté le 31-01-2013 à 15:09:49  profilanswer
 

Bonjour,
tu peux faire un truc dans ce genre :
 

Code :
  1. Dim mois As String
  2. Dim colonne As Integer
  3. mois = InputBox("Mois ?" )
  4. Select Case mois
  5.     Case "janvier"
  6.     colonne = 1
  7.    
  8.     Case "février"
  9.     colonne = 2
  10.     '... etc pour les autres mois
  11. End Select
  12. Cells(3, colonne).Select


 
A adapter en fonction de comment le mois va être renseigné (en lettre/en numérique).
 
 
Edit : multigrillé [:benou_grilled]


Message édité par vave le 31-01-2013 à 15:10:35

---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
n°2173517
Clochette0​307
Posté le 31-01-2013 à 15:11:42  profilanswer
 

Merci pour ta réponse oovaveoo :)
Je vais essayé ça dans un moment, le temps de finir mon autre macro
Je te remercie et te retiens au courant du résultat ;)

n°2173518
Clochette0​307
Posté le 31-01-2013 à 15:12:31  profilanswer
 

J'ai juste une petite question :
Le : Cells(3, colonne).Select
A quoi sert-il ? (ligne 19)

n°2173519
boomy29
PSN: tintine29
Posté le 31-01-2013 à 15:21:47  profilanswer
 

c'est pour que ta cellule soit selectionnée


---------------
[Ach] Just dance + cam PS4
n°2173521
Clochette0​307
Posté le 31-01-2013 à 15:26:41  profilanswer
 

Oui je me suis doutée, mais je ne vois pas laquelle va être sélectionnée en fait...

n°2173525
boomy29
PSN: tintine29
Posté le 31-01-2013 à 15:40:46  profilanswer
 

ben la ligne 3 ensuite la colonne c'est variable suivant ce que tu tapes  
si tu tapes janvier se sera colonne 1 donc du A3
si tu tapes fevrier se sera colonne 2 donc du B3
si tu tapes decembre se sera colonne 12 donc du L3
 
après c'est a toi de voir ou tu veux te mettre pour commencer ta saisie c'est juste que nous on ne sait pas c'est quoi la colonne qui correspond donc on imagine


Message édité par boomy29 le 31-01-2013 à 15:42:05

---------------
[Ach] Just dance + cam PS4
n°2173527
Clochette0​307
Posté le 31-01-2013 à 15:41:41  profilanswer
 

Ah d'accord
Merci beaucoup...
Mais comme tu as pu le lire précédemment, je débute en VBA et ne suis pas très douée
Merci beaucoup pour ton explication Boomy29 :)

n°2173528
boomy29
PSN: tintine29
Posté le 31-01-2013 à 15:44:41  profilanswer
 

De rien ça me permet aussi de travailler mes explications car si j'arrive pas à être clair sur le forum se sera pareil devant le client


---------------
[Ach] Just dance + cam PS4
n°2173541
vave
Nice to meet me
Posté le 31-01-2013 à 16:02:08  profilanswer
 

Oui, désolé, c'était juste pour montrer comment utiliser la variable "colonne".


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
n°2173578
Clochette0​307
Posté le 31-01-2013 à 16:55:32  profilanswer
 

En tous cas, merci de votre aide :)
La fonction marche vraiment très bien

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
[VBS] Script Language problème aide svpsauvegarder en session une action .Class Jquery
Aide VBA, Somme de chaque ligne d'un tableauAide pour Macro Excel
javascript : besoin de modifier une iframe crossDomainProblème TPE Création d'un site web dynamique
Aide: dérouler un menuGénérateur de chiffres à la suite d'une formule
Plus de sujets relatifs à : Création d'une action en VBA Excel - Besoin d'aide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR