[Catégorie modifiée VB6 -> VBA] importation données feuille à une autre
sebchap
Messages postés2Date d'inscriptionmardi 26 avril 2011StatutMembreDernière intervention26 avril 2011
-
26 avril 2011 à 10:25
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
26 avril 2011 à 13:42
Bonjour,
Je développe une macro sous vb6 afin d'importer, au sein d'un même classeur, les données de plusieurs feuilles vers une autre feuille de synthèse. Ces données sont organisées en tableaux (mêmes colonnes pour toutes les feuilles). Cependant, celle-ci n'est pas du tout optimisée. Par exemple, si elle est lancée deux fois, les données vont être recopiées une deuxième fois dans la feuille de synthèse... Et je n'ai pas trouvé d'autre moyen que de faire une procédure par feuille source, ce qui peut être long si il y a beaucoup de feuilles sources.
Voici la macro:
Sub Importation()
Dim Lig1 As Long, Lig2 As Long, Lig3 As Long, Lig4 As Long
Dim Col1 As String, Col2 As String, Col3 As String, Col4 As String
Dim NbrLig1 As Long, NbrLig2 As Long, NbrLig3 As Long, NbrLig4 As Long
Dim NumLig1 As Long, NumLig2 As Long, NumLig3 As Long, NumLig4 As Long
Workbooks("exemple.xls").Sheets("Synthesis").Select ' feuille de destination, i.e. de synthèse
Col1 = "A" ' colonne de la donnée non vide à tester
Col2 = "A"
Col3 = "A"
Col4 = "A"
NumLig1 = 2
'----------------------------------------------------------------------------------------------------------------------
With Sheets("Data1") ' feuille source numéro 1
NbrLig1 = .Range("A65536").End(xlUp).Row 'Nombre de ligne sur lequel effectuer la procédure, i.e. dernière ligne non vide
For Lig1 = 2 To NbrLig1
If .Cells(Lig1, Col1).Value <> 0 Then
.Cells(Lig1, Col1).EntireRow.Copy
NumLig1 = NumLig1 + 1
Cells(NumLig1 - 1, 1).Select
ActiveSheet.Paste
End If
Next
End With
'------------------------------------------------------------------------------------------------------------------------
With Sheets("Data2") ' feuille source numéro 2
NbrLig2 = .Range("A65536").End(xlUp).Row
For Lig2 = 2 To NbrLig2
If .Cells(Lig2, Col2).Value <> 0 Then
.Cells(Lig2, Col2).EntireRow.Copy
End With
'----------------------------------------------------------------------------------------------------------------------------
With Sheets("Data3") ' feuille source numéro 3
NbrLig3 = .Range("A65536").End(xlUp).Row
For Lig3 = 2 To NbrLig3
If .Cells(Lig3, Col3).Value <> 0 Then
.Cells(Lig3, Col3).EntireRow.Copy
End With
'------------------------------------------------------------------------------------------------------------------------------
With Sheets("Data4") ' feuille source numéro 4
NbrLig4 = .Range("A65536").End(xlUp).Row
For Lig4 = 2 To NbrLig4
If .Cells(Lig4, Col4).Value <> 0 Then
.Cells(Lig4, Col4).EntireRow.Copy
Auriez-vous une solution ou des conseils pour : - supprimer un autre collage de données si on relance la macro
- faire quelque chose qui soit plus simple si on a beaucoup de feuille sources.
Merci par avance.
Seb
A voir également:
[Catégorie modifiée VB6 -> VBA] importation données feuille à une autre
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 26 avril 2011 à 11:31
Salut
Tu fais du VBA, pas du VB6.
"supprimer un autre collage de données si on relance la macro"
Difficile de te répondre ne sachant pas quel critère définit qu'il faut ou pas recopier la ligne.
Malgré tout, s'il ne s'agit que d'éviter les doublons, il suffirait de rechercher dans la feuille de destination le même Item que celui de ta colonne A. Si tu en trouves un, de vérifier que les données situées sur la même ligne sont elles aussi identiques.
Ce n'est qu'un jeu de boucle For-Next et Offset, la aprtie recherche d'une donnée dans une colonne pouvant facilement être généré par l'enregistreur de macro.
"faire quelque chose qui soit plus simple si on a beaucoup de feuille sources"
Si tu exécutes une procédure identique appliquée à chaque feuille, il te suffit de créer une Sub dans laquelle tu mettras cette procédure + en paramètre, la feuille source concernée. Exemple :
Sub maSub(maFeuilleSource As WorkSheet)
With maFeuilleSource
MsgBox .Name
End With
End Sub
sebchap
Messages postés2Date d'inscriptionmardi 26 avril 2011StatutMembreDernière intervention26 avril 2011 26 avril 2011 à 11:46
Merci pour ta réponse rapide. Je vais intégrer une procédure avec la feuille en paramètre afin de pouvoir l'utiliser facilement avec la commande "Call".
Sinon, est-ce que tu aurais un exemple de code que je pourrai intégrer à ma procédure que j'ai mise plus haut, afin justement d'éviter les doublons dans la feuille de synthèse (qui recueille les données copiées des autres feuilles) ?