2011-12-12 55 views
-1

目前我的電子表格進入格式不正確。我們的客戶向他的供應商發送了一張舊電子表格,其中列的佈局與當前設置的不同。通常我們會告訴他們糾正它,但其中一些電子表格有超過220k行和33列。他們正在更新它的未來,但要求他們讓他們的客戶重做他們的桌子是不行的。我寫了一個腳本,它將複製一列,並將其放入另一個工作簿中的相應靜態列中。這工作正常,但我覺得還有更多可以完成的工作。Excel VBA:在工作簿之間移動列

複製的打開工作簿的名稱各不相同。

工作簿的名稱複製到C:\用戶\(名稱)\ UCOR \目錄\ PSX-工具箱v1.503-EN.xls

我想什麼是幫助寫一個宏,將做從打開的工作簿開始:

1.)選擇整個列減去行1到第一個空白行。 - 這正好從B到AH

2)粘貼柱放入PSX-工具箱工作簿,工作表名稱「項目數據」 - 靜態分配列

3)執行在另存爲PSX-工具箱作爲(Catalog-PSX-<Workbook Copied From>.xls)

最後,我想知道是否可以做到上述,但映射標題單元格。不幸的是,單元格名稱並不相同。

+2

是的,這是可能的。你有沒有嘗試過自己?例如,記錄一個宏並清理生成的代碼? –

回答

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 
1

我是如何通過'錄製宏'來學習我的vba的大部分內容的。您開始錄製,做自己想做的事,停止錄製,然後查看生成的代碼。

通常您可以通過消除大量冗餘行來改進代碼,但它至少應該公開所有完成目標所需的命令。