Extraction de donnes fichier excel code

Fermé
Snoop - 26 août 2013 à 14:14
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 - 29 août 2013 à 14:59
Bonjour,

Je debute tout juste sur VBA sous Excel et j 'aurais besoin d'aide ou du moins d'indications concernant un travail que je dois effectuer.

Je dispose d un fichier excel qui comporte un tableau avec des operations financieres.
Ce tableau est composé de trois colonnes
On y trouve le nom de l' operation, son montant et le nom du fournisseur.


J aimerais ecrire un code VBA qui permettrait de calculer la somme des operations pour CHAQUE fournisseur et inscrire ce resultat dans un autre fichier excel dans un premier temps.
Si ca peut aider je peux mettre en fichier joint le document excel..
Si quelqu'un pouvait m aider ou du moins me mettre sur la piste...

Merci :)


A voir également:

8 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
26 août 2013 à 16:13
Bonjour,

"Dans un premier temps", penser à l'utilisation d'un tableau croisé dynamique, plutôt que de macros...

A+
0
Bonsoir,
Tout d abord merci de ta réponse.
Cependant,j'essaye de m'entrainer à coder des macros c'est pour cela que j'essaye de résoudre ce problème,quitte à ensuite le reprendre avec un TCD.

En cherchant un peu j'ai trouvé une fonction qui s'appelle SOMMEPROD qui me permet de recuperer à chaque fois le montant total de chaque opération ce qui est exactement ce que je recherche.

Cependant peut t'on utiliser une fonction que l'on utilise habituellement dans la barre des formules pour un code VBA ?
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
27 août 2013 à 10:14
Bonjour,

Effectivement, SOMMEPROD et les TCD permettent souvent de se passer de macros.
Si tu veux t'entraîner au code VBA, je peux te conseiller :
- l'enregistrement de tes saisies (Nouvelle Macro, tu écris une formule avec SOMMEPROD dans une cellule, puis regarde le code généré)
- de jeter un oeil à la fonction VBA Evaluate.

Bon courage !
0
Mon code VBA devra :

1) Determiner les differentetes opérations financières sur mon tableau excel.
Par exemple:
-10 opérations financières qui s'appellent BE.612.5.12
-5 operations financières qui s'appellent BE.612.5.11
Et ainsi de suite.
Il doit y avoir une dizaine de nom différents..

Pour chaque nom,je calcule le montant global et donc c'est pour ca que j'ai besoin d'une multiplication matricielle en multipliant ma colonne avec les montants de chaque opération qui ont le meme nom.

Ensuite,ces différents montants doivent être inscrit sur une AUTRE feuille excel dans des cases specifiques.(mais pour l'instant je n'y suis pas encore..)

Voici l'idée générale pour que tu saches ou je vais.
Pour l'instant j'essaye simplement de calculer un montant global.
Voici mon code mais je ne comprends pas pourquoi il y a une erreur de syntaxe:

Sub calcul()
Range("A1") = Evaluate("=SUMPRODUCT((W3:W65535="BE.612.5.12")*(G3:G65535))")
End Sub

La colonne W contient le nom des différentes opérations et la colonne G celle des montants
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
27 août 2013 à 13:24
J'ai eu beaucoup de mal à voir s'il y avait une question dans ton message...

Il faut doubler les guillemets autour de la valeur BE...

Sub calcul()
Range("A1") = Evaluate("=SUMPRODUCT((W3:W65535=""BE.612.5.12"")*(G3:G65535))")
End Sub 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci le code fonctionne.
J'essaye maintenant de faire cette meme action mais pour tous les noms d'opérations disponible sur mon fichier excel.
J'aimerais donc recuperer les differents noms d'opération (BE.616 etc..) et les stocker dans une variable afin de faire une boucle pour avoir les montants de chaque opération!

J'ai cherché en utilisant l'enregistrement de macro et en utilisant le filtre qui fait justement apparaitre les différents noms d'opération mais le code VBA associé me parait trop obscur pour en tirer la liste des opérations.

