【问题标题】:Combining three data sets from different files结合来自不同文件的三个数据集
【发布时间】:2014-11-12 00:26:33
【问题描述】:

我有三个文件 A.csv、B.xls 和 C.xls,它们都在同一个目录中

我想从每个文件中取出最左边的 7 列,忽略顶部的标题行,但使用 VBA 将所有其他行放在一张表(组合表)中。

在 Sheet1 中,我已将文件名添加到单元格 C3 到 C5 中的文件,以及 C1 中的目录路径。

活动工作簿的名称是 Book2.xlsm

以下是我迄今为止尝试实现此目的的代码:

Sub combineSheets()

    Dim directory As String, fileName As String

    Dim fileRng As Range
    Dim fileCell As Range

    directory = Sheet1.Range("C1").Value

    Set fileRng As Sheets("Sheet1").Range("C3")
    Set fileRng As Range(fileRng,fileRng.End(xlDown))

    For Each fileCell in fileRng 
          fileName = fileCell.Value

         'Application.DisplayAlerts = False

          Workbooks.Open (directory & fileName)

          Workbooks(fileName).Select
          Sheet1.Select
          Range("A2").Select
          Range(Selection, Selection.Offset(Selection.End(xlDown).Row - 2, 7)).Select
          'need code to work out how to add on the bottom
          Selection.Copy Destination:=Workbooks("Book2.xlsm").Sheets("combined").Range("A2")

         'Application.DisplayAlerts = True

    Next

    Workbooks("Book2.xlsm").Sheet1.Select

 End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    你几乎成功了,辛苦了 - 只是几个语法问题。我重新构建了您的示例以提高效率,您可以使用 F8 单步执行代码以查看它在做什么。

    另外,根据您的示例,我假设您的数据中没有空白行,如果有,那么您将需要使用 Range("A" & Rows.Count).End( xlUp) 代替。

    试试这个: (还有一些额外的注释)

    Sub combineSheets()
    
        Dim fileName As Range
    
        '// Use 'As' to dimension (Dim) something, use '=' to Set something.
        Dim WB As Workbook
        Set WB = ActiveWorkbook
    
        '// Loop through the filenames
        For Each fileName In Range("C3", Range("C3").End(xlDown)).Cells
    
            '// Open workbook with value in C1 and filename
            Workbooks.Open Range("C1").Value & fileName.Value
    
                '// Copy to first workbook
                With ActiveWorkbook.Sheet1
                    .Range("A2", .Range("A2").End(xlDown).Offset(-2, 7)).Copy Destination:= _
                    WB.Sheets("combined").Range("A2").End(xlDown).Offset(1, 0)
                End With
    
            '// Copy finished so close workbook
            ActiveWorkbook.Close False
    
        '// Go to next filename
        Next fileName
    
    '// Re-activate first workbook
    WB.Activate
    
    '// Release WB object from memory (note the '=')
    Set WB = Nothing
    
    End Sub
    

    【讨论】:

    • 感谢您的快速响应....我尝试使用 F8 运行它,然后打开了 csv 文件,但它似乎停止在 With ActiveWorkbook.Sheet1...csv 文件表名称是不是 Sheet1,但我认为这无关紧要...,我收到运行时错误 348 对象不支持此属性或方法...
    • 这对我来说是一个语法错误。哎呀! - 尝试将该行替换为:With ActiveWorkbook.Sheets(1)
    • 现在在下面两行出现运行时错误 1004,我认为这可能是因为对于第一次复制和粘贴,WB.Sheets("combined").Range("A2").End(xlDown).Offset(1, 0) 可能会将其推过最后一行整个工作表,因为其中还没有数据......但是一旦有一些数据可能会工作......
    • 你确实是对的!试试这个:WB.Sheets("combined").Range("A" & WB.Sheets("combined").Rows.Count).End(xlUp).Offset(1, 0) 不是从 A2 Down 开始,而是从 A1048576 Up 开始,如果没有数据,它将到达 A1,Offset 函数会将其向下移动到 A2 :)
    猜你喜欢
    • 2023-03-23
    • 2011-03-26
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2017-01-31
    相关资源
    最近更新 更多