如何导入带有所需列的工作表? Excel VBA

时间:2014-10-08 04:28:40

标签: excel vba excel-vba import worksheet

我可以将工作表成功导入到我的工作簿中。但是可以只导入我想要的列吗?数据非常庞大,我不想麻烦地通过细胞的每个部分。 以下是我的代码:

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

2 个答案:

答案 0 :(得分: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和A列; G在复制前从报告中获取。关闭而不保存应该使原始Report.xlsx不受影响。

答案 1 :(得分: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的边界由右侧的第一个完全空白列和第一个完全空白的行向下决定。一个数据块很少有这个,但工作表通常称为 Report