J'espère avoir été plus claire!!
Je ne perds pas courage et j'espère finir par arriver à faire ce que je veux ^^
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
27 août 2013 à 16:16
Idéalement il te faut donc une liste contenant une et une seule fois chaque nom d'opération.
Tu peux te baser sur https://forums.commentcamarche.net/forum/affich-20414350-commentrecuperer-1-liste-de-valeur-sous-excel#6 , fil dans lequel je me suis fait remettre en place par rapport à l'utilisation des Collections...
Utilise plutôt une boucle While sur les cellules de ta colonne W While [...] <> "" (en espérant qu'une cellule vide indique la fin du tableau).
0
Je pense que les collections semblent aussi une bonne méthode puisque j'ai besoin d'une boucle par la suite ! J'essaye d'avancer grâce à vos éclaircissements et je vous redis :)
0
Bonjour,
J'ai un peu avancé hier soir mais j'ai encore quelques petits problèmes.
J'ai récupéré le code qui permet de recuperer une collection contenant les noms d'opérations differentes (fonction uniquevalues) et voici maintenant ma sub principale:

Sub test()
Dim montant2 As Double
Set col = uniquevalues(Range("W3:W50"))
montant2 = Evaluate("=SUMPRODUCT(( W3:W50= col(1))*( G3:G50))")
Worksheets("Feuil1").Range("A1").Value = montant2
End Sub

Pour l'instant j'essaye simplement de faire fonctionner ce code,par la suite j'utiliserais une collection pour les montants et ferait une boucle mais le problème est que j'ai encore un soucis de syntaxe dans la ligne qui fait le produit matriciel.
Quand je remplace col(1) par le nom de l'opération (par exemple BE.612.5.12) ca fonctionne mais quand je laisse col(1) j'ai un soucis.
Il doit surement y avoir une erreur !!

Sinon j'ai aussi une autre question,quand je devrais faire une boucle pour avoir tous les montants,ma condition d'arrêt devra être lorsque la collection contenant les noms d'opérations sera vide non?
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
Modifié par Zoul67 le 28/08/2013 à 12:24
Bonjour,

Un problème de syntaxe pour le premier problème sans doute. Cherche sur le net.
Que penses-tu de parcourir tous les éléments de la collection ?
J'écris col(i).Value mais la syntaxe est sans doute à corriger...
For i = 1 to nombre_elements_collection
   Worksheets("Feuil1").Cells(i,1).Value = col(i).Value 
   montant2 = Evaluate("=SUMPRODUCT(( W3:W50= col(i).Value)*( G3:G50))")
   Worksheets("Feuil1").Cells(i,2).Value = montant2 
Next i
0
Voici donc le code qui fonctionne:
Sub test()

Dim var As Long
Dim montant As New Collection
Set col = uniquevalues(Range("W3:W500"))
nombre_element = col.Count
 
'On effectue une boucle pour calculer tous les montants'
For i = 1 To nombre_element
 	
	var = Evaluate("=SUMPRODUCT(( W3:W500=""" & col(i) & """)*(G3:G500))")
	montant.Add (var)
	Worksheets("Feuil1").Cells(i, 2).Value = var
Next i
End Sub

Pour ceux que ça interesse pour rentrer une variable en paramètre pour une sumproduct il faut utiliser les """ et &. (merci google !)


Arrivé à ce niveau de mon code j'ai deux collections,une qui s'appelle montant et l'autre col mais c'est la que les choses se compliquent...
Je dois remplir un autre tableau excel avec les montants que j'ai calculé mais j'ai du mal a voir comment faire au niveau "pratique".
Ci joint,vous trouverez un exemple du tableau que je dois remplir avec les montants calculés.

LE LIEN : http://cjoint.com/data3/3HCowP2eEgT.htm

Je dois simplement remplir la colonne "Réalisation 2012" avec les montants calculés auparavant.


La grosse difficulté pour moi est de trouver un moyen d'écrire le code pour que chaque montant s'inscrive bien dans la bonne case.
J'ai beau y réflechir je sèche pas mal dessus et toutes mes idées sont très laborieuses...
En effet,il faudrait que:

-1)e récupère le nom de l'opération,que je decoupe cette chaine de caractère avec une fonction pour en extraire les nombres.
Par exemple extraire de 612.5.11 les trois nombres. (j'ai trouvé une fonction qui peut le faire).

-2)Ensuite grâce a ces nombres déterminer la bonne ligne ou écrire le montant. (DIFFICILE)

-3)Dans ce cas,si la bonne ligne est trouvé remplir la case correspondante est un jeu d'enfant !

Pensez-vous que c'est envisageable de procéder de cette manière?
C'est surtout la deuxieme étape qui me semble difficile parceque je dois rechercher le numéro en utilisant les colonnes A,B et C et c'est bien compliqué !!


