Excel VBA:在工作簿之间移动列

时间:2011-12-12 06:22:25

标签: excel vba migration

目前我的电子表格格式不正确。我们的客户向他的供应商发送了一个旧电子表格,其中列的布局与目前设置的不同。通常我们会告诉他们更正它,但其中一些电子表格有超过220k行和33列。他们将来更新它,但要求他们让他们的客户重做他们的桌子是不行的。我编写了一个脚本来复制列,并将其放入另一个工作簿中相应的静态列。这没关系,但我觉得还有更多工作要做。

从不同的复制打开工作簿的名称。

复制到的工作簿名称:C:\ User \(Name)\ UCOR \ Catalogs \ PSX-Toolset v1.503-EN.xls

我想要的是帮助编写一个宏,它将从打开的工作簿中执行以下操作:

1。)选择整个列减去第1行到第一个空白行。 - 这从B到AH

2.。)将该列粘贴到PSX-Toolset工作簿,工作表名称“项目数据” - 静态分配列

3.。)在PSX-Toolset上执行另存为(Catalog-PSX-<Workbook Copied From>.xls)

最后,我想知道是否可以执行上述操作,但是映射标题单元格。不幸的是,单元名称并不相同。

2 个答案:

答案 0 :(得分:1)

我如何通过'记录宏'了解我的大部分vba。您开始录制,自己做自己想做的事情,停止录制,然后查看生成的代码。

通常,您可以通过消除大量冗余行来改进代码,但它至少应该公开您完成目标所需的所有命令。

答案 1 :(得分:1)

未测试:

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