[VBA] Collage Variable après copie de tableau de taille variable

Collage Variable après copie de tableau de taille variable [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 06-01-2010 à 22:59:49    

Bonsoir,
 
j'ai écris une petite macro pour accélerer le suivi de certains produits.  
J'ai en effet un nombre de fichier produits variables (ca change tous les ans) dont les titres et chemin de dossiers sont enregistrée dans une liste.
Dans chaque feuille produit, il y a un tableau qui commence toujours au meme endroit mais qui n'a pas toujours le meme nombre de ligne.
 
Le but de la macro de concentrer les donnes d'environ 40 fichiers dans une seul feuille, une sorte de base de données unique,  pour créer un tableau croisé dynamique derrière.  
Elle va donc regarder chaque feuille produit,  copier le tableau qui s'y trouve et  recopier le tableau a la suite du précedent dans une seule feuille.
 
Mon problème est que pour l'instant je n'arrive pas à écrire une copie variable. Les tableaux qui sont copiés ne sont pas de même taille et la copie du tableau suivant doit donc commencer a la fin du précédent au lieu d'écraser les données du précedent !  
 
Est ce que quelqu'un aurait une idée ?  
 
En vous remerciant!  
 
Sub TrackingSheet()
 
'declaration des variables
Dim i As Integer
Dim j, k, l, chemin As String
 
Sheets("liste" ).Activate
 
i = 1
chemin = Cells(1, 6).Value
 
While Cells(i, 1).Value <> ""
     
   'on définit le chemin d'accès du fichier
   chemin = Cells(1, 6).Value
    j = Cells(i, 1).Value (nom du fichier)
    k = Cells(i, 2).Value (extension.xls)
    l = j & "." & k
    chemin = chemin & l
     
    'ouverture du fichier de le nom est chemin
    Workbooks.Open Filename:=(chemin)
     
    'on sélectionne la fenetre active, et l'onglet actif
    Windows(l).Activate
    Sheets("Data" ).Activate
 
     'on copie le tableau de taille variable
    Range("A1" ).CurrentRegion.Select
    Selection.Copy
 
    'on revient dans l'ancienne fenetre
    Windows("Base.xls" ).Activate
    Sheets("Reporting" ).Activate
     
    'On colle
    Cells(i, 1).Select
    ActiveSheet.Paste

 
    i = i + 1
 
    'on réactive la fenetre initiale
    Windows("Base.xls" ).Activate
    Sheets("liste" ).Activate
Wend
   
End Sub
 
 
 
Guillaume

Reply

Marsh Posté le 06-01-2010 à 22:59:49   

Reply

Marsh Posté le 07-01-2010 à 03:14:10    

Bonjour  
 
Voici une solution pour déterminer la dernière ligne d'un tableau :  
 
 
Pour chaque colonne de 1 à 12*,  on détermine à partir du bas, le rang de la dernière cellule non vide. Si le rang trouvé est supérieur au plus grand précédent, "dernière" prend cette valeur, puis te voilà rendu 1 ligne en-dessous de la dernière ligne non vide.  (très rapide)
*Remplace le 12 par le nbre de colonnes de ton tableau

Code :
  1. Dim Ligne, dernière as Integer
  2. Range("a1" ).Select
  3.      For i = 1 To 12
  4. Ligne = Cells(65530, i).end(xlUp).Row
  5. If Ligne > dernière Then dernière = Ligne
  6. Next  i
  7. Range("a" &  dernière).Offset(1,0).Select
  8. ActiveSheet.Paste


 
 
 Par ailleurs, au lieu de récupérer les chemins, onglets, etc, tu peux utiliser ceci sur une feuille visitée:
  Set MaFeuille_1 = ActiveSheet
 
et pour y revenir:
     MaFeuille_1.Select
MaFeuille_2, etc
 
 Bien  cordialement
 
PS: Pour info, tu as aussi cette façon très rapide de frouver la dernière ligne d'une feuille:

Code :
  1. dernière = Range("a1" ).SpecialCells(xlLastCell).Row
  2. Range("a" & dernière).Offset(1, 0).Select
  3. ActiveSheet.Paste


 
Mais attention! cela indique la dernière ligne Ayant été utilisée, qui peut se trouver X lignes plus bas que celle désirée...


Message édité par Laoo le 07-01-2010 à 03:37:19

---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 09-01-2010 à 13:04:45    

Laoo,
 
Un grand merci pour ton aide !  
 
j'ai (bêtement?) intégré ton code à la place du mien dans 'on colle mais maintenant la macro ne me retourne que le tableau de la premiere feuille. La boucle ne semble donc plus marcher.
 
 
Qu'est ce que j'ai bie pu raté? Est ce le fait de définir une deuxième série d'Integer au sein de la macro ? D'autre part, il me semble pas que "dernière" soit définie, la comparaison de la ligne 5 du code n'est peut etre donc pas effective?
 
 
Cordialement,  
 
Guillaume

Reply

Marsh Posté le 09-01-2010 à 13:43:18    

Hello
 
Il faudrait peut-être remplacer mon i par Z, par exemple (et ensuite Next i aussi, bien sûr).
 
Edit: (et ensuite Next Z  aussi, bien sûr).
 
As-tu simplifié ton début de macro?
si tu avais encore un pb, renvoie l'ensemble.
 
A+


Message édité par Laoo le 10-01-2010 à 04:53:22
Reply

Sujets relatifs:

Leave a Replay

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