XL 2019 vba copier colonnes non adjacentes

Debor@h

XLDnaute Nouveau
Bonjour a tous,
Besoin d'un grand aide, je débute en macro vba et je souhaite la chose suivante :

j'ai fichier (dans lequel j'ai copié la macro ci dessous), quand je clique sur mon bouton une fenêtre s'ouvre pour allé chercher un fichier.
c'est dans ce fichier (que l'on vient d'ouvrir) que je souhaite copier les colonnes C H J N (mais a partir de la ligne 7) et que je souhaite coller (dans le fichier ou se trouve la macro) en colonne G M N I


Fichier source colonne C va devoir se copier en colonne G dans le fichier de destination
C --> G
G --> M
H --> N
J --> I

Quelqu'un peut il m'aider
je vous remercie par avance, je suis dans une grand galére


Sub RecuperationDataFichier()

'Déclaration des variables
Dim ListeFichier As Variant
Dim MonClasseur As Workbook
Dim Colonne_a_supprimer As Long

'On désactive le presse-papier et le rafraichissement de l'écran
Application.CutCopyMode = False
Application.ScreenUpdating = False


'On efface les anciennes données
ActiveSheet.Range("A5").CurrentRegion.Clear
'On récupére le fichier des données à copier
ListeFichier = Application.GetOpenFilename(Title:="Selectionnez votre classeur", _
filefilter:="Fichiers Excel(*.xls*),*xls", ButtonText:="Cliquez")
'Prévoir le cas du bouton Annuler
If ListeFichier <> False Then
'On affecte le fichier sélectionné
Set MonClasseur = Application.Workbooks.Open(ListeFichier)
'On copie les données de la feuille du classeur sélectionné
MonClasseur.Sheets(2).Range("A5").CurrentRegion.Copy
'On colle les donnée dans la feuille active
ThisWorkbook.ActiveSheet.Range("A5").PasteSpecial xlPasteValues
'On desactive les messages d'alerte de Microsoft
Application.DisplayAlerts = False
'On ferme la classeur sources
MonClasseur.Close

End If

'On ré-active le presse-papier et le rafraichissement de l'écran
Application.CutCopyMode = True
Application.ScreenUpdating = True

'Mise en forme des extractions
'On va ajuster les colonnes des tableaux
Range("A5").Select
Cells.EntireColumn.AutoFit


End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour @Debor@h , le fil

@Debor@h
Une solution qui mixe VBA et formule
1) On copie toute la feuille source dans le classeur destination (par macro)
Ici pour l'exemple dans la feuille nommée Feuil2

2) Dans la feuille devant recevoir les données, on utiliser les formules suivantes
En colonne G
=FILTRE(CHOISIRCOLS(Feuil2!C:J;1);CHOISIRCOLS(Feuil2!C:J;1)<>0)
En colonne I
=FILTRE(CHOISIRCOLS(Feuil2!C:J;8);CHOISIRCOLS(Feuil2!C:J;8)<>0)
En colonne M
=FILTRE(CHOISIRCOLS(Feuil2!C:J;5);CHOISIRCOLS(Feuil2!C:J;5)<>0)
En colonne N
=FILTRE(CHOISIRCOLS(Feuil2!C:J;6);CHOISIRCOLS(Feuil2!C:J;6)<>0)

Cet exemple fonctionne si les données sont numériques.

Si non, il faudra creuser la question en faire tout en VBA
 

Staple1600

XLDnaute Barbatruc
Bonsoir

@Debor@h
D'où l'importance de joindre un fichier exemple dés le départ ;)
J'ai quelques petites questions
Dans le fichier SUIVI XXX.xlsm
La colonne C a pour entête : N° Poste
La colonne G de la feuille Suivi financer (donc la Feuil2) a pour entête : Métier
Or tu écris
les informations de cette colonne doit corresponde au info de la colonne G du fichier Suivi Ct 2023
C'est bizarre, non ?
Et cela semble pareil pour les autres colonnes.
 

Staple1600

XLDnaute Barbatruc
Re

Je sais que tu débutes en macro mais est-ce un problème ? ;)
Tu as surement dans ton armoire à pharmacie Dolipran ou Cie ;) ?

Voici un petit exemple (à creuser)
J'ai repris (un peu la trame de ton classeur
A savoir : la présence d'un tableau structuré
Voilà ce que donne la macro que je suis en train de tester
Tu es intéressée par cette piste ?
NB: Si oui, je publie le code pour que tu puisses reproduire ce test et essayer la macro

Dans cet exemple, la macro ne recopie ici que les colonnes 1, 4, 6 et 7
RecopieColonnes.png
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, @Debor@h

Voici mon code (je le précise) qui est un code de test
Code:
Sub Test_001()
Dim F_Source As Worksheet, F_Recopie As Worksheet, der_L&, colonnes
colonnes = Array(3, 7, 8, 10)
'Définition des feuilles
Set F_Source = Worksheets("Suivi Financier"): Set F_Recopie = Worksheets("Copie")
'Identification dernière ligne en colonne A
der_L = F_Source.Range("A:A").Find("*", , , , xlByRows, xlPrevious, , , False).Row
'transfert des données dans un tableau
dbSource = Application.Index(F_Source.ListObjects(1).DataBodyRange, Evaluate("row(1:" & der_L & ")"), colonnes)
'recopie des colonnes renseignées dans colonnes
F_Recopie.Cells(1).Resize(UBound(dbSource) - 6, UBound(dbSource, 2)).Value = dbSource
End Sub
Dans un premier temps, je teste sur un seul classeur
(j'ai ajoutée une feuille nommée Copie)
La macro est stockée dans le classeur Suivi Ct - 2023.xlsm

Résultat
J'obtiens dans la feuille Copie les colonnes C, G, H, J
(soit 3, 7, 8, 10)
 

Staple1600

XLDnaute Barbatruc
Re

@Debor@h
Finalement, je me suis allé au plus simple
(toujours en phase test)
VB:
'But à atteindre
'C:3 --> G:7
'G:7 --> M:13
'H:8 --> N:14
'J:10 --> I:9
Sub Recopie_COLONNES_TableauA_vers_TableauB()
Dim cols
cols = Array(Array(3, 7), Array(7, 13), Array(8, 14), Array(10, 9))
Dim tbA As ListObject, tbB As ListObject
Set tbA = Feuil1.ListObjects("Tableau1")
Set tbB = Feuil2.ListObjects("Tableau2")
For i = LBound(cols) To UBound(cols)
tbA.ListColumns(cols(i)(0)).DataBodyRange.Resize(, 2).Copy tbB.DataBodyRange(1, cols(i)(1))
Next
End Sub
Sur tes deux classeurs, il y a des tableaux structurés (ou ListObject)
Test OK sur mon fichier de test
=>> un classeur , deux feuilles, un tableau par feuille nommée Tableau1 (sur la feuille 1) et Tableau2 (sur la feuille 2)

RESULTAT : La macro recopie bien les colonnes "choisies" vers les colonnes "dédiées"

Il suffira ensuite d'adapter la macro pour agisse non plus sur les feuilles d'un même classeur mais entre deux classeurs.
 

Discussions similaires

Réponses
3
Affichages
197
Réponses
11
Affichages
210

Membres actuellement en ligne

Statistiques des forums

Discussions
306 164
Messages
2 033 642
Membres
227 000
dernier inscrit
fabiop