excel 从一个工作簿粘贴到另一个工作簿时下标超出范围

tnkciper  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(190)

我是一个新手,不知道为什么我的代码会引发下标超出范围错误。我试图按下原始工作簿上的一个按钮,打开多个数据文件,然后将它们合并合并到一个工作簿中,每个文件保存为一个单独的工作表。然后我想从每个工作表中复制某些范围,并将它们粘贴到原始工作簿上的一个工作表中,在原始工作表上向下移动,并粘贴下一个数据表中的范围(如果这会引起混淆,请原谅)。它会保存合并后的数据工作簿并将其打开,但不会运行For Each循环将数据复制并粘贴到原始工作簿中。相反,它会触发一个下标超出范围的错误,不让我调试找到问题的根源。
这里是我的代码的修改版本(为了客户保密,不能包括原始文件名)。假设“DataFiles”是组合的数据工作簿,“DataProcessing.xlsm”是我粘贴值的工作簿。文件路径最初也是我所有同事访问的共享S:Drive路径。我知道代码非常草率,但它不需要干净,只需要工作lol。

  1. Sub CombineAndCopyData()
  2. ' Select and combine data files into single workbook
  3. Dim xFilesToOpen As Variant
  4. Dim I As Integer
  5. Dim xWb As Workbook
  6. Dim xTempWb As Workbook
  7. Application.ScreenUpdating = False
  8. xFilesToOpen = Application.GetOpenFilename("All Files (*.*), *.*", , "Select Files", , True)
  9. If TypeName(xFilesToOpen) = "Boolean" Then
  10. MsgBox "No files were selected", , "Select Files"
  11. End If
  12. I = 1
  13. Set xTempWb = Workbooks.Open(xFilesToOpen(I))
  14. xTempWb.Sheets(1).Copy
  15. Set xWb = Application.ActiveWorkbook
  16. xTempWb.Close False
  17. Do While I < UBound(xFilesToOpen)
  18. I = I + 1
  19. Set xTempWb = Workbooks.Open(xFilesToOpen(I))
  20. xTempWb.Sheets(1).Move , xWb.Sheets(xWb.Sheets.Count)
  21. Loop
  22. ' Set up combined results file
  23. TargetFileName = "DataFiles"
  24. TargetFilePath = "C:\Users\CorToTheWin\Documents\Do Not Delete\" + TargetFileName + ".xlsx"
  25. ActiveWorkbook.SaveAs Filename:=TargetFilePath
  26. Workboo ks("DataFiles").Activate
  27. Application.ScreenUpdating = True
  28. ' Loop through each sheet and copy to file
  29. Dim ws As Worksheet
  30. ' Setting the starting target rows in DataProcessing.xlsm
  31. TargetRow = 5
  32. TargetRowName = 4
  33. For Each ws In Workbooks("DataFiles").Worksheets
  34. ' Selection 1
  35. ws.Range("B16").Copy
  36. TargetCellName = "A" & TargetRowName
  37. Windows("DataProcessing.xlsm").Activate
  38. Range(TargetCellName).Select
  39. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  40. :=False, Transpose:=False
  41. ' Selection 2
  42. ws.Range("C17:C26").Copy
  43. TargetCell = "B" & TargetRow
  44. Windows("DataProcessing.xlsm").Activate
  45. Range(TargetCell).Select
  46. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  47. :=False, Transpose:=False
  48. ' Selection 3
  49. ws.Range("E17:E26").Copy
  50. TargetCell = "C" & TargetRow
  51. Windows("DataProcessing.xlsm").Activate
  52. Range(TargetCell).Select
  53. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  54. :=False, Transpose:=False
  55. ' Selection 4
  56. ws.Range("D17:D26").Copy
  57. TargetCell = "D" & TargetRow
  58. Windows("DataProcessing.xlsm").Activate
  59. Range(TargetCell).Select
  60. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  61. :=False, Transpose:=False
  62. ' Move the target rows down a few rows
  63. TargetRow = TargetRow + 12
  64. TargetRowName = TargetRowName + 12
  65. TargetRowSTD = TargetRowSTD + 12
  66. Next ws
  67. Workbooks(TargetFileName).Close SaveChanges:=False
  68. End Sub

字符串
如果需要的话,我可以澄清,但是这已经困扰了我和我的同事一个星期了,我已经没有办法了。谢谢!
我尝试改变激活数据工作簿的方法,尝试不同的循环代码块,并尝试将数据工作簿保存到本地文件,所有这些都导致了相同的下标错误。

yzckvree

yzckvree1#

通过定义对工作簿的引用来避免使用ActiveWorkbook

  1. Option Explicit
  2. Sub CombineAndCopyData()
  3. Const FOLDER = "C:\Users\CorToTheWin\Documents\Do Not Delete\"
  4. Const FILENAME = "Datafiles.xlsx"
  5. Dim xFilesToOpen, i As Long
  6. Dim wb As Workbook, wbData As Workbook, wbTarget As Workbook
  7. Dim ws As Worksheet, wsTarget As Worksheet
  8. Dim t0 As Single: t0 = Timer
  9. xFilesToOpen = Application.GetOpenFilename("All Files (*.*), *.*", , "Select Files", , True)
  10. If TypeName(xFilesToOpen) = "Boolean" Then
  11. MsgBox "No files were selected", , "Select Files"
  12. End If
  13. Application.ScreenUpdating = False
  14. 'open first workbook and copy of sheet 1 to new wb
  15. Set wb = Workbooks.Open(xFilesToOpen(1), ReadOnly:=True)
  16. wb.Sheets(1).Copy
  17. Set wbData = ActiveWorkbook
  18. wb.Close SaveChanges:=False
  19. ' copy rest of files and save
  20. Set wbTarget = Workbooks("Dataprocessing.xlsm")
  21. Set wsTarget = wbTarget.ActiveSheet
  22. Dim TargetRow: TargetRow = 4
  23. With wbData
  24. For i = 2 To UBound(xFilesToOpen)
  25. Set wb = Workbooks.Open(xFilesToOpen(i))
  26. wb.Sheets(1).Move , .Sheets(.Sheets.Count)
  27. Next
  28. .SaveAs FOLDER & FILENAME
  29. MsgBox i - 1 & " sheets copied to " & FOLDER & FILENAME, vbInformation
  30. For Each ws In .Sheets
  31. ' Selection 1
  32. wsTarget.Cells(TargetRow, "A") = ws.Range("B16").Value2
  33. TargetRow = TargetRow + 1
  34. ' Selection 2
  35. wsTarget.Cells(TargetRow, "B").Resize(10) = ws.Range("C17:C26").Value2
  36. ' Selection 3
  37. wsTarget.Cells(TargetRow, "C").Resize(10) = ws.Range("E17:E26").Value2
  38. ' Selection 4
  39. wsTarget.Cells(TargetRow, "D").Resize(10) = ws.Range("D17:D26").Value2
  40. ' Move the target rows down a few rows
  41. TargetRow = TargetRow + 11
  42. Next
  43. .Close SaveChanges:=False
  44. End With
  45. Application.ScreenUpdating = True
  46. MsgBox wbTarget.Name & " Updated", vbInformation, Format(Timer - t0, "0.0 secs")
  47. End Sub

字符串

展开查看全部

相关问题