Si vous avez la moindre idée,je serais vraiment preneur !
En tout cas,grâce à ce petit code j'apprends beaucoup sur le VBA et je tenais encore une fois à vous remercier pour votre disponiilité ;)
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
28 août 2013 à 14:42
Abstraction faite de la 2è collection, je nommerais les cellules de la colonne réalisation comme les éléments de la collection : "BE..."
et ferais un
Range(col(i))=Evaluate("=SUMPRODUCT(( W3:W500=""" & col(i) & """)*(G3:G500))")

Qu'en penses-tu ?
0
Pourquoi ne pas garder deux collections? Je trouve leur fonctionnement tres pratique et pour la deuxieme partie de mon code ne serait pas plus agreable de manipuler des collections?
Quelles sont les raisons qui vous pousse a ne pas les utiliser.
La suite du code sera t il plus simple grace a ca ?
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
28 août 2013 à 15:48
C'est surtout qu'il n'y a pas de suite, je pense.
Dans la macro :
1è étape :
nommer les plages (reste à faire, pas très compliqué)
2è étape :
définir la collection (déjà fait, par le biais d'une autre fonction)
3è étape :
remplir les cellules adéquates avec l'utilisation du SOMMEPROD dont tu as trouvé la syntaxe :
Range(col(i))=Evaluate("=SUMPRODUCT(( W3:W500=""" & col(i) & """)*(G3:G500))")
0
J'ai du mal a comprendre...
Comment expliciter que le montant calculé de l'opération BE.612.5.11 doit etre inscrit dans la cellule AB6,que le montant calculé de l'opération BE.613.1.21 en AB21 et ainsi de suite....

En gros comment faire comprendre à mon code qu'il doit inscrire le montant dans la bonne case? J'espère que vous voyiez ce que je veux dire....
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
28 août 2013 à 20:15
OK, donc ma 1è étape c'était du Chinois pour toi...
Je vais essayer d'être clair :
- sous Excel on utilise généralement des "coordonnées" pour définir une cellule (ex. AB6), mais on peut aussi donner un nom à une plage (soit via la fonction Insertion>Définir>Nom, soit en sélectionnant la plage et en écrivant directement son nom dans le cadre blanc où figure les "coordonnées". Par exemple on peut appeler 3 cellules "Longueur", "Largeur", "Surface" et insérer une fonction =Longueur*Largeur dans la case Surface.
- ce qui est faisable à la main sous Excel peut généralement être fait en VBA... ci-après un exemple d'utilisation : https://forums.commentcamarche.net/forum/affich-9312788-vba-excel-definir-un-nom-d-une-plage .
0
C est bon le code fonctionne parfaitement
Toutefois j aurais une derniere question... Mes operations disponibles dans ma base ne commencent pas tous par BE.. et il se trouve que j en ai pas besoin pour remplir mon fichier excel j aimerais donc les supprimer de la collection ( d ailleurs ca me pose un pbl pour le nommage des cellules vu qu aucune cellule ne commence par autre chose que BE).
J ai donc pensé a faire une fonction qui enlevera tous les elements ne commencant pas par BE dans ma collection. Est ce une bonne idee ?
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
29 août 2013 à 13:49
Plutôt que de les supprimer, j'éviterais de les intégrer dans la Collection, mais c'est dans le code de la fonction "uniquevalues".
For Each thecell In thecells

If Left(thecell.Text,2)="BE" And Not InCollection(values, thecell.Text) Then
values.Add Item:=thecell.Value, key:=thecell.Text
End If
Next 
0
Effectivement c est mieux maintenant ! Mais je viens de realiser que j avais toujours un probleme a cause du fait que certains noms d operations qui commencent certes par BE ne sont pas presentes dans le deuxieme fichier ce qui pose sensiblement le meme probleme vu qu aucune case n est nommee avec leur nom.. Je procede de la memes maniere en mettant une condition avant le remplissage de la cellule pour verifier que la cellule existe?
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
29 août 2013 à 14:59
onglet plutôt que fichier ?
Tu n'as pas de cellule portant le nom que tu trouves dans ta base de données ?
J'utiliserais le traitement d'erreurs (généralement à éviter) :
On Error Resume Next
code

On Error GoTo 0

NB : et tu pourrais même te passer de l'adaptation de la fonction uniquevalues avec ça...
0