[Catégorie modifiée VB6 -> VBA] importation données feuille à une autre

sebchap Messages postés 2 Date d'inscription mardi 26 avril 2011 Statut Membre Dernière intervention 26 avril 2011 - 26 avril 2011 à 10:25
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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

NumLig2 = ActiveSheet.Cells(1, 1).End(xlDown).Offset(1, 0).Row

Cells(NumLig2, 1).Select

ActiveSheet.Paste

End If

Next

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

NumLig3 = ActiveSheet.Cells(1, 1).End(xlDown).Offset(1, 0).Row

Cells(NumLig3, 1).Select

ActiveSheet.Paste

End If

Next

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

NumLig4 = ActiveSheet.Cells(1, 1).End(xlDown).Offset(1, 0).Row

Cells(NumLig4, 1).Select

ActiveSheet.Paste

End If

Next

End With


End Sub


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

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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
et pour l'utiliser :
Call maSub(ActiveWorkbook.Workseets("Data2")
Call maSub(ActiveWorkbook.Workseets("Data3")
Sachant que tu peux aussi énumérer par une boucle la liste des feuilles d'un classeur avec un boucle, grand classique du VBA Excel :
    Dim maSheet As Worksheet
    For Each maSheet In ActiveWorkbook.Sheets
        If maSheet.Name <> "Synthesis" Then
            Call maSub(maSheet)
        End If
    Next

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
[img]http://allproj
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
26 avril 2011 à 11:32
PS : Précaution : Au lieu de travailler avec ActiveSheet, mieux vaut désigner la feuille par son nom, cela évitera les erreurs de manips.
0
sebchap Messages postés 2 Date d'inscription mardi 26 avril 2011 Statut Membre Dernière intervention 26 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) ?

Seb
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
26 avril 2011 à 13:42
Comme je te l'ai expliqué, il faut programmer une boucle :

Tu lis ta ligne de donnée source.

Tu parcoures la première colonne de ta feuille cible à la recherche du contenu de la première cellule de ta ligne source (voir enregistreur de macro).

Si tu trouves une égalité, tu parcoures ensuite les autres cellules, à l'horizontal, grâce à une boucle et Offset.

Si chaque cellule est identique, tu sors de la Sub.

Sinon, tu continues ta recherche verticale.

Si aucune ligne n'est identique, tu la colles.
0
Rejoignez-nous