Copier certaines colonnes d'un classeur vers un autre

6docu-travail.xlsm (16.79 Ko)

Bonjour à tous,

Je cherche à extraire certaines colonne d'un classeur (appelé Résultats_Query_SAP) vers un autre classeur (Docu_Travail).

Il s'agit de colonnes fixes, dont je connais l'emplacement (la deuxième, la sixième et... la dernière), que je veux coller les unes à la suite des autres dans mon nouveau classeur.

J'aimerais également pouvoir lancer ce copier/coller avec un bouton.

J'ai "confidentialisé" les informations disponibles sur le fichier Résultats query (que je ne peux pas retravailler, je dois l'utiliser en l'état) et j'ai aussi réduit le nombre de ligne (plutôt dans les 10 000 normalement).

Précision : les deux fichiers sont rangés dans le même dossier.

Voici mon code :

Option Explicit

Sub Transfert_SAP()

Dim LastLigne As Integer
Dim NumColonne As Integer
Dim LastColonne As Integer
Dim i As Integer

Workbooks.Open Filename:="Resultats_Query_SAP.xlsx"
'Ouvre le fichier avec la Query SAP
Sheets(1).Select
'Sélectionne le premier onglet

LastLigne = Range("B65000").End(xlUp).Row
'Trouve la dernière ligne de la colonne B
LastColonne = Range("XX7").End(xlLeft).Row
'Trouve la dernière colonne de la ligne 3

For i = 2 To 4
'Permet de choisir les colonnes à copier
Workbooks("Resultats_Query_SAP.xlsx").Activate
'Se replace bien dans le classeur Query pour faire sa sélection
    Select Case i
        Case 2
            NumColonne = 2
            'le numéro Unpacked
        Case 3
            NumColonne = 6
            'le nom du produit
        Case 4
            NumColonne = LastColonne
            'la quantité stockée
    End Select

    Range(Cells(9, NumColonne), Cells(LastLigne, NumColonne)).Select
    'Sélectionne la colonne i jusqu'à la dernière ligne
    Selection.Copy
    'Copie la sélection
    Workbooks("Docu_Travail.xlsm").Activate
    'Se replace dans le classeur de destination
    Cells(8, i).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'Colle la colonne
Next i

Workbooks("Resultats_Query_SAP.xlsx").Close
'Ferme le classeur de Query

End Sub

Mais quand j'essaye de lancer un débogage j'ai du jaune un peu partout... et mon bouton de lancement me renvoie une erreur "400"

J'ai fait du VB il y a bien longtemps mais le manque de pratique m'a fait perdre énormément.

Vous serait-il possible de jeter un œil à mon problème ?

D'avance merci !

En espérant avoir été assez claire.

LHK

Bonjour,

Je n'ai pas regardé vos fichiers mais j'ai apporté quelques corrections qui, je l'espère, permettront le bon fonctionnement de la procédure. Il s'agit principalement de réorganisation et de correction des petites inattentions et fautes de syntaxe courantes.

J'ai supposé que vous exécuteriez le code à partir du classeur Docu_Travail, et que le classeur SAP serait fermé au lancement de la procédure.

Par ailleurs, j'ai également supposé que LastColonne s'obtenait à partir de la ligne 7 et non de la ligne 3 (comme l'indiquait votre commentaire) et aussi que les valeurs étaient à coller sur le premier onglet de Docu_Travail (il faudra éventuellement adapter).

Voici le code :

Option Explicit

Sub Transfert_SAP()

Dim wbSAP as workbook, wbTrav as workbook
Dim LastLigne%, NumColonne%, LastColonne%, i%

Workbooks.Open Filename:="Resultats_Query_SAP.xlsx" 'Ouvre le fichier avec la Query SAP
Set wbSAP = Activeworkbook 'wbSAP devient le classeur actif (celui ouvert à l'instant, càd SAP) 
Set wbTrav = Thisworkbook 'Workbooks("Docu_Travail.xlsm") 'wbTrav devient le classeur exécutant (Travail)

With wbSAP.Sheets(1) 'avec onglet 1 de wbSAP
    LastLigne = .cells(.rows.count, 2).End(xlUp).Row 'Trouve la dernière ligne de la colonne B
    LastColonne = .cells(7, .columns.count).End(xlToLeft).Column 'Trouve la dernière colonne de la ligne 7 (? 3 ou 7 ?)
    For i = 2 To 4 'pour i allant de 2 à 4
        Select Case i 'Permet de choisir les colonnes à copier selon la valeur de i
            Case 2: NumColonne = 2 'le numéro Unpacked
            Case 3: NumColonne = 6 'le nom du produit
            Case 4: NumColonne = LastColonne 'la quantité stockée
        End Select
        .Range(Cells(9, NumColonne), Cells(LastLigne, NumColonne)).Copy 'Copie la colonne NumColonne jusqu'à la dernière ligne
        wbTrav.Sheets(1).Cells(8, i).resize(LastLigne - 9 + 1, 1).PasteSpecial _
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'Colle valeurs dans la colonne i de wbTrav (après retaillage du nb de lignes >> resize(derlig - premlig + 1, 1) << pour accueillir correctement les valeurs)
    Next i
End with

wbSAP.Close savechanges:=true 'Ferme le classeur de Query avec sauvegarde

End Sub

Cdlt,

Bonjour,

Merci pour votre retour !

Et sincèrement désolée de ne pas avoir répondu plus tôt !

(les aléas de l'entreprise : ce qui est urgent à un moment ne l'ai plus le lendemain, j'ai du me concentrer sur d'autres sujets en attendant que celui-ci redevienne "urgent"... bref).

