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

Création d'une action en VBA Excel - Besoin d'aide - VB/VBA/VBS - Programmation

Marsh Posté le 29-01-2013 à 14:55:31    

Bonjour le forum,
 
Après plusieurs jours de recherche, je me permet de me tourner vers vous.
Je suis en train de réaliser une macro et je dois avouer que je galère un peu (je ne suis pas très douée).
 
J'ai importé des comptes et ceux-ci sont rangés en cellule A.
Cette cellule A peut être variable selon les mois (un compte peut exister ou pas).
J'ai réussi à faire une action VBA Excel dans la cellule H4 de mon tableau qui me détermine combien il y a de lignes dans ma colonne A.
 
Maintenant, j'aimerai faire une boucle qui répète cette action sur le nombre de lignes.
L'action que je veux faire marche mais il faudrait que je saisisse à la main le nombre de lignes de la colonne A jusqu'à ce qu'il n'y est plus rien.
Ma formule est la suivante :
 
Ex : A1 = 601120 (n° de compte)
Range("A1" ) = Left([A1],3)
 
Résultat = 601
 
Comment faire pour intégrer à cette fonction le nombre de ligne obtenues en H4?
 
Désolée si je ne suis pas très claire...

Reply

Marsh Posté le 29-01-2013 à 14:55:31   

Reply

Marsh Posté le 29-01-2013 à 15:56:51    

Ce que je comprends tu as tout tes comptes en colonne A que tu veux parcourir pour garder les 3 premiers chiffres
 
Dim iLigneFin As Integer
 iLigneFin = Sheets("Feuil1" ).Range("A65000" ).End(xlUp).Row 'retourne H4 en gros  
Dim sNumero AS String
 
For i = 1To iLigneFin
    sNumero = Range("A" & i )
    Range("A" & i ) = Left(sNumero ,3)  
Next
 
 
je sais pas si ça marche c'est la 1ere idée que j'ai là

Reply

Marsh Posté le 29-01-2013 à 16:08:20    

Ayant compris la même chose que boomy29, je te propose cette solution alternative (même si celle de boomy29 est très bien aussi  :D , mais voilà comment je ferais)  
 

Code :
  1. 'On sélectionne la colonne
  2. Columns("A:A" ).Select
  3. 'On parcours la sélection
  4. For Each Cell In Selection
  5.     'Si la cellule n'est pas vide
  6.      If Cell.Value <> "" Then
  7.             Cell.Value = Left(Cell.Value, 3)
  8.      End If
  9. Next Cell


 
et tu n'as pas besoin du nombre de ligne

Reply

Marsh Posté le 29-01-2013 à 16:16:27    

Merci Boomy29 et Minimoack ! :D
Je début en VBA donc j'ai énormément de mal à faire ce que je veux.
J'ai essayé de faire en enregistrant la macro avec l'onglet développeur mais je n'avais jamais le résultat escompter.
Je vous remercie de l'aide précieuse que vous m'avez apporter ! :)
Je pense que dans peu de temps j'aurai besoin à nouveau de votre aide...

Reply

Marsh Posté le 29-01-2013 à 16:44:24    

De rien

Reply

Marsh Posté le 29-01-2013 à 16:47:53    

J'ai encore besoin de vos lumières...
Pardonnez-moi si je suis pénible et que ce que je veux faire relève du basic.
 
Après avoir réduis le nombre de caractères de mes comptes (grâce à vous), je voudrais faire une action dans une autre feuille.
Je voudrais faire une recherche sur les numéros de compte dans la feuille1 et déterminer leur valeur en feuille2.
Mais ce n'est pas si simple car vu que j'ai réduis le nombre de caractères, j'ai plusieurs compte "601".
Comment puis-je faire ?
 
 
Tableau :
......A.......B.......C......D
1....601....1256€
2....601....156€
3....601....85€
4....
5....
6....

Reply

Marsh Posté le 29-01-2013 à 16:59:00    

Qu'est ce que tu entends par recherche?
genre tu sélectionnes un/des numéro(s) de compte, et tu récupères dans la feuille 2 toutes les valeurs associées à ce/ces numéros de compte?
 
Désolée, je n'ai pas très bien compris... :(

Reply

Marsh Posté le 29-01-2013 à 17:10:59    

Désolée du manque d'explications et de cohérences...
Dans ma feuille 2 j'ai un tableau avec les 3 premiers caractère du comptes, d'où ma première demande pour réduire mes numéros de comptes feuille1.
 
Ce que je veux faire, c'est comme une recherchev mais en VBA.
Dans ma feuille2, en colonne 1, j'ai par ex : 601.
Donc je veux rechercher dans ma feuille tous le comptes 601 présents en A1 et donner leurs valeurs qui sont en E4

Reply

Marsh Posté le 29-01-2013 à 17:11:32    

Ma recherche se ferai en feuille1

Reply

Marsh Posté le 29-01-2013 à 17:12:13    

*Correction : Ma recherche se fait en feuille2 et je vais rechercher les valeurs en feuille1

Reply

Marsh Posté le 29-01-2013 à 17:12:13   

Reply

Marsh Posté le 29-01-2013 à 17:13:30    

