Macro copier/coller colonnes de dimensions variables

Bonjour,

Je suis un total débutant en VBA. J'ai créé quelques macros en utilisant la création de macro par enregistrement, et je commenceà comprendre à quel point l'outil peut révolutionner la gestion de ma boîte. Mais la fonction enregistrement de macro a ses limites, et je comprends qu'il va me falloir aussi apprendre un minimum à programmer. Voici mon premier écueil.

J'ai un tableau de 4 colonnes.

Le nombre de cellule dans chacune des colonnes peut varier selon le moment où j'ouvre ce tableau (zen fonction de mises à jour).

La macro doit permettre de créer dans une nouvelle feuille ou un nouveau fichier une colonne dans laquelle les 4 colonnes du tableau d'origine se superposeront.

Le problème est donc que si pour la première colonne, il n'y a aucune difficulté pour déterminer où elle sera collée (A1), la macro ne sait jamais où les colonnes 2, 3 et 4 devront être collées. Il faudrait que chaque colonne soit collée juste en dessous de la précédente, donc dans la première cellule vide, ou encore, si vous préférez, sous la dernière cellule non-vide

Une bonne âme saurait-elle me donner la baguette magique qui me permettra de trouver et sélectionner cette première cellule vide pour coller la colonne B? Je pense pouvoir me débrouiller pour la suite

Je vous ai placé un script montrant la macro de base. Évidemment, là, c'est moi qui indique à la macro la cellule où le collage doit s'effectuer.

Sub copie4colonnesen1()
'
' copie4colonnesen1 Macro
'

'
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Feuil3").Select
    Range("A1").Select
    ActiveSheet.Paste
    Sheets("Feuil1").Select
    Range("B1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Feuil3").Select
    Range("A6").Select
    ActiveSheet.Paste
    Sheets("Feuil1").Select
    Range("C1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Feuil3").Select
    Range("A15").Select
    ActiveSheet.Paste
    Sheets("Feuil1").Select
    Range("D1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Feuil3").Select
    Range("A28").Select
    ActiveSheet.Paste
End Sub

Bonjour

A tester

Impératif : Il faut que la page contenant les colonnes à copier soit sélectionnée

Sub copie4colonnesen1()
' copie4colonnesen1 Macro

  With Sheets("Feuil3")
    Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Copy .Range("A1")
    Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row).Copy .Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
    Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row).Copy .Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
    Range("D1:D" & Range("D" & Rows.Count).End(xlUp).Row).Copy .Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
  End With
End Sub

Merci Banzaï, non excuse-moi, Un GRAND merci.

Ta réponse est aussi rapide que ta macro.

Je vais essayer de comprendre comment cela fonctionne et de la dupliquer.

A priori, je pense que je n'aurai aucun problème car la chose semble relativement simple.

Au passage, vu la vitesse à laquelle tu as répondu, j'imagine que tu dois sans doute avoir la réponse à une autre question qui me fait souffrir en ce moment.

En théorie, je voudrais exporter le tableau obtenu vers un fichier CSV séparé par des points-virgules.

