[Résolu] Problème concaténation et chemin vers autre classeur

Problème concaténation et chemin vers autre classeur [Résolu] - VB/VBA/VBS - Programmation

Marsh Posté le 03-08-2010 à 15:13:49    

Bonjour à tous,
 
 
J'ai deux problèmes en Visual Basic pour Excel :

  • J'ai un grand nombre de variables aux noms très proches : elles s'appellent toutes Variable01, Variable02... jusqu'à Variable48. Sur chacune de ces variables, je dois faire un test d'une quinzaine de lignes ce qui donne, comme vous pouvez le constater, un code de 720 lignes pour un bête copier-coller très chiant à modifier lorsqu'une amélioration est faite. Je voudrais donc savoir s'il y a moyen de simplifier cela, notamment en faisant une concaténation du nom de variable : d'un côté Variable et d'un autre XX prenant les valeurs de 01 à 48 grâce à une boucle. J'ai bien sûr essayé avec & mais ca n'a pas fonctionné. Avez-vous une idée ?
  • Un peu dans le même style, je voudrais faire appel à des données situées dans un autre classeur Excel. À chaque fois, le classeur s'appelle ClasseurExcel.xls et la feuille FeuilleCalcul. Bien que je ne connaisse pas la syntaxe de la fonction à utiliser pour appeler une cellule d'une feuille d'un autre classeur, je sais que c'est faisable. Ce que je voudrais, c'est mettre ce chemin vers la feuille de calcul dans une variable Chemin puis l'appeler dans le test des 48 variables précédentes (ca m'évitera de le changer 48 fois si jamais il est modifié ultérieurement). Il faut savoir que la cellule de la feuille de calcul concernée change selon le résultat du test. Pouvez-vous me dire comment faire ceci ?


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 cité 2 fois
Message édité par Astro-Pepito le 10-08-2010 à 16:44:52
Reply

Marsh Posté le 03-08-2010 à 15:13:49   

Reply

Marsh Posté le 03-08-2010 à 17:39:20    

Astro-Pepito a écrit :

Bonjour à tous,
 
 
J'ai deux problèmes en Visual Basic pour Excel :

  • J'ai un grand nombre de variables aux noms très proches : elles s'appellent toutes Variable01, Variable02... jusqu'à Variable48. Sur chacune de ces variables, je dois faire un test d'une quinzaine de lignes ce qui donne, comme vous pouvez le constater, un code de 720 lignes pour un bête copier-coller très chiant à modifier lorsqu'une amélioration est faite. Je voudrais donc savoir s'il y a moyen de simplifier cela, notamment en faisant une concaténation du nom de variable : d'un côté Variable et d'un autre XX prenant les valeurs de 01 à 48 grâce à une boucle. J'ai bien sûr essayé avec & mais ca n'a pas fonctionné. Avez-vous une idée ?


Bah utilise un tableau au lieu d'une série de variable...
 
ce qui devrait te faciliter la vie :o
 

Astro-Pepito a écrit :


  • Un peu dans le même style, je voudrais faire appel à des données situées dans un autre classeur Excel. À chaque fois, le classeur s'appelle ClasseurExcel.xls et la feuille FeuilleCalcul. Bien que je ne connaisse pas la syntaxe de la fonction à utiliser pour appeler une cellule d'une feuille d'un autre classeur, je sais que c'est faisable. Ce que je voudrais, c'est mettre ce chemin vers la feuille de calcul dans une variable Chemin puis l'appeler dans le test des 48 variables précédentes (ca m'évitera de le changer 48 fois si jamais il est modifié ultérieurement). Il faut savoir que la cellule de la feuille de calcul concernée change selon le résultat du test. Pouvez-vous me dire comment faire ceci ?



 
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 :


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


Je crois qu'un tutoriel VBA serait le bien venu sur cette section :o

Message cité 1 fois
Message édité par Xxxaaavvv le 03-08-2010 à 17:39:49
Reply

Marsh Posté le 04-08-2010 à 09:59:43    

Xxxaaavvv a écrit :


Je crois qu'un tutoriel VBA serait le bien venu sur cette section :o

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 :

  • J'ai un grand nombre de variables aux noms très proches : elles s'appellent toutes Variable01, Variable02... jusqu'à Variable48. Sur chacune de ces variables, je dois faire un test d'une quinzaine de lignes ce qui donne, comme vous pouvez le constater, un code de 720 lignes pour un bête copier-coller très chiant à modifier lorsqu'une amélioration est faite. Je voudrais donc savoir s'il y a moyen de simplifier cela, notamment en faisant une concaténation du nom de variable : d'un côté Variable et d'un autre XX prenant les valeurs de 01 à 48 grâce à une boucle. J'ai bien sûr essayé avec & mais ca n'a pas fonctionné. Avez-vous une idée ?

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 :

  • Un peu dans le même style, je voudrais faire appel à des données situées dans un autre classeur Excel. À chaque fois, le classeur s'appelle ClasseurExcel.xls et la feuille FeuilleCalcul. Bien que je ne connaisse pas la syntaxe de la fonction à utiliser pour appeler une cellule d'une feuille d'un autre classeur, je sais que c'est faisable. Ce que je voudrais, c'est mettre ce chemin vers la feuille de calcul dans une variable Chemin puis l'appeler dans le test des 48 variables précédentes (ca m'évitera de le changer 48 fois si jamais il est modifié ultérieurement). Il faut savoir que la cellule de la feuille de calcul concernée change selon le résultat du test. Pouvez-vous me dire comment faire ceci ?

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.

Message cité 1 fois
Message édité par SuppotDeSaTante le 04-08-2010 à 10:01:45

---------------
Soyez malin, louez entre voisins !
Reply

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).

Reply

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...


---------------
Soyez malin, louez entre voisins !
Reply

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 :D
 
ça ressemble plus à un cumul de questions spécifiques en un seul topic qu'une faq, ou un tutoriel.

Reply

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 !

Reply

Marsh Posté le 04-08-2010 à 22:21:00    

Donc pour la 1ere question :

Code :
  1. Sub toto()
  2. 'On declare notre variable de type classeur
  3. Dim NouvClasseur As Workbook
  4. 'on attribue le classeur à ouvrir a cette variable et en meme temps on l'ouvre.
  5. Set NouvClasseur = Application.Workbooks.Open("C:\Test.xls" )
  6. 'Derriere on peut donc utiliser notre variable comme si c'etait notre classeur
  7. 'L'instruction With permet de faire reference a un objet ou une variable. Derriere on n'a plus besoin de repeter _
  8. variable, un point suffit
  9. 'Le point permet d'acceder a la valeur d’une propriéte d’un objet particulier en écrivant Objet.propriété
  10. With NouvClasseur
  11.     .Sheets("Feuil1" ).Range("A1" ) = "toto"
  12.     .Sheets("Feuil1" ).Range("A1" ).Font.Color = -16776961
  13.     'etc.
  14. End With
  15. End Sub


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 :
  1. Sub toto()
  2. 'On declare notre variable de type classeur
  3. Dim Tableau1 As Workbook, Tableau2 As Workbook
  4. Dim NomTableau1 as String, NomTableau2 as String, CelluleSource as string, CelluleCible as string
  5. NomTableau1 = ActiveWorkbook.Name 'on recupere le nom du document ouvert sur lequel on est positionné, donc Tableau1 (sans ".xls" )
  6. CelluleSource = "B1" 'La cellule qui va etre utilisé comme source
  7. NomTableau2 = "C:\Tableau2.xls"
  8. CelluleCible = "A1" 'la cellule qui utiliser la cellule source comme... source... :-D
  9. 'on attribue le classeur à ouvrir a cette variable et en meme temps on l'ouvre en utilisant la variable chaine NomTableau2
  10. Set Tableau2 = Application.Workbooks.Open(NomTableau2)
  11. 'On utilise le point comme vu plus haut avec With _
  12. 'Et on va inserer une formule du type =[Tableau1]Feuil1!$A$1
  13. With Tableau2
  14.     .Sheets("Total" ).Range(CelluleCible ).Formula = "=[" & NomTableau1 & "]!Total" & CelluleSource 'on utilise la propriété Formula pour dire qu'on va inserer une formule dans notre cellule cible, et dedans on va concatener la syntaxe pointant vers une cellule d'un classeur avec la chaine CelluleSource
  15.     'etc.
  16. End With
  17. End Sub


 
Ou encore en parametrant le nom du Tableau1

Code :
  1. Sub toto()
  2. 'On declare notre variable de type classeur
  3. Dim Tableau1 As Workbook, Tableau2 As Workbook
  4. Dim NomTableau1 As String, NomTableau1_SSChemin As String, NomTableau1_Chemin As String, NomTableau2 As String, CelluleSource As String, CelluleCible As String
  5. NomTableau1 = "C:\Tableau1.xls"
  6. 'on recupere juste le nom de NomTableau1 en enlevant le chemin car on a besoin de separer chemin et nom du classeur pour les formules. _
  7. Les formules faisant reference a un classeur avec un chemin sont de ce type : ='C:\[test.xls]Feuil1'!A1
  8. 'Et on va utilise la propriété Formula pour mettre une formule de ce type dans notre cellule
  9. For x = Len(NomTableau1) To 1 Step -1
  10.     If Mid(NomTableau1, x, 1) <> "\" Then
  11.         NomTableau1_SSChemin = Right(NomTableau1, Len(NomTableau1) - (x - 1))
  12.     Else
  13.         Exit For
  14.     End If
  15. Next x
  16. 'on en recupere le chemin
  17. NomTableau1_Chemin = Left(NomTableau1, Len(NomTableau1) - Len(NomTableau1_SSChemin))
  18. CelluleSource = "B1" 'La cellule qui va etre utilisé comme source
  19. NomTableau2 = "C:\Tableau2.xls"
  20. CelluleCible = "A1" 'la cellule qui utiliser la cellule source comme... source... :-D
  21. 'on attribue le classeur à ouvrir a cette variable et en meme temps on l'ouvre en utilisant la variable chaine NomTableau2
  22. Set Tableau2 = Application.Workbooks.Open(NomTableau2)
  23. 'On utilise le point comme vu plus haut avec With _
  24. 'Et on va inserer une formule du type ='C:\[test.xls]Feuil1'!A1
  25. With Tableau2
  26.     .Sheets("Total" ).Range(CelluleCible ).Formula = "='" & NomTableau1_Chemin  & "[" & NomTableau1_SSChemin  & "]!Total'!" & CelluleSource 'on utilise la propriété Formula pour dire qu'on va inserer une formule dans notre cellule cible, et dedans on va concatener la syntaxe pointant vers une cellule d'un classeur avec la chaine CelluleSource
  27.     'etc.
  28. End With
  29. End Sub


 
 
 
 
 
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 :
  1. For x = 1 to 2
  2.    For y = 1 to 50
  3.       'ici a va prendre tour a tour les valeur de A1, A2, A3 etc. Puis B1, B2 etc.
  4.       A = Cells(Y,X).value
  5.       'donc tu peux mettre un test du genre si la cellule contient toto, par ex A1, qu'il marque le message "La cellule A1 contient Toto"
  6.       If Cells(Y,X).value = "Toto" then Msgbox "La cellule " & Cells(Y,X).Address & " contient Toto"
  7.    Next y
  8. Next x


 
Tu peux aussi utiliser le Select, l'equivalant du Switch de Php

Code :
  1. For x = 1 to 2
  2.    For y = 1 to 50
  3.       Select Case Cells(Y,X).Value
  4.          Case "toto"
  5.              Msgbox "La cellule " & Cells(Y,X).Address & " contient Toto"
  6.          Case 1
  7.              Msgbox "La cellule est egale à 1"
  8.          case else 'les cas non detecté avant
  9.              msgbox "La cellule contient autre chose"
  10.       End Select
  11.    Next y
  12. Next x


 
 
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... :D
 
 
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.


Message édité par SuppotDeSaTante le 04-08-2010 à 23:06:12

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 04-08-2010 à 23:07:48    

Fin des edit :D


---------------
Soyez malin, louez entre voisins !
Reply

Marsh 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 :D

Reply

Marsh Posté le 05-08-2010 à 11:34:19   

Reply

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
3x 05 ; 5x 05
8x 45 ; 3x 24 ; 3x 12
2x 44 ; 2x 05
...


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 :)

Reply

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 :
  1. Sub Pepito()
  2. 'Nom et chemin du classeur 1
  3. Classeur1 = "C:\Test1.xls"
  4. 'Nom et chemin du classeur 2
  5. Classeur2 = "C:\Test2.xls"
  6. 'on recuper le "nom excel" des fichier
  7. For x = Len(Classeur1) To 1 Step -1
  8.     If Mid(Classeur1, x, 1) <> "\" Then
  9.         ExcClasseur1 = Right(Classeur1, Len(Classeur1) - (x - 1))
  10.     Else
  11.         Exit For
  12.     End If
  13. Next x
  14. For x = Len(Classeur2) To 1 Step -1
  15.     If Mid(Classeur2, x, 1) <> "\" Then
  16.         ExcClasseur2 = Right(Classeur2, Len(Classeur2) - (x - 1))
  17.     Else
  18.         Exit For
  19.     End If
  20. Next x
  21. 'On se positionne sur classeur1 et on recupere la derniere ligne pour boucler
  22. Workbooks(ExcClasseur1).Activate
  23. Range("A65536" ).Select
  24. Selection.End(xlUp).Select
  25. DerniereLigne = ActiveCell.Row
  26. 'on defini l'objet feuille "Total" de "Classeur1.xls". Plus facile pour utililser les propriétés comme Cells etc.
  27. Set BF1 = Workbooks(ExcClasseur1).Worksheets("Total" )
  28. 'On ouvre le second classeur
  29. Workbooks.Open Filename:=Classeur2
  30. 'idem, on defini l'objet feuille "Total" de "Classeur2.xls". Plus facile pour utililser les propriétés comme Cells etc.
  31. Set BF2 = Workbooks(ExcClasseur2).Worksheets("Total" )
  32. 'Comme on veut regrouper 2 lignes on va boucler une ligne sur 2
  33. 'toi comme tu as 36 colonnes tu ajoutes une boucle avant pour les colonnes
  34. For x = 2 To DerniereLigne Step 2
  35.     'On concatene la valeur de la cellule en cours et celle du dessous
  36.     ValCell = BF1.Cells(x, 1) & " ; " & BF1.Cells(x + 1, 1)
  37.     'on compte le nombre d'occurence de la lettre "X" pour faire les sommes par colonnes
  38.     NbOc = (Len(ValCell) - Len(Replace(ValCell, "X", "", , , 1))) / Len("X" )
  39.    
  40.     'PAR LA TU DOIS AVOIR TON ALGO QUI RECUPERE LA SOMME POUR CHAQUE NUMERO DE COLONNE
  41.    
  42.     'On met le resultat, ici moi c'est bidon, dans le classeur 2
  43.     BF2.Cells(x, 1) = "toto"
  44.     BF2.Cells(x, 1) = "tata"
  45.     'etc.
  46. Next x
  47. End Sub


 
A quoi ressemble ton algo qui te permets d'avoir les sommes par colonne ?


Message édité par SuppotDeSaTante le 06-08-2010 à 15:38:08

---------------
Soyez malin, louez entre voisins !
Reply

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 :
  1. Dim ObjectNumber, PositionFirstXInCell, PositionFirstXInNextCell, Number, Position, Add As Integer
  2. Dim Prefix, Display As String
  3. Dim Continue As Boolean
  4. ObjectNumber = 0 ' Nombre de composants (ensembles de 2 cases non vides)
  5. ' BeginColumn, EndColumn, BeginRow et EndRow sont des paramètres situant les limites du tableau 1 (dans la feuille Total de Tableau1.xls) pour plus de flexibilité
  6. For Column = BeginColumn To EndColumn
  7.     For Row = BeginRow + 1 To EndRow - 2 Step 2 ' Les bornes sont normales, elles doivent être ainsi définies pour étudier mon tableau
  8.         PositionFirstXInCell = InStr(Cells(Row, Column), "x" )
  9.         PositionFirstXInNextCell = InStr(Cells(Row + 1, Column), "x" )
  10.        
  11.         If PositionFirstXInCell > 0 Or PositionFirstXInNextCell > 0 Then ' On trouve un composant si au moins une des deux cellules est non vide
  12.             ObjectNumber = ObjectNumber + 1
  13.            
  14.             For Reference = 1 To 48 ' On cherche d'abord les 01, puis 02... jusqu'à 48
  15.                 If Reference >= 10 Then
  16.                     Prefix = ""
  17.                 Else
  18.                     Prefix = "0"
  19.                 End If
  20.                
  21.                 Number = 0
  22.                
  23.                 ' Cette boucle est celle qui récupère et additionne les X dans les deux cases du composant
  24.                 For CheckRow = Row To Row + 1
  25.                     Continue = True
  26.                     Position = 1
  27.                    
  28.                     Do While Continue = True
  29.                         Position = InStr(Position + 3, Cells(CheckRow, Column), Prefix & CStr(Reference))
  30.                        
  31.                         If Position > 0 Then ' Si on a trouvé la chaîne recherchée
  32.                             If Position = 3 Then ' On ne peut avoir un nombre à deux chiffres que dans le premier "Xx XX" de chaque cellule, tout le reste du temps c'est un seul chiffre
  33.                                 Add = Mid(Cells(CheckRow, Column), Position - 4, 2)
  34.                             Else
  35.                                 Add = Mid(Cells(CheckRow, Column), Position - 3, 1)
  36.                             End If
  37.                         Else
  38.                             Add = 0
  39.                             Continue = False
  40.                         End If
  41.                        
  42.                         Number = Number + Add
  43.                     Loop
  44.                 Next CheckRow
  45.                
  46.                 If Number > 0 Then
  47.                     Display = CStr(Number)
  48.                 Else
  49.                     Display = ""
  50.                 End If
  51.                
  52.                 ' FirstRow et FirstColumn sont des paramètres situant la première cellule du tableau 2 (dans la feuille Total de Tableau2.xls)
  53.                 Cells(FirstRow + ObjectNumber - 1, FirstColumn + Reference - 1) = Display ' ObjectNumber et Reference commencent à 1 donc on retranche 1 pour commencer dans la bonne case du tableau 2
  54.             Next Reference
  55.         End If
  56.     Next Row
  57. Next Column


 
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 ;-)


Message édité par Astro-Pepito le 09-08-2010 à 14:21:39
Reply

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.

Reply

Marsh Posté le 10-08-2010 à 20:48:51    

Set BF1 = Workbooks(ExcClasseur1)
BF1.Close
 
Ca devrait le faire


---------------
Soyez malin, louez entre voisins !
Reply

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 :)

Reply

Sujets relatifs:

Leave a Replay

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