XL 2016 VBA transférer le contenu d'un tableau dans une plage de cellules

faenor86

XLDnaute Nouveau
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 :

VB:
Worksheets(1).Range("A1:C" & nbTotalLigne) = WorksheetFunction.Transpose(A)

Alors que cela crashe avec une erreur de type 1004 ?
VB:
Worksheets(1).Range(Cells(1, 1), Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A)

Merci d'avance pour votre aide !
 

cp4

XLDnaute Barbatruc
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 :

VB:
Worksheets(1).Range("A1:C" & nbTotalLigne) = WorksheetFunction.Transpose(A)

Alors que cela crashe avec une erreur de type 1004 ?
VB:
Worksheets(1).Range(Cells(1, 1), Cells(nbTotalLigne, nbcolonne)).Value = WorksheetFunction.Transpose(A)

Merci d'avance pour votre aide !
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.

Bonne journée.
 

faenor86

XLDnaute Nouveau
Bonjour,

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)

merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @faenor86, à tous,

A tout hasard (n’ayant pas le fichier).

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)



 
Dernière édition:

faenor86

XLDnaute Nouveau
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
 

Discussions similaires

Statistiques des forums

Discussions
312 074
Messages
2 085 066
Membres
102 770
dernier inscrit
mathieu.lemaitre