VBA Boucle copier/coller dans boucle d extraction

Bonjour à tous

je souhaite avoir votre expertise pour ameliorer ma macro, apres plusieurs essais et recherches internet je ne trouve pas de solution qui fonctionne c est pourquoi je me tourne vers vous.

La macro qui suit a pour but : ouvrir l explorateur de fichier, permettre à l´utilisateur de selectionner 1 ou plusieurs fichiers, d en extraire des données et de les copier dans le fichier de la macro.

Le code suivant fonctionne pour 1 fichier :

Sub Macro1()

End Sub

Actuellement le fichier copie colle tout sur la meme colonne je voudrais donc ajouter une conditions qui dit : si le colonne i est vide alors copier à cette endroit sinon se decaler à la prochaine vide et copier ici, je voudrais que la macro fonctionne que je selectionne 10 fichiers d un coup ou 1 par 1. par exemple si j en ai selectionner 3 fichier, mes colonnes de 1 à 6 sont pleines et si j´ajoute une nouveau fichier alors les colonnes 7 et 8 se remplissent.

J´espere que mon explication est compréhensible

Ps : je suis débutant en VBA il est possible que meme si ce code fonctionne il y ait des abérrations

Ps2 : je joint ma macro et 2 fichiers avec des données à extraire

Pouvez vous s´il vous plait m´aider

Merci par avance

Jules

15test1.xlsm (18.34 Ko)

bonjour,

proposition de correction

