Bonjour à tous et meilleurs voeux pour cette nouvelle année 2019,
Parmi mes projets VBA, je cherche à développer par moi-même une macro VBA pour mettre la consolidation dans une feuille ("MAIN") des autres feuilles de calcul excel (dans un 1ier temps au sein d'un même classeur).
Je suis arrivé à un bon résultat mais on pourrait améliorer le côté dynamique du code pour éviter de l'adapter au cas par cas....
Dans ma démarche, je récupère via des boucles, le contenu de mes onglets et je les mets dans un tableau dynamique nommé A()
En supposant que les onglets aient uniquement 3 colonnes, pouvez-vous m'expliquer pourquoi ceci fonctionne :
Bonjour à tous et meilleurs voeux pour cette nouvelle année 2019,
Parmi mes projets VBA, je cherche à développer par moi-même une macro VBA pour mettre la consolidation dans une feuille ("MAIN") des autres feuilles de calcul excel (dans un 1ier temps au sein d'un même classeur).
Je suis arrivé à un bon résultat mais on pourrait améliorer le côté dynamique du code pour éviter de l'adapter au cas par cas....
Dans ma démarche, je récupère via des boucles, le contenu de mes onglets et je les mets dans un tableau dynamique nommé A()
En supposant que les onglets aient uniquement 3 colonnes, pouvez-vous m'expliquer pourquoi ceci fonctionne :
Bonjour,
Dans la première ligne de code tu bornes la plge à 3 colonne (de A à C).
Par contre dans la seconde, tu as mis nbcolonne qui ne correspond surement pas à 3.
Essaie en remplaçant nbcolonne par 3.
J'avais déjà testé avec 3.
Je publie mon code complet cela sera plus simple
VB:
Option Explicit
Option Base 1
Sub ConsolidateData()
'Objectif : consolider le contenu de plusieurs onglets dans un seul
'variables tableaux
Dim A() As Variant
'variables de dimensions
Dim nbOnglet, nbligne As Integer
Dim nbcolonne As Variant
Dim nbTotalCellule, nbTotalLigne, nbTotalColonne As Long
'variables d'index -> parcours des grilles xls
Dim f, i, j As Integer
nbOnglet = Worksheets.Count
nbTotalCellule = 0
nbTotalLigne = 0
nbTotalColonne = 0
nbcolonne = InputBox("Veillez entrer le nombre de colonne que comporte le fichier standard : ")
'contrôle de la saisie
If nbcolonne < 1 Then
MsgBox "Vous ne pouvez saisir qu'un nombre entier positif ! "
Exit Sub
End If
If Not IsNumeric(nbcolonne) Then
MsgBox "Vous ne pouvez saisir qu'un nombre entier positif ! "
Exit Sub
End If
'import des valeurs
For f = 2 To nbOnglet
nbligne = WorksheetFunction.CountA(Worksheets(f).Range("A:A"))
For i = 1 To nbligne
nbTotalLigne = nbTotalLigne + 1
For j = 1 To nbcolonne
nbTotalColonne = nbTotalColonne + 1
ReDim Preserve A(3, nbTotalLigne)
A(j, nbTotalLigne) = Worksheets(f).Cells(i, j)
nbTotalCellule = nbTotalCellule + 1
Next j
Next i
Next f
MsgBox ("Pour info, Nb total d'onglets importés : " & nbOnglet - 1)
MsgBox ("Pour info, Nb total de lignes importées : " & nbTotalLigne)
MsgBox ("Pour info, Nb total de cellules importées : " & nbTotalCellule)
'restitution des valeurs
'Worksheets(1).Range("A1:C" & nbTotalLigne) = WorksheetFunction.Transpose(A)
Worksheets(1).Range(Cells(1, 1), Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A)
Dans l'instruction Worksheets(1).Range("A1:C" & nbTotalLigne) = WorksheetFunction.Transpose(A) , le range est entièrement qualifié par Worksheets(1). Ce qu'il y a dans le Range(...) est une chaine de caractères et ne contient aucune référence de cellules.
Dans l'instruction Worksheets(1).Range(Cells(1, 1), Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A), les cellules composant le range ne sont pas préfixées. Si le Range et les "cells" qui le composent ne sont pas sur la même feuille alors on a une erreur.
Essayez : Worksheets(1).Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A)
ou bien With Worksheets(1)
.Range(.Cells(1, 1), .Cells(nbTotalLigne, nbcolonne))= WorksheetFunction.Transpose(A)
End with
ou bien Worksheets(1).Select
Range(Cells(1, 1), Cells(nbTotalLigne, nbcolonne))= WorksheetFunction.Transpose(A)
Bonjour,
Je m'aperçois que je n'avais pris la peine de vous remercier... C'est chose faite maintenant !
Worksheets(1).Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A) fonctionne très bien dans mon cas.
merci
Bon après-midi