Étonnamment, lorsque je crée la macro (donc pendant la phase d'enregistrement de la macro), le fichier que j'obtiens en fin d'opération est bien séparé par des poins-virgules, alors que lorsque je lance la macro que j'ai finalement enregistrée, le fichier est séparé par des virgules, et non des points-virgules.

Voila ce qui apparaît dans la macro que j'avais initialement préparée en faisant des tests:

Sub exporttarifsite()
'
' exporttarifsite Macro
'

'
    Range("A3:D3").Select
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    Sheets(Array("Feuil2", "Feuil3")).Select
    Sheets("Feuil3").Activate
    Application.CutCopyMode = False
    ActiveWindow.SelectedSheets.Delete
    ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\WAM\Desktop\tarif site Internet.csv", FileFormat:=xlCSV, _
        CreateBackup:=False
    Windows("Administration des articles WAM.xlsm").Activate
    Sheets("Liste principale").Select
    Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows("tarif site Internet.csv").Activate
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Windows("Administration des articles WAM.xlsm").Activate
    Range("T2:V2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("tarif site Internet.csv").Activate
    Range("B2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    ActiveWorkbook.Save
    ActiveWindow.Close
    Application.CutCopyMode = False
End Sub

1/ Je ne peux pas me permettre que les utilisateurs aient à manipuler un fichier texte pour remplacer les , par des ;

2/ Il faut vraiment que mon fichier sorte avec des ;

3/ Et j'ai été dans mes paramètres de configuration pour vérifier que le séparateur de liste était bien ; (on ne sait jamais )

Bonsoir

Je n'y connais pas grand chose en csv (je ne m'en sers pas)

Essayes de rajouter à l'exportation Local:=true

 ActiveWorkbook.SaveAs Filename:= _
        "C:\Users\WAM\Desktop\tarif site Internet.csv", FileFormat:=xlCSV, _
        CreateBackup:=False, Local:=True

Efficace lors du chargement d'un fichier csv

Si pas ça et si pas d'autres réponses, clôture ce post et ouvres en un autre avec juste cette question

Un conseil : Joins le fichier

Merci beaucoup Banzai.

Cela n'a pas réglé la question des CSV. Mais bon, le principal problème (celui des colonnes) est réglé.

Rebonjour Banzai,

Apparemment, le script n'est pas si simple que çà à comprendre pour le débutant que je suis. Je suis confronté à un problème très similaire et je n'arrive pas à mes fins malgré ce que tu m'as montré.

Est-ce que le script que tu m'as donné est "raccourci" ou "complet"?

Dans cette nouvelle situation, il s'agit pour moi de coller une fonction sur une colonne de hauteur variable.

Dans la colonne I, j'ai un nombre de données variable.

Dans la colonne J, je souhaite appliquer une fonction jusqu'à ce qu'il n'y ait plus de valeurs dans la colonne I.

Mes colonnes ont des entêtes.

En attendant de trouver une formule, j'ai me suis donné un peu de marge en demandant à ma formule de se coller jusqu'à la ligne 800.

Mais j'aimerais qu'elle s'arrête au même niveau que la dernière ligne de la colonne I.

Voici mon code:

 Sheets("saisie inventaire").Select
    Range("J2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(ISERROR(VLOOKUP(RC[-2],'Inventaire API mis en forme'!C[-9]:C[-6],4,0)),0,(VLOOKUP(RC[-2],'Inventaire API mis en forme'!C[-9]:C[-6],4,0)))"
    Selection.AutoFill Destination:=Range("J2:J800")
    Range("J2:J800").Select

Idéalement, j'aurais vraiment aimé comprendre ton code initial pour pouvoir le réutiliser. Mais si cela te prend trop de temps pour me l'expliquer, peux-tu essayer d'appliquer ta recette magique sur ce cas et j'essaierai de le comprendre en comparant les 2 exemples...?

Merci d'avance de ton aide.

Bonjour

Wiseman a écrit :

j'aurais vraiment aimé comprendre ton code initial pour pouvoir le réutiliser.

C'est très simple

Pour chaque colonne (A, B, C et D) je sélectionne les données de cette colonne

Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)

c'est à dire de la ligne 1 jusqu'à la dernière cellule non vide de la colonne

Que l'on copie Copy dans la feuille "Feuil3" .Range("A1")

Pour la 1ére colonne c'est facile c'est en ligne 1 de la feuille "Feuil3"

Pour les autres la copie se fera sur la 1ère cellule vide de cette colonne.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

C'est tout

Bon, et bien je peux dire que j'ai fait pas mal de progrès grâce à toi, mais il faut que je bosse encore.

Je travaille sur une autre macro, et le problème que j'ai est quasiment identique au précédent. Mais cette fois-ci, je cherche la dernière ligne d'une colonne D dans un tableau. Le problème est que la colonne en question est vide. En fait, la colonne A fournit en quelque sorte un index, et il faut que ma macro colle une fonction jusqu'à la dernière ligne du tableau.

En m'inspirant de ce que tu m'as montré, j'ai trouvé un moyen détourné de coller ma fonction. Mais il m'a tout de même fallu un bon paquet de lignes pour y parvenir.

En fait, dans la colonne vide, avant de saisir ma formule, j'ai collé ma colonne A, de sorte que mes cellules n'étant plus vides, je suis capable de les sélectionner avec la solution que tu m'as donnée.

Il ne me reste plus qu'à saisir ma formule dans D2, puis à la copier sur la colonne D jusqu'à la dernière cellule non vide.

Ce qui donne (on ne se moque pas )

Sub création_identifiant_TNT()
'
' création_identifiant_TNT Macro
'

'
    Sheets("traitement API").Select
    Columns("D:D").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Select
    Selection.Copy
    Range("D2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "=UPPER(LEFT(CONCATENATE(RC[-3],RC[-2]),15))"
    Range("D2").Select
    Selection.Copy
    Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row).Select
    ActiveSheet.Paste
    Selection.Copy
    Sheets("Fichier exportable vers TNT").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("A:A").EntireColumn.AutoFit
    Sheets("traitement API").Select
    Columns("D:D").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
End Sub

Ça fonctionne parfaitement. Mais comme je dois répéter la chose un certain nombre de fois dans ma macro, je me demandais s'il n'y avait pas un moyen plus court pour y parvenir. je suppose que la macro n'en sera que plus rapide...

Banzai64 a écrit :

Bonjour

Wiseman a écrit :

j'aurais vraiment aimé comprendre ton code initial pour pouvoir le réutiliser.

C'est très simple

Pour chaque colonne (A, B, C et D) je sélectionne les données de cette colonne

Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)

c'est à dire de la ligne 1 jusqu'à la dernière cellule non vide de la colonne

Que l'on copie Copy dans la feuille "Feuil3" .Range("A1")

Pour la 1ére colonne c'est facile c'est en ligne 1 de la feuille "Feuil3"

Pour les autres la copie se fera sur la 1ère cellule vide de cette colonne.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

C'est tout

Rechercher des sujets similaires à "macro copier coller colonnes dimensions variables"