【问题标题】:Excel 2010 VBA Copy Data from Multiple Excel FilesExcel 2010 VBA 从多个 Excel 文件复制数据
【发布时间】:2013-09-05 23:05:41
【问题描述】:

我已经搜索并搜索了这个并且已经接近但并不完美。就这样吧……

我需要的是一个代码,可以连续处理其他excel工作簿并复制数据。这些文件将被命名为 1、2、3、4 等,最多可达 60 个。我有一些代码可以打开我的所有文件,效果很好。接下来,我需要它进入所有工作簿并复制设置数据并将其返回到我也能够完成的主工作簿。这是我的问题...

  1. 我知道必须有一种方法可以一次性编写代码并让它在剩余的文件中运行。 IE。如果第一个文件名为 1.csv,代码可以说在 1.csv 上执行,然后在 1.csv + 1 上表示 2.csv,然后循环输出?似乎它应该能够做到。我不想手动编写相同的代码从 1.csv 一直复制到 60.csv

  2. 如果有办法循环它,那么我如何结束 end if 部分。 IE 一周可能有 37 个文件,接下来有 ​​40 个,依此类推。我希望它从文件 1.csv 开始并一直工作,直到它到达最后一个活动文件 37.csv 或 60.csv,然后在没有 38.csv 文件时结束。

这是我的基本记录代码。

   Public Sub testr()
  Dim filenum As Integer
  Dim lastrow As Long

  filenum = 1
  On Error GoTo my_handler

  Do
    Windows(filenum & ".CSV").Activate
    Range("A25").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    Windows("test.xlsm").Activate
    Range("A1").Select
    lastrow = Worksheets("Data").Cells(1, 1).End(xlDown).Row
    ActiveSheet.Paste
    filenum = filenum + 1
  Loop

my_handler:
  MsgBox "All done."
  Exit Sub
End Sub

任何人都可以给我的任何帮助都会很棒!先谢谢了~

【问题讨论】:

    标签: excel excel-2010 vba


    【解决方案1】:

    好的,对于您现在拥有的代码,您至少需要编辑为如下所示:

    Public Sub testr()
      Dim filenum As Integer
      filenum = 1
      On Error GoTo my_handler
    
      Do
        Windows(filenum & ".CSV").Activate
        Range("A25").Select
        Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
        Selection.Copy
        Windows("test.xlsm").Activate
        Range("A1").Select
        ActiveSheet.Paste
        Range("A1").Select
        filenum = filenum + 1
      Loop
    
    my_handler:
      MsgBox "All done."
      Exit Sub
    End Sub
    

    【讨论】:

    • 工作!宏运行顺利。不过,像往常一样,另一个我认为很容易纠正的问题。它从 csv 文件中复制的数据会自行粘贴。我尝试添加代码以转到下一个空单元格然后粘贴,但它不起作用。我使用了这段代码。 LastRow = Sheets("Data").Cells(Rows.Count, 1).End(xlUp).Offset(1).Row
    • 勾选接受的答案!对于最后一行,它总是不同的。一个 CSV 文件可能有 12 行数据,接下来是 30 行,以此类推。我想从 1.csv 复制所有数据并粘贴,然后复制 2.csv 并将其粘贴到 1.csv 数据的正下方并继续。我在最初的代码中使用了我发给你的那块,但是当我把那块放在这个里面时,它就不行了。
    • 不工作。它只是在 A1 中粘贴其他数据。我通读了另一个链接,但没有看到任何有助于我寻找的东西。我编辑了我的代码,所以你可以看到我有什么。
    • 没有骰子。这张纸回来时完全空白。我想可能是因为这张纸一开始是空白的,所以我放了一个标题并在 A2 处开始粘贴,但这也没有用。
    • 所以我用你的代码替换了activesheet.paste,我在该行收到了应用程序定义或对象定义错误。
    【解决方案2】:

    您可以尝试将所有这些包装在一个 DO...LOOP 中。如果您不知道要处理多少个 .csv 文件,只需在没有找到更多文件时放入错误处理程序即可退出。

    您可以使用字符串连接来更改文件名:例如,使用名为 filenum 的变量,如果 filenum = 1 那么 filenum & ".csv" 将是 "1.csv",如果 filenum = 2 那么 filenum & " .csv”将是“2.csv”等等。

    例如:

    Public Sub testr()
    Dim filenum As Integer
    filenum = 1
    On Error GoTo my_handler
    Do
      Windows(filenum & ".CSV").Activate
      'rest of code goes here
    filenum = filenum + 1
    Loop
    
    my_handler:
      MsgBox "All done."
    Exit Sub
    

    【讨论】:

    • 感谢亚伦的回复!我如何将连接添加到代码中?这个想法在文本中是有意义的,但它如何在 VBA 中翻译?另外,如何使用循环和连接在一起?
    • 好的,我让它与您的代码一起使用,但在循环备份时它告诉我“Windows(filenum & ".CSV).Activate" 是一个超出范围的子脚本并且不会继续下一个文件或 2.CSV 和错误。有什么想法吗?
    • 您可以尝试为文件名创建一个字符串,并将该字符串用于 Windows.Activate 方法。例如,将文件名变暗为字符串;文件名 = 文件编号 & ".csv"; Windows(file_name).激活
    • 无法让它工作。它不喜欢带有 Windows(file_name) 的 Windows Activate 方法
    • 只是检查,但那个窗口真的打开了吗?我假设您上面的原始代码 - Windows("1.CSV").Activate - 工作正常?
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多