Sub Macro1()
    Application.EnableEvents = False
    Dim wbsrc As Excel.Workbook    ' déclarer le fichier source
    Dim wbtrg As Excel.Workbook    ' déclarer le fichier detinataire
    Dim ws As Excel.Worksheet   ' declarer les feuil
    Dim intChoice As Integer   'Déclarer les variables de base
    Dim fic As Integer
    Dim i As Integer
    Dim cellule As Range
    Dim maref As String
    Dim col As Integer
    Dim lig As Integer
    Dim x As Integer
    Dim StrFile As String

    Application.ScreenUpdating = False
    Application.Cursor = xlWait
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        intChoice = .Show
        If intChoice <> 0 Then
            Set wbtrg = ThisWorkbook    ' dire que c'est sur ce fichier que je travail
            Set ws = wbtrg.Worksheets("Sheet1")  ' coller le resultat dans la feuil source du fichier destinataire
            i = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 1    'Has to be the number of the column at the beginning of the table where you want to extract
            For fic = 1 To .SelectedItems.Count
                Workbooks.Open .SelectedItems(fic)
                Set wbsrc = ActiveWorkbook
                Set wk = wbsrc.Worksheets("all Dir static measurements")
                maref = "S1_Z-Dir ±4KN"
                Set cellule = wk.Cells.Find(maref, LookIn:=xlValues, SearchOrder:=xlByRows, MatchCase:=False)
                If cellule Is Nothing Then
                    MsgBox "Ref not found !"
                    Exit Sub
                End If
                col = cellule.Column
                lig = cellule.Row
                x = lig + 5    'le nombre correspond au nbr de ligne entre la cellule maref et le premiere ligne de donnée

                wk.Range("B" & x & ":B" & Range("B" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i)    'copy and paste the data from the first line to the last not empty
                wk.Range("C" & x & ":C" & Range("C" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i + 1)
                i = i + 2
                wbsrc.Close savechanges:=False  ' fermer le fichier source
            Next fic
            Set ws = Nothing
            Set wbsrc = Nothing
            Set wbtrg = Nothing
        Else
            MsgBox "La procédure est annulée car aucun fichier n’a été entré."
        End If
    End With
    Application.ScreenUpdating = True
    Application.Cursor = xlDefault
    Application.EnableEvents = True
    MsgBox "Import terminé"
End Sub

ça fonctionne parfaitement

Merci beaucoup

Bonne journée à vous

Jules

Juste une question, je suis pas sur de comprendre comment vous donnez un colonnes de "depart" pour la ou vous collez, si par exemple je veux que ma première colonne de données collée soit la 10 eme comment je fais ? parceque en changeant

i = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 8

je me retrouve bien avec la premiere décalée mais apres il y a un interval de 8 entre chaque colonne

Parceque apres je dois copier cette macro pour qu elle puisse se reproduire sur 20 type de test differents que je veux tous extraire dans un meme fichier mais dans des tableau differents (voir excel joint pour se representer la chose)

Merci a vous pour la rapidité de votre réponse précedente

re-bonjour,

j'avais laissé une ligne parasite dans le code que j'ai proposée. c'est entretemps corrigé (voir plus haut)

pour commencer à la colonne 10, plutot qu'à la première colonne à droite de la dernière colonne utilisée, il faut remplacer

 i = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 1    'Has to be the number of the column at the beginning of the table where you want to extract

par

 i = 10    'Has to be the number of the column at the beginning of the table where you want to extract

Merci encore pour votre réponse rapide

Mais du coup si je remplace i = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 1 par i=10 tout le principe d ajouter une les colonnes les une à la suite des autres ne fonctionne plus, quand j en extrait une puis que j´en extrait une autre elle prend juste sa place non ? y aurait il un moyen d´avoir les deux ?

Parceque votre version est vraiment parfaite et correspond excatement à ce que je voulais, seulement mes tableaux dans lesquels je souhaite extraire ne commence jamais à la colonne 2

Du coup j aimerai pouvoir choisir la première colonne et garder le principe de commencer à droite de la dernière utilisée

Merci pour votre aide

bonjour,

j'ai dû mal à comprendre ceci

(...) seulement mes tableaux dans lesquels je souhaite extraire ne commence jamais à la colonne 2 (...)

la macro ouvre tous les fichiers sélectionnés et copie toujours les colonnes 2 et 3 du fichier source. Je suppose que tu parles de la colonne de destination qui ne peut jamais être la 2ème.

voici une correction, selon cette compréhension.

Sub Macro1()
    Application.EnableEvents = False
    Dim wbsrc As Excel.Workbook    ' déclarer le fichier source
    Dim wbtrg As Excel.Workbook    ' déclarer le fichier detinataire
    Dim ws As Excel.Worksheet   ' declarer les feuil
    Dim intChoice As Integer   'Déclarer les variables de base
    Dim fic As Integer
    Dim i As Integer, dc As Long
    Dim cellule As Range
    Dim maref As String
    Dim col As Integer
    Dim lig As Integer
    Dim x As Integer
    Dim StrFile As String

    Application.ScreenUpdating = False
    Application.Cursor = xlWait
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        intChoice = .Show
        If intChoice <> 0 Then
            Set wbtrg = ThisWorkbook    ' dire que c'est sur ce fichier que je travail
            Set ws = wbtrg.Worksheets("Sheet1")  ' coller le resultat dans la feuil source du fichier destinataire
            i = 10    'première colonne
            dc = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 1    'Has to be the number of the column at the beginning of the table where you want to extract
            If dc < i Then dc = i

            For fic = 1 To .SelectedItems.Count
                Workbooks.Open .SelectedItems(fic)
                Set wbsrc = ActiveWorkbook
                Set wk = wbsrc.Worksheets("all Dir static measurements")
                maref = "S1_Z-Dir ±4KN"
                Set cellule = wk.Cells.Find(maref, LookIn:=xlValues, SearchOrder:=xlByRows, MatchCase:=False)
                If cellule Is Nothing Then
                    MsgBox "Ref not found !"
                    Exit Sub
                End If
                col = cellule.Column
                lig = cellule.Row
                x = lig + 5    'le nombre correspond au nbr de ligne entre la cellule maref et le premiere ligne de donnée

                wk.Range("B" & x & ":B" & Range("B" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i)    'copy and paste the data from the first line to the last not empty
                wk.Range("C" & x & ":C" & Range("C" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i + 1)
                i = i + 2
                wbsrc.Close savechanges:=False  ' fermer le fichier source
            Next fic
            Set ws = Nothing
            Set wbsrc = Nothing
            Set wbtrg = Nothing
        Else
            MsgBox "La procédure est annulée car aucun fichier n’a été entré."
        End If
    End With
    Application.ScreenUpdating = True
    Application.Cursor = xlDefault
    Application.EnableEvents = True
    MsgBox "Import terminé"
End Sub

oui c´est bien ça je me suis mal exprimé.

Par contre la solution n´est pas exactement ça, désolé je suis chiant j´imagine. Merci beaucoup pour votre aide

Si c est pas trop demandé j´aimerai juste savoir comment faire, parceque avec votre derniere solution si je selectionne plusieurs fichiers en meme temps et avec i=10 alors ça me les colles bien tous à partir de la colonne 10 donc parfait, mais si je les selectionne 1 par 1 ça remplace juste et je peux pas les avoirs à la suite. Je sais pas si c´est possible d´avoir les deux solutions en meme temps.

merci pour votre temps, vous m´avez déja beaucoup aidé

re-bonjour,

je crois que je ne suis pas bien réveillé, désolé. voici une correction

Sub Macro1()
    Application.EnableEvents = False
    Dim wbsrc As Excel.Workbook    ' déclarer le fichier source
    Dim wbtrg As Excel.Workbook    ' déclarer le fichier detinataire
    Dim ws As Excel.Worksheet   ' declarer les feuil
    Dim intChoice As Integer   'Déclarer les variables de base
    Dim fic As Integer
    Dim i As Integer, dc As Long
    Dim cellule As Range
    Dim maref As String
    Dim col As Integer
    Dim lig As Integer
    Dim x As Integer
    Dim StrFile As String

    Application.ScreenUpdating = False
    Application.Cursor = xlWait
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        intChoice = .Show
        If intChoice <> 0 Then
            Set wbtrg = ThisWorkbook    ' dire que c'est sur ce fichier que je travail
            Set ws = wbtrg.Worksheets("Sheet1")  ' coller le resultat dans la feuil source du fichier destinataire
            i = 10    'première colonne
            dc = ws.Cells(9, Columns.Count).End(xlToLeft).Column + 1    'Has to be the number of the column at the beginning of the table where you want to extract
            If dc > i Then i = dc

            For fic = 1 To .SelectedItems.Count
                Workbooks.Open .SelectedItems(fic)
                Set wbsrc = ActiveWorkbook
                Set wk = wbsrc.Worksheets("all Dir static measurements")
                maref = "S1_Z-Dir ±4KN"
                Set cellule = wk.Cells.Find(maref, LookIn:=xlValues, SearchOrder:=xlByRows, MatchCase:=False)
                If cellule Is Nothing Then
                    MsgBox "Ref not found !"
                    Exit Sub
                End If
                col = cellule.Column
                lig = cellule.Row
                x = lig + 5    'le nombre correspond au nbr de ligne entre la cellule maref et le premiere ligne de donnée

                wk.Range("B" & x & ":B" & Range("B" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i)    'copy and paste the data from the first line to the last not empty
                wk.Range("C" & x & ":C" & Range("C" & x).End(xlDown).Row).Copy Destination:=ws.Cells(9, i + 1)
                i = i + 2
                wbsrc.Close savechanges:=False  ' fermer le fichier source
            Next fic
            Set ws = Nothing
            Set wbsrc = Nothing
            Set wbtrg = Nothing
        Else
            MsgBox "La procédure est annulée car aucun fichier n’a été entré."
        End If
    End With
    Application.ScreenUpdating = True
    Application.Cursor = xlDefault
    Application.EnableEvents = True
    MsgBox "Import terminé"
End Sub

C est parfait

tout fonctionne niquel, merci pour votre temps et votre réactivité

Bonne fin de journée

Jules

Bonjour, je me permets de réouvrir le sujet.

La macro fonctionne tres bien seulement je rencontre un nouveau problème que je peine à résoudre

Pour bien comprendre voir l excel joint, à la feuille "X Data". pour le premier Tableau tout fonctionne bien mais apres quand je veux ajouter une nouvelle série de donnée aprés avoir fais les macros de chaque tableau, elle se met automatiquement dans le dernier tableau (j ai mis de la meme couleur l endroit ou c´était supposé ce mettre et l endroit ou elles se mettent)

J´ai compris d´ou vient le problème, puisque c est la ligne : dc = ws.Cells(11, Columns.Count).End(xlToLeft).Column + 1 qui fait ça, mais je n ai aucune idée de comment résoudre ce problème et internet ne m a pas vraiment aidé pour le moment

Pensez vous qu il est possible de garder le principe de se mettre à droite de la dernière colonne non vide mais en restant sur le meme tableau et que je puisse repeter le motif plusieurs fois sur different tableau d´une meme feuille

Merci par avance

Jules

bonsoir,

essaie en modifiant cette instruction

dc = ws.Cells(11, Columns.Count).End(xlToLeft).Column + 1

ainsi

dc = ws.Cells(11, i + 20).End(xlToLeft).Column + 1

la macro cherchera le numéro de la première colonne non vide à gauche de la colonne i+20 et lui ajoutera 1

Bonjour,

Cette fois ci c´est bon la macro fonctionne parfaitement et elle est terminée

Merci beaucoup à vous

Bonne journée

Jules

Rechercher des sujets similaires à "vba boucle copier coller extraction"