Tu as essayé d'enregistrer une macro pour cette action?
(Je ne suis pas une pro non plus du vba dsl ^^)

Reply

Marsh Posté le 29-01-2013 à 17:20:12    

J'essaie de faire des choses, mais rien de cohérent ou alors, il y a des erreurs vu que j'ai plusieurs fois le meme nom de compte...
L'ordinateur ne sait pas quelle cellule prendre.
L'idéal je pense, serait de faire une somme des recherche ^^

Reply

Marsh Posté le 29-01-2013 à 17:22:53    

... je sèche cette fois ci  :sweat: ... je te préviens si une idée me vient  :wahoo:

Reply

Marsh Posté le 29-01-2013 à 17:48:29    

ce que je vois et là j'y vois pas clair  
après c'est plus simple de voir avec le fichier  
 
j'aurai fait un somme.si(A:D;601;D)


Message édité par boomy29 le 29-01-2013 à 17:48:56

---------------
[Ach] Just dance + cam PS4
Reply

Marsh Posté le 30-01-2013 à 08:02:00    

J'y ai pensé, mais il faut que j'automatise mon calcul et que je le mette sous Visual Basic

Reply

Marsh Posté le 30-01-2013 à 08:47:42    

Le somme.si(A:D;601;D) ne fonctionne pas car mon 601 est variable, je ne cherche pas toujours ce compte...

Reply

Marsh Posté le 30-01-2013 à 09:28:17    

Mais si tu remplaces ton 601 par une variable que tu demanderais à l'utilisateur genre :
InputBox("Veuillez saisir le numéro de compte que vous recherchez :", "Choix du compte" )

Reply

Marsh Posté le 30-01-2013 à 09:28:26    

?

Reply

Marsh Posté le 30-01-2013 à 09:58:53    

Clochette0307 a écrit :

J'essaie de faire des choses, mais rien de cohérent ou alors, il y a des erreurs vu que j'ai plusieurs fois le meme nom de compte...
L'ordinateur ne sait pas quelle cellule prendre.
L'idéal je pense, serait de faire une somme des recherche ^^


 
J'ai compris ce que tu voulais mais est-ce que tu pourrai nous dire quel résultat tu veux?
 
Grosso-modo pour faire ça le plus simple est de le gérer directement en objet. Tu es familière avec les objets ou pas du tout?
 
Tu peux nous mettre 3 screens? Un de ta feuille 1, l'autre de ta feuille 2 et ce que tu souhaiterai comme résultat. Je te détaillerai ensuite la marche à suivre.
 
 

Reply

Marsh Posté le 30-01-2013 à 14:32:47    

Ce que je veux faire, c'est une recherche sur le numéro de compte, mais vu que j'ai plusieurs fois le même n° de compte qui revient, je voudrais avoir comme résultat : la somme des montants figurant dans mon compte.
Ex : 601 (apparait sur 3 fois dans mon tableau, avec 3 montants différents). Le résultat : la somme de ces 3 montants.
 
Je débute en VBA donc je ne suis pas très familière avec les objets...
Je suis désolée sh_kyra

Reply

Marsh Posté le 30-01-2013 à 14:39:13    

Tu demandes à l'utilisateur de choisir un numéro de compte, et tu veux la somme des montants pour ce numéro de compte c'est ça?


Message édité par minimoack le 30-01-2013 à 14:42:27
Reply

Marsh Posté le 30-01-2013 à 14:40:25    

Oui minimoack, tous mes 601 sont à la suite.
J'ai fait un imprim écran de ce que je veux, mais je ne sais pas du tout comment poster mon image sur le forum...

Reply

Marsh Posté le 30-01-2013 à 14:43:33    

Ton idée du message box n'est pas mal, seulement ça prendrait beaucoup trop de temps si je devais le faire compte par compte...

Reply

Marsh Posté le 30-01-2013 à 14:53:35    

il faudrait peut etre faire une boucle qui parcourt les cellules genre :
For i=0 jusqu'à i=nbligne
   Si la valeur de la cellule = la valeur de la cellule précédente alors
          on ajoute à total le montant
   Sinon,
          on insert total dans la feuil2 à un indice j
          et on incrémente j
   End If
Next i
 
... je réfléchis pour mettre en forme ce code, mais c'est plutot ça?

Reply

Marsh Posté le 30-01-2013 à 15:00:08    

Je réfléchis de mon côté également pour mettre en forme ton idée.
Mais à mon avis, ce code est une très bonne idée :D
C'est un peu comme un SOMME.SI de RECHERCHEV
Merci beaucoup de ton aide minimoack !

Reply

Marsh Posté le 30-01-2013 à 15:05:27    

Clochette0307 a écrit :

Oui minimoack, tous mes 601 sont à la suite.
J'ai fait un imprim écran de ce que je veux, mais je ne sais pas du tout comment poster mon image sur le forum...


 
Mets là sur un hébergeur d'image en jpg ensuite utilise la balise IMG ([IMG][/IMG])
 
Si tout est à la suite c'est plus simple, il te faut faire:
 
