【问题标题】:Updated the vba code and still it gives me a subscript out of range error [duplicate]更新了 vba 代码,但它仍然给我一个下标超出范围的错误 [重复]
【发布时间】:2013-11-06 17:10:45
【问题描述】:

这段代码仍然给我一个下标错误

Sub importData2()

  ChDir "C:\Users\Desktop\Java"
  Dim filenum(0 To 10) As Long
  filenum(0) = 052
  filenum(1) = 060
  filenum(2) = 064
  filenum(3) = 068
  filenum(4) = 070
  filenum(5) = 072
  filenum(6) = 074
  filenum(7) = 076
  filenum(8) = 178
  filenum(9) = 180
  filenum(10) = 182

  Dim sh1 As Worksheet
  Dim rng As Range
  Set rng = Range(Selection, ActiveCell.SpecialCells(xlLastCell))
  Dim wb As Workbook
  Set wb = Application.Workbooks("30_graphs_w_Macro.xlsm")

  Dim sh2 As Worksheet
  Dim rng2 As Range
  Set rng2 = Range("A69")
  Dim wb2 As Workbook

  For lngposition = LBound(filenum) To UBound(filenum)
    Set wb2 = Application.Workbooks.Open(filenum(lngposition) & ".csv")
    wb2.Worksheets(filenum(lngposition)).rng.Copy wb.Worksheets(filenum(lngposition)).rng2.Paste
  Next lngposition

my_handler:
  MsgBox "All done."
End Sub

这仍然给我一个下标错误:

Set wb2 = Application.Workbooks(filenum(lngposition) & ".csv")

我避免使用 .active 和 .select。 .选择。

【问题讨论】:

  • 一个提示是删除 On Error GoTo 语句;这将显示导致错误的行,并更好地指导哪些行不工作。
  • 同意 Richard.... 这不是错误处理程序,而是错误的完成消息。此外,我会删除您所有的 .Select 和 Selection。和 .Activate 引用。当您在 Excel 中创建宏时,它默认使用这种语言,但这确实是糟糕的编码。例如,您的 sh1.Activate、Range("A69").Select 和 ActiveSheet.Paste 行可以替换为 sh1.Range("A69").Paste。清理干净并删除 On err 行后,您就可以正确调试了。
  • 好的,是的..确实有帮助,感谢您的提示。我在代码中进行了更改。所以现在我收到了找不到文件 052.csv 的消息。此 excel 文件(带有脚本)与文件 052.csv 本身位于同一位置。
  • 这行给我一个运行时错误 1004:Workbooks.Add(filenum(lngPosition) & ".csv").Activate 说它可以找到文件
  • 文件已经在excel中打开了吗?还是您尝试在代码中打开它?

标签: vba csv excel range


【解决方案1】:

如果所需文件尚未打开,Subscript out of Range 将在该行引发。

由于您似乎不太可能已经打开了 11 个文件,因此您可能需要使用 Open 方法在循环中打开必要的工作簿。

Set wb2 = Application.Workbooks.Open(filenum(lngposition) & ".csv").

更新了您的代码

Sub importData2()

  ChDir "C:\Users\Desktop\Java"
  Dim filenum(0 To 10) As String
  Dim wb As Workbook
  Dim sh1 As Worksheet
  Dim rng As Range
  Dim wb2 As Workbook
  Dim sh2 As Worksheet
  Dim rng2 As Range 

  filenum(0) = "052"
  filenum(1) = "060"
  filenum(2) = "064"
  filenum(3) = "068"
  filenum(4) = "070"
  filenum(5) = "072"
  filenum(6) = "074"
  filenum(7) = "076"
  filenum(8) = "178"
  filenum(9) = "180"
  filenum(10) = "182"


  '## What workbook is this referring to?? This might cause problems later...
  Set rng = Range(Selection, ActiveCell.SpecialCells(xlLastCell))
  Set rng2 = Range("A69")
  Set wb = Application.Workbooks("30_graphs_w_Macro.xlsm")

  For lngposition = LBound(filenum) To UBound(filenum)

    Set wb2 = Application.Workbooks.Open(filenum(lngposition) & ".csv")

    Set sh1 = wb.Worksheets(filenum(lngposition))

    Set sh2 = wb2.Worksheets(1)  'A CSV file only has 1 worksheet.

    sh2.rng.Copy Destination:=sh1.Range(rng2.Address)
  Next lngposition

my_handler:
  MsgBox "All done."
End Sub

【讨论】:

  • 这是一个重复的问题 :) stackoverflow.com/questions/19817399/…
  • 这是我第三次看到那段代码...stackoverflow.com/questions/19799320/…
  • 这会打开文件,然后在下一行出现下标错误: wb2.Worksheets(filenum(lngposition)).rng.Copy wb.Worksheets(filenum(lngposition) ).rng2.粘贴
  • 两个工作簿(wbwb2)是否包含与filenum(lngposition) 定义的名称完全对应的工作表?
  • 是的.. 两个工作簿的工作表都名为 052,依此类推
【解决方案2】:

当你分配工作表时,你绝对应该有Set在线:

Set sh1 = Worksheets(filenum(lngPosition))

【讨论】:

  • 谢谢..做出改变
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多