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
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
A voir également:
- Extraction de donnes fichier excel code
- Fichier rar - Guide
- Liste déroulante excel - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
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
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+
"Dans un premier temps", penser à l'utilisation d'un tableau croisé dynamique, plutôt que de macros...
A+
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 ?
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 ?
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
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 !
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 !
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
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
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
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...
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
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 ^^
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 ^^
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
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).
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).
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?
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?
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
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...
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
Voici donc le code qui fonctionne:
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é ;)
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é ;)
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
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
Qu'en penses-tu ?
et ferais un
Range(col(i))=Evaluate("=SUMPRODUCT(( W3:W500=""" & col(i) & """)*(G3:G500))")
Qu'en penses-tu ?
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
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 :
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))")
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....
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....
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
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 .
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 .
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 ?
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 ?
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
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
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?
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
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
On Error GoTo 0
NB : et tu pourrais même te passer de l'adaptation de la fonction uniquevalues avec ça...
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...