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 SubBonjour
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 SubMerci 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 Sub1/ 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:=TrueEfficace 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").SelectIdé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
Copydans 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