Une boucle qui parcours ta colonne de références
Stocker la référence dans une variable
Si la référence courante est différente de la référence précédente (que tu as préalablement stocké) tu ajoutes ta référence et la valeur dans un tableau à deux dimensions
Si elle est identique, tu ajoutes la valeur de ton tableau à la nouvelle valeur et ainsi de suite
 
Si tu n'arrives pas à mettre des screens ici, tu peux m'envoyer un MP je te donnerai mon mail pour que tu me transmettes ton fichier.

Reply

Marsh Posté le 30-01-2013 à 15:06:06    

Tiens, voici le début, je pense que ça devrait marcher. Je réfléchis encore pour insérer total dans une autre feuille  ;)  
 

Code :
  1. Dim Cell As Variant
  2. Dim nbLignes As Integer
  3. Dim fin As Boolean
  4. nbLignes = 0
  5. fin = False
  6. Columns("A:A" ).Select
  7. While fin = False
  8.     For Each Cell In Selection
  9.         If Cell.Value <> "" Then
  10.             nbLignes = nbLignes + 1
  11.         Else
  12.             fin = True
  13.         End If
  14.     Next Cell
  15. Wend
  16. Dim i As Integer
  17. Dim j As Integer
  18. Dim total As Double
  19. total = 0
  20. j = 0
  21. For i = 2 To nbLignes
  22.     If (Range("A" + i).Value = Range("A" + i - 1).Value) Then
  23.         total = total + Range("E" + i).Value
  24.     Else
  25.         'on met la valeur de total dans une autre feuille dans un rang j
  26.         '...
  27.     End If
  28. Next

Reply

Marsh Posté le 30-01-2013 à 15:09:05    

Le Range("E"......) est pour le montant. adapte le à ta colonne, j'ai cru comprendre que c'était la E, mais je ne suis pas sure...
La première partie permet de déterminer le nombre de lignes (en supposant qu'il n'y a aucune ligne de sauté, sinon ça ne marche pas)

Reply

Marsh Posté le 30-01-2013 à 15:10:23    

Je n'avais pas vu ton message sh_kyra, mais ce que j'ai mis fonctionne aussi non? :)

Reply

Marsh Posté le 30-01-2013 à 15:11:17    

Wahou, tu es très efficace ! :)
Je ne vais pas si vite, ce n'est pas évident d'être débutant ^^
En fait, je veux faire ma recherche sur mon n° compte qui est en feuille1 et aller chercher mes données dans la feuille2 (N° compte renseigné en colonne A et valeur en colonne E)
Donc mon résultat apparaitra en feuille1

Reply

Marsh Posté le 30-01-2013 à 15:12:38    

Merci de ton aide sh_kyra !
Mais je ne peux pas joindre mon fichier pour raison de confidentialité...

Reply

Marsh Posté le 30-01-2013 à 15:14:53    

alors il faudrait peut etre rajouter juste des Feuil1.Range.... mais ceci n'est que supposition...
je ne sais pas trop

Reply

Marsh Posté le 30-01-2013 à 15:17:37    

J'essaie d'adapter ton code qui me sauve la vie ^^
Après je te dirai si ça marche, car je débute en VBA

Reply

Marsh Posté le 30-01-2013 à 15:18:40    

Je ne suis pas très expérimentée en VBA non plus, mais ça s'apprend vite :D

Reply

Marsh Posté le 30-01-2013 à 15:21:32    

minimoack a écrit :

Tiens, voici le début, je pense que ça devrait marcher. Je réfléchis encore pour insérer total dans une autre feuille  ;)  


 
C'est pas mal mais tu fais 2 boucles pour rien.. ;)
Quand tu cherches quelque chose avec une boucle, penses aussi à faire un Exit For/Do, pour pas continuer à boucler pour rien.
 
 

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


 

Reply

Marsh Posté le 30-01-2013 à 15:21:40    

Je vois ça :)
J'ai essayé avec l'enregistreur de macro ma recherche alors ça me donne ça
 
 ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],BALANCE!C[-2]:C[2],5,FALSE)"
    Range("C10" ).Select
 
Là j'ai uniquement ma recherchev dans une seule cellule pour un seul montant, j'ajoute petit à petit ^^

Reply

Marsh Posté le 30-01-2013 à 15:22:53    

Clochette0307 a écrit :

Merci de ton aide sh_kyra !
Mais je ne peux pas joindre mon fichier pour raison de confidentialité...


 
Tu pouvais aussi m'envoyer la même chose avec des valeurs bidonnées ;)
 
Bon courage

Reply

Marsh Posté le 30-01-2013 à 15:23:18    

J'ai à faire à des personnes qui maitrise le VBA !
En tous cas, je vous remercie pour votre aide ! Ca m'enlève une sacré épine du pied, sinon je met beaucoup plus de temps...
Je test vos deux formules et je vous redis :)
En tous cas : MERCIIIIIIII !

Reply

Marsh Posté le 30-01-2013 à 15:24:02    

J'avoue que j'aurai pu tout trafiquer et t'envoyer mon dossier
En tous cas, merci beaucoup sh-kyra

Reply

Marsh Posté le 30-01-2013 à 15:26:30    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed