Problème concaténation et chemin vers autre classeur [Résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 03-08-2010 à 17:39:20
Astro-Pepito a écrit : Bonjour à tous,
|
Bah utilise un tableau au lieu d'une série de variable...
ce qui devrait te faciliter la vie
Astro-Pepito a écrit :
|
Bah tu peux ouvrir le classeur en VBA
par le biais de la fonction "Workbooks.Open" (de mémoire)
et travailler dessus, puis le fermer.
ce qui devrait donner du code qui ressemble a ceci :
dim MonClasseur as Workbook
set MonClasseur = Workbooks.Open("Chemin" )
'Tu utilise ton classeur ici, et donc appel ta fonction
MonClasseur.Close
set MonClasseur = nothing
Astro-Pepito a écrit : |
Je crois qu'un tutoriel VBA serait le bien venu sur cette section
Marsh Posté le 04-08-2010 à 09:59:43
Xxxaaavvv a écrit : |
Ca risque d'etre un peu long de passer en revu le VBA.. pour Excel, pour Word, pour Access, pour PowerPoint, sans parler des associations avec WSS etc.
Astro-Pepito a écrit :
|
Tout dépend ce qui alimentent ces variables. Si c'est une plage de cellule Excel, pas besoin de tableau de variable. La plage de cellule en etant deja une.
Explique plutot ce qui alimente tes variables de 1 à 48 ca sera plus pratique pour nous.
Là, a part nous noyer sous des informations finalement pas importantes, ca ne sert a rien. Explique d'où proviennent tes données, et ce que tu veux en faire...
Xxxaaavvv a écrit :
|
Idem, explique ce que tu souhaite point par point plutot que de partir dans des délires qui ne nous avancent pas "ca m'évitera de le changer 48 fois si jamais il est modifié ultérieurement" ca ne veut rien dire sans savoir ce que tu as deja fait et ce que tu veux faire...
J'attends tes réponses.
Marsh Posté le 04-08-2010 à 10:10:06
SuppotDeSaTante a écrit : Ca risque d'etre un peu long de passer en revu le VBA.. pour Excel, pour Word, pour Access, pour PowerPoint, sans parler des associations avec WSS etc. |
En fait le VBA le plus utilisé par les "non-initié" à la programmation, c'est celui d'excel.
Et faudrait surtout passer en revu les principaux points spécifique Excel (sans refaire de la syntaxe VB).
Marsh Posté le 04-08-2010 à 10:35:20
Pour les bases, le topic unique d'Excel sur la section Windows & Software traite autant d'Excel que de sa partie VBA.
Mais sinon sur le principe je suis d'accord. Je pense que bcp de gens se lance dans le vba en se disant que c'est facile, alors que si on a meme pas une petite approche d'algorythmie, ca reste super chaud.
La preuve ce topic. Qui je pense doit balayer 48 lignes d'un tableau excel et vouloir le copier coller dans un autre classeur. Ce qui en théorie devrait prendre 15 lignes...
Marsh Posté le 04-08-2010 à 10:54:08
SuppotDeSaTante a écrit : Pour les bases, le topic unique d'Excel sur la section Windows & Software traite autant d'Excel que de sa partie VBA. |
je l'ai déjà en favori ce topic
ça ressemble plus à un cumul de questions spécifiques en un seul topic qu'une faq, ou un tutoriel.
Marsh Posté le 04-08-2010 à 12:22:26
Bon, pour expliquer ce que je veux faire.
J'ai un tableau de 36 lignes et 21 colonnes dont chaque cellule est composée de texte de la forme "3x 05 ; 14x 42 ; 1x 21" avec un nombre variable de "Xx XX" (ici trois mais ca peut aller de zéro à quatre). Le X correspond au nombre de fois où la référence XX apparaît. Ce tableau se situe dans Tableau1.xls feuille Total.
J'ai un deuxième tableau, dans Tableau2.xls feuille Total, qui a 48 colonnes, chacune correspondant à une référence, et un nombre de lignes dépendant du remplissage du premier tableau.
Ce que je souhaite, pour simplifier, c'est extraire les nombres X associés aux références XX de chaque cellule du premier tableau, les sommer si les références sont identiques ("3x 05 ; 14x 05 ; 1x 05" doit me donner 18 dans la colonne 05) puis les insérer dans la bonne colonne XX et la bonne ligne du deuxième tableau.
L'algo ne pose pas de problème, je l'ai fait et il fonctione sans souci. Toutefois il nécessite que le premier tableau soit copié dans la feuille Total de Tableau2.xls. Or, pour des raisons de mises à jour, il me faut faire le lien directement vers Tableau1.xls feuille Total. Donc, je souhaiterai mettre le chemin de ce lien dans une variable pour n'avoir à modifier le chemin qu'une fois si les classeurs changent de place sur le serveur. Ce que je ne connais pas, c'est la syntaxe à utiliser pour faire cela sachant que, dans mon algo, les cellules appelées dans le premier tableau changent selon la cellule du deuxième tableau en cours de traitement : une fois ca sera F12, une autre T24, etc.
L'autre question, c'est simplement que je souhaite avoir des variables du style VariableXX sans avoir à créer et utiliser manuellement les 48 variables. J'aimerais bien avoir une boucle qui me les crée automatiquement et qui fera un test sur toutes ces variables, ceci afin d'avoir une fois 15 lignes plutôt que 48 fois...
J'avais bien sûr pensé aux tableaux mais le point un peu chiant c'est que, si c'est comme en PHP, ca commence à 0 et les chiffres de 1 à 9 ne sont pas précédés d'un 0. Pour des raisons de cohérence et de suivi de la macro par d'autres qui s'y connaissent encore moins que moi en VB (c'est dire...), je voudrais avoir une solution qui me permette d'avoir des 01, 02, 03, etc.
J'ai appris VB sur le tas ici pendant mon stage, donc désolé de mon ignorance concernant ce langage. C'est pas pour le plaisir que je m'y suis mis, mais parce qu'il le fallait.
J'ai bien essayé de trouver des tutos sur le Net, mais en général c'est soit "Alors recopiez ce code et regardez ca marche" sans vraiment expliquer les tenants et aboutissants, soit un catalogue des fonctions/structures de base mais rien concernant la syntaxe, les déclarations par exemples. Je n'ai pas trouvé de vrai tuto bien clair qui explique le VB un peu à la manière du SdZ. Si vous en connaissez, faites-moi signe !
Marsh Posté le 04-08-2010 à 22:21:00
Donc pour la 1ere question :
Code :
|
J'ai argumenté mon code pour que tu "piges" le principe.
Après je ne comprends pas la phrase :
Citation : Or, pour des raisons de mises à jour, il me faut faire le lien directement vers Tableau1.xls feuille Total. Donc, je souhaiterai mettre le chemin de ce lien dans une variable pour n'avoir à modifier le chemin qu'une fois si les classeurs changent de place sur le serveur. |
En gros tu veux qu'une cellule du second classeur pointe sur le premier ?
Si tel est le cas :
Code :
|
Ou encore en parametrant le nom du Tableau1
Code :
|
Pour la seconde question, je ne pige toujours pas pourquoi tu veux passer par des variables. Tes 48 variables, si je ne m'abuse, doivent correspondrent aux 48 colonnes de la feuille Total non ?
Donc pas besoin de variable. Enfin je pense etant donné qu'une cellule est une reference du croisement entre une ligne (Row) et une colonne (Column), et que tu peux valoriser ces deux propriétés...
Imaginons un tableau de deux colonnes et 50 lignes, pour passer sur chaque cellule :
Code :
|
Tu peux aussi utiliser le Select, l'equivalant du Switch de Php
Code :
|
Quant a nos propos sur les algo, "l'ignorance" etc. c'est de la généralité, tu n'étais pas ciblé du tout Enfin, pour ma part...
Maintenant pour cela :
Citation : J'ai bien essayé de trouver des tutos sur le Net, mais en général c'est soit "Alors recopiez ce code et regardez ca marche" sans vraiment expliquer les tenants et aboutissants, soit un catalogue des fonctions/structures de base mais rien concernant la syntaxe, les déclarations par exemples. Je n'ai pas trouvé de vrai tuto bien clair qui explique le VB un peu à la manière du SdZ. Si vous en connaissez, faites-moi signe ! |
il n'y a rien de mieux que la touche F1 dans la suite Office, ou encore sous Excel l'enregistreur de Macro pour piger le fonctionnement.
Marsh Posté le 04-08-2010 à 23:07:48
ReplyMarsh Posté le 05-08-2010 à 11:34:19
Je vais essayer avec des codes comme cela et je vous tiens au courant. Merci pour ton aide Ca me permet de vraiment voir comment on écrit en VB car je n'avais que quelques astuces sur le tas.
Je sais que F1 est bien pratique en temps normal (je l'utilise pas mal d'habitude), mais je fais mon stage en Allemagne et toute la suite Office est en allemand. J'ai beau avoir un niveau pas trop mal en allemand, l'aide Excel reste bien trop obscure pour moi avec les mots hyper spécifiques qu'on y trouve
Marsh Posté le 06-08-2010 à 11:35:12
Bon j'ai réussi à coder le truc des 48 variables avec une seule variable, je me prenais la tête pour pas grand chose et en adaptant un peu mon code ca fonctionne très bien maintenant. Merci
Par contre j'ai toujours un souci pour le lien entre les deux classeurs.
J'ai essayé les codes que tu m'as montrés mais ca ne me convient pas trop. Je vais réexpliquer mon problème puis j'expliquerai pourquoi ca ne me convient pas. J'ai cherché mais pas encore trouvé de solution.
Alors, j'ai dans la feuille Total de Classeur1.xls un tableau de 21 colonnes et 36 lignes. Deux lignes successives dans une même colonne correspondent à un même composant et doivent donc être considérées ensemble : ca me fait donc 18 "groupes" de 2 lignes.
Chaque cellule est remplie de texte de cette forme : "2x 05 ; 4x 24 ; 1x 12" avec entre 0 et 4 occurences "Xx XX".
Ce qu'il me faut, c'est récupérer dans ces cellules les nombres X devant les références XX, les sommer pour chaque groupe de 2 cellules appartenant à un même composant, et afficher chacune de ces sommes dans la colonne correspondante du tableau de 48 colonnes (48 références) situé dans la feuille Total de Classeur2.xls (placé dans le même dossier que Classeur1.xls). Lorsque l'on passe d'un composant à un autre (toutes les 2 lignes dans une même colonne ou quand on change de colonne), on passe sur une nouvelle ligne du tableau 2. Il y a donc un total de 18x21 lignes dans mon tableau 2.
Voilà un exemple concret pour mieux comprendre.
Dans la feuille Total de Classeur1.xls, voici le début de ma première colonne :
2x 05 ; 4x 24 ; 1x 12 |
Dans le tableau de résultats, je dois avoir sur la première ligne le chiffre 10 dans la colonne 05, 1 dans la colonne 12 et 4 dans la colonne 24. Sur la deuxième ligne, je dois obtenir 2 dans la colonne 05, 3 dans la colonne 12, 3 dans la colonne 24, 2 dans la colonne 44 et 8 dans la colonne 45.
Comme je l'ai dit avant, l'algo est prêt et fonctionne parfaitement, mais pour cela il faut que le tableau soit copié dans la feuille Total de Classeur2.xls.
Ce que tu m'as proposé ne convient apparemment pas car je n'ai pas réussi à récupérer le contenu des cellules et à faire mes opérations de comptage/insertion dans le tableau 2 en ouvrant une seule fois le classeur 1. Si j'ai bien compris, il faut l'ouvrir une fois pour chaque cellule et le refermer une fois qu'on a récupéré le texte de la cellule. C'est très désagréable et j'ose pas imaginer si un de mes collègues est épileptique et lance la macro
J'ai aussi suivi le troisième point de cette page d'aide Microsoft mais ca ne permet que de sélectionner la cellule et on ne peut apparemment pas mettre cette sélection directement dans une variable. J'ai essayé sans le Application.Goto et ca fonctionne... si Classeur1.xls est déjà ouvert. Pas super pratique donc.
J'espère que cette fois c'est un peu mieux expliqué et que vous pourrez m'aider à finir cette macro
Marsh Posté le 06-08-2010 à 15:37:15
Oulaaaaa grand dieu heureusement que non qu'il ne faut pas ouvrir et fermer le classeur2 a chaque traitement !!!!!!!!
Hum...
Un exemple :
Code :
|
A quoi ressemble ton algo qui te permets d'avoir les sommes par colonne ?
Marsh Posté le 09-08-2010 à 14:19:03
Voici mon code actuel, qui nécessite de copier le tableau 1 dans la feuille Total de Tableau2.xls et qui me compte chaque référence et indique leur nombre dans la bonne colonne :
Code :
|
EDIT : Je sais que je ne dois pas l'ouvrir une fois pour chaque cellule, c'est juste que je ne savais pas qu'on pouvait avoir 2 classeurs ouverts simultanément et les appeler comme tu l'as fait. Je vais tester ca dans l'après-midi si j'en ai le temps ;-)
Marsh Posté le 10-08-2010 à 16:44:25
Bon j'ai réussi avec des Set, comme tu l'as proposé, et ca fonctionne parfaitement
J'ai un peu galéré pour la fermeture du classeur 1 à la fin du traitement mais un simple ActiveWorkbook.Close a fait l'affaire.
Merci beaucoup pour ton aide !
Je mets en Résolu.
Marsh Posté le 10-08-2010 à 20:48:51
Set BF1 = Workbooks(ExcClasseur1)
BF1.Close
Ca devrait le faire
Marsh Posté le 11-08-2010 à 14:56:01
Eh bien non étonnament ca ne fonctionne pas. Mais avec ActiveWorkbook.Close il n'y a pas de problème. Donc je laisse ca comme ca
Marsh Posté le 03-08-2010 à 15:13:49
Bonjour à tous,
J'ai deux problèmes en Visual Basic pour Excel :
J'espère que j'ai été à peu près clair et que vous pourrez m'éclairer.
Si possible, évitez de mettre juste un lien répondant à mes questions mais copiez-collez-le ici car je suis au travail (c'est dans ce cadre que je pose ces questions) et il n'est pas certain que j'aie le droit d'accéder à ces liens depuis mon poste.
Merci d'avance pour votre aide !
Astro-Pépito
Message édité par Astro-Pepito le 10-08-2010 à 16:44:52