Copier certaines colonnes d'un classeur vers un autre
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 SubMais 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 SubCdlt,
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 SubEt 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 SubMerci 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 !