2014-10-08 71 views
1

我可以將工作表成功導入到我的工作簿中。但是可以只導入我想要的列嗎?數據真的非常龐大,我不想在整個單元格中遇到麻煩。 下面是我的代碼:如何導入所需列的工作表? Excel VBA

Sub ImportSheet() 
    Dim wb As Workbook 
    Dim activeWB As Workbook 
    Dim sheet As Worksheet 
    Dim FilePath As String 
    Dim oWS  As String 
    Set activeWB = Application.ActiveWorkbook 

    FilePath = "C:\Report.xlsx" 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    Set wb = Application.Workbooks.Open(FilePath) 
    wb.Sheets("Report").Copy After:=activeWB.Sheets(activeWB.Sheets.Count) 
    activeWB.Activate 
    wb.Close False 
    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 

End Sub 

回答

1

不知道如果我打破這裏的協議,但這是一個完全不同的方法和的選項添加另一個答案在那裏。此方法使用「複製到新的工作表」的做法,應該是在有限的資源更容易。

Sub ImportSheet() 
    Dim iWB As Workbook, aWB As Workbook, ws As Worksheet 
    Dim FilePath As String, v As Long, vCOLs As Variant 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    FilePath = "C:\Report.xlsx" 
    vCOLs = Array(1, 13, 6, 18, 4, 2) 'columns to copy in this order 

    Set aWB = Application.ActiveWorkbook 
    With aWB 
     .Sheets.Add after:=.Sheets(.Sheets.Count) 
     Set ws = .Sheets(.Sheets.Count) 
     '.name = "Report" 'you can name the new ws but do NOT duplicate 
    End With 
    Set iWB = Application.Workbooks.Open(FilePath) 
    With iWB.Sheets("Report").Cells(1, 1).CurrentRegion 
     .Cells = .Cells.Value 
     For v = LBound(vCOLs) To UBound(vCOLs) 
      .Columns(vCOLs(v)).Copy Destination:=ws.Cells(1, v + 1) 
     Next v 
    End With 
    iWB.Close False 

    Set iWB = Nothing 
    Set ws = Nothing 
    Set aWB = Nothing 

    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 

我的主要關注在這裏不知道「報告」工作表的佈局。 .CurrentRegion的邊界由第一個完全空白的列向右和第一個完全空白的行向下指定。一塊數據很少有這個,但工作表經常會這樣做,稱爲報告

+0

是否需要添加.Cells = .Cells.Value?我嘗試了代碼並得到「內存不足」錯誤。 – 2014-10-08 08:16:36

+1

@De De De De - 如果您從原始文件中複製的單元格包含引用要離開的單元格的公式,則會出現其他問題。也許只轉換正在複製的單元就足夠了。將該行移動到複製行上方的'For ... Next'循環中並將其更改爲'.Columns(vCOLs(v)).Cells = .Columns(vCOLs(v)).Cells.Value'。 – Jeeped 2014-10-08 09:01:56

1

您關閉剛剛打開的工作簿(不保存或警告)的複印後,所以我建議你通過列循環,你不想刪除,然後之前的副本。將這一片段注入現有的代碼

Dim v As Long, vNoCopy As Variant, wb As Workbook 
vNoCopy = Array(1, 3, 5, 7) 'should in ascending order (reversed below) 
With wb.Sheets("Report") 
    .Cells = .Cells.Value 'just in case there are referenced formulas involved 
    For v = UBound(vNoCopy) To LBound(vNoCopy) Step -1 
     .Columns(vNoCopy(v)).EntireColumn.Delete 
    Next v 
    wb.Sheets("Report").Copy After:=activeWB.Sheets(activeWB.Sheets.Count) 
End With 
wb.Close False 

這應該刪除列A,C,E &克來自複製前的報告。在不保存的情況下關閉應使原始Report.xlsx不受影響。

+3

真正應該從右到左刪除... – 2014-10-08 04:55:01

+0

這是一個很好的答案。除了刪除我不需要的列外,我可以去做相反的事嗎?哪個只是選擇我需要的列。有80多列,但我需要其中六個左右。 – 2014-10-08 04:58:00

+0

@蒂姆威廉姆斯 - +1良好的捕獲和優秀的點。我絕對錯過了那個球。以上更正。 – Jeeped 2014-10-08 05:42:54