【问题标题】:How to import worksheet with desired columns? Excel VBA如何导入具有所需列的工作表? Excel VBA
【发布时间】:2014-12-02 15:50:55
【问题描述】:

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

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

【问题讨论】:

    标签: vba excel import worksheet


    【解决方案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
    

    我主要关心的是不知道'Report' 工作表的布局。 .CurrentRegion 的边界由右侧第一个完全空白的列和向下的第一个完全空白行决定。数据块很少有这种情况,但称为 Report 的工作表经常会这样做。

    【讨论】:

    • 是否需要添加 .Cells = .Cells.Value ?我尝试了代码并收到“内存不足”错误。
    • @De De De De De - 如果您从原始单元格中复制的单元格包含引用您留下的单元格的公式,则会出现其他问题。也许只转换正在复制的单元格就足够了。将该行移动到复制行上方的For ... Next 循环中,并将其更改为.Columns(vCOLs(v)).Cells = .Columns(vCOLs(v)).Cells.Value
    【解决方案2】:

    复制后您将关闭新打开的工作簿(不保存或警告),因此我建议您循环浏览您不想要的列并在复制之前删除。将此 sn-p 合并到您现有的代码中

    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 和 G 列。关闭而不保存应该不会影响原始 Report.xlsx。

    【讨论】:

    • 这是一个很好的答案。除了删除我不需要的列之外,我可以相反吗?即只选择我需要的列。虽然有 80 多列,但我需要其中大约 6 列。
    • @Tim Williams - +1 好接球和好点。我肯定错过了那个球。以上已更正。
    • @De De De De De - 您可以 a) 只复制您需要的六个,只要您将插入行记录到变量中以便在后续列中重复使用; b) 仅列出您想要保留的列,而不是列出您想要删除的所有列; c)从以下(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)中删除您要保留的那些,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 ,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69 ,70,71,72,73,74,75,76,77,78,79,80)
    • 如果您要从源工作表中删除内容,最好以只读方式打开它(将ReadOnly:=True 附加到原始代码中的Set wb = Application.Workbooks.Open(FilePath) 行)
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多