Malheureusement il y a plusieurs fonctions ou syntaxes que je ne comprends/connais pas dans la solution proposée...

ET j'ai toujours cette erreur qui revient : "erreur 1004 erreur définie par l'application ou par l'objet"

J'ai tenté de faire revenir des valeurs pour voir "où ça bloque" et d'après ce qui ressort c'est la sélection qui ne se fait pas.

Voici mon code actuellement :

Option Explicit

Sub Transfert_SAP()

Dim LastLigne As Integer
Dim NumColonne As Integer
Dim LastColonne As Integer
Dim i As Variant

Workbooks.Open Filename:="C:\Users\CVMOF\Desktop\Test pour suivi des stocks\Resultats_Query_SAP.xlsx"
'Ouvre le fichier avec la Query SAP
'Sheets("data").Select
'Sélectionne le premier onglet

LastLigne = Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range("B20000").End(xlUp).Row
'Trouve la dernière ligne de la colonne B
Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A1").Value = LastLigne
'Test pour voir s'il trouve bien LastLigne

LastColonne = Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range("XX7").End(xlToLeft).Column
'Trouve la dernière colonne de la ligne 7
Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A2").Value = LastColonne
'Test pour voir s'il trouve bien LastColonne

For i = 2 To 4
'Permet de choisir les colonnes à copier
'Workbooks("Resultats_Query_SAP.xlsx").Activate
'Se replace bien dans le classeur Query pour faire sa sélection
    Select Case i
        Case 2
            NumColonne = 2
            'le numéro Unpacked
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A3").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A4").Value = NumColonne
            'Test pour voir ce qu'il ressort

        Case 3
            NumColonne = 6
            'le nom du produit
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A5").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A6").Value = NumColonne
            'Test pour voir ce qu'il ressort

            Case 4
            NumColonne = LastColonne
            'la quantité stockée
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A7").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A8").Value = NumColonne
            'Test pour voir ce qu'il ressort

    End Select

    Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range(Cells(9, NumColonne), Cells(LastLigne, NumColonne)).Copy
    'Copie la colonne i jusqu'à la dernière ligne
    'Workbooks("Docu_Travail.xlsm").Activate
    'Se replace dans le classeur de destination
    Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range(8, i).Resize(LastLigne - 9 + 1, 1).PasteSpecial _
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'Colle la colonne
Next i

'Workbooks("Resultats_Query_SAP.xlsx").Close
'Ferme le classeur de Query

End Sub

Et ce qui ressort sur mon fichier Docu_Travail quand le lance :

A1 : 10234 (donc ça c'est ok)

A2 : 36 (ok aussi)

A3 : 2 (première itération de la boucle for i)

A4 : 2 (premier select case, NumColonne = 2)

Les autres case sont vides....

J'avoue que je sèche complètement.

Auriez-vous une idée ?

D'avance merci pour votre temps !

Bonne journée

LHK

Update !!!

J'ai réussi :)

Voilà le code

Option Explicit

Sub Transfert_SAP()

Dim LastLigne As Integer
Dim NumColonne As Integer
Dim LastColonne As Integer
Dim i As Variant

Workbooks.Open Filename:="C:\Users\CVMOF\Desktop\Test pour suivi des stocks\Resultats_Query_SAP.xlsx"
'Ouvre le fichier avec la Query SAP
'Sheets("data").Select
'Sélectionne le premier onglet

LastLigne = Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range("B20000").End(xlUp).Row
'Trouve la dernière ligne de la colonne B
Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A1").Value = LastLigne
'Test pour voir s'il trouve bien LastLigne

LastColonne = Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Range("XX7").End(xlToLeft).Column
'Trouve la dernière colonne de la ligne 7
Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A2").Value = LastColonne
'Test pour voir s'il trouve bien LastColonne

For i = 2 To 4
'Permet de choisir les colonnes à copier
'Workbooks("Resultats_Query_SAP.xlsx").Activate
'Se replace bien dans le classeur Query pour faire sa sélection
    Select Case i
        Case 2
            NumColonne = 2
            'le numéro Unpacked
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A3").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A4").Value = NumColonne
            'Test pour voir ce qu'il ressort

        Case 3
            NumColonne = 6
            'le nom du produit
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A5").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A6").Value = NumColonne
            'Test pour voir ce qu'il ressort

            Case 4
            NumColonne = LastColonne
            'la quantité stockée
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A7").Value = i
            Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Range("A8").Value = NumColonne
            'Test pour voir ce qu'il ressort

    End Select

    Workbooks("Resultats_Query_SAP.xlsx").Sheets("data").Cells(9, NumColonne).Resize(LastLigne, 1).Copy
    'Copie la colonne i jusqu'à la dernière ligne
    'Workbooks("Docu_Travail.xlsm").Activate
    'Se replace dans le classeur de destination
    Workbooks("Docu_Travail.xlsm").Sheets("Feuil1").Cells(8, i).Resize(LastLigne - 9 + 1, 1).PasteSpecial _
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'Colle la colonne
Next i

'Workbooks("Resultats_Query_SAP.xlsx").Close
'Ferme le classeur de Query

End Sub

Merci pour votre réponse @3GB !

Cela m'a permis de creuser plus en détail !

Bonne fin de journée à tous

LHK

Bonjour,

Merci de votre retour ! Désolé, je n'ai pas pu vous répondre avant.

Je suis content que vous ayez finalement trouvé la solution.

Bonne continuation !

Rechercher des sujets similaires à "copier certaines colonnes classeur"