Excel VBA: déplacement de colonnes entre les classurs

Actuellement, j'ai des feuilles de calcul qui sont formatées incorrectement. Notre client a envoyé à ses fournisseurs une ancienne tableur où les colonnes sont définies différemment de ce qu'ils sont actuellement configurés. Normalement, nous leur dirais de le corriger, mais certaines de ces feuilles de calcul ont plus de 220k lignes et 33 colonnes. Ils le mettent à jour pour l'avenir, mais leur request de faire refaire à leurs clients leurs tables est un non-go. J'ai écrit un script qui copyra une colonne et la place dans la colonne statique correspondante dans un autre classur. Cela fonctionne bien, mais je pense qu'il y a plus que cela pourrait faire.

Le nom de la copy ouverte du classur varie.

Nom du classur copié sur: C: \ User \ (Nom) \ UCOR \ Catalogs \ PSX-Toolset v1.503-FR.xls

Ce que j'aimerais, c'est d'aider à rédiger une macro qui fera ce qui suit dans le classur ouvert:

1.) Sélectionnez une colonne entière less la ligne 1 jusqu'à la première rangée vierge. – Cela va de B à AH

2.) Collez cette colonne dans le classur PSX-Toolset, nom de la feuille de calcul "Données d'élément" – Colonnes affectées statiques

3.) Effectuez une sauvegarde comme sur PSX-Toolset comme (Catalog-PSX-<Workbook Copied From>.xls)

Enfin, j'aimerais savoir s'il est possible de faire ce qui précède, mais le mappage des cellules de titre. Malheureusement, les noms de cellules ne sont pas identiques.

Non testé:

 Sub MapAndCopyColumns() Dim i As Integer, rng As Range Dim shtSrc As Worksheet, wbDest As Workbook Dim shtDest As Worksheet Dim iNew Set shtSrc = ActiveSheet Set wbDest = Workbooks.Open("C:\User\(Name)\UCOR\Catalogs\PSX-Toolset v1.503-EN.xls") Set shtDest = wbDest.Sheets("Item Data") For i = 2 To 34 Set rng = shtSrc.Cells(2, i) If rng.Value <> "" Then If rng.Offset(1, 0).Value <> "" Then Set rng = Range(rng, rng.End(xlDown)) End If 'map old position >> new position ' mapping table has 2 columns of numbers: "old" and "new" iNew = Application.VLookup(i, _ ThisWorkbook.Sheets("Mapping").Range("A2:B40"), 2, False) If Not IsError(iNew) Then 'copy if the column has an entry in the mapping table rng.Copy shtDest.Cells(2, iNew) End If End If Next i wbDest.SaveAs "C:\wheretosaveto\Catalog-PSX-" & shtSrc.Parent.Name End Sub 

La façon dont j'ai appris la plupart de mes vba est la «macro d'logging». Vous commencez à save, faites ce que vous voulez faire vous-même, arrêtez l'logging, puis regardez le code généré.

Habituellement, vous pouvez améliorer le code en éliminant beaucoup de lignes redondantes, mais il devrait au less exposer toutes les commands dont vous avez besoin pour compléter votre objective.