Vba 子例程的下标超出范围错误

Vba 子例程的下标超出范围错误,vba,excel,Vba,Excel,我正在尝试在不同的工作簿之间复制数据。工作簿的名称碰巧是随机的,因为用户可以选择文件名,所以我在代码中创建了一组工作簿。当我在程序中包含一个子例程时,它表示下标超出范围 关于如何确保子程序继续理解我对工作簿的定义,有什么想法吗 如果您不太了解第一个子系统背后的原理,我的代码将被简化: Option Explicit Sub testwe() Dim wb As Workbook, wb2 As Workbook, vFile As Variant Set wb = ActiveWorkbook

我正在尝试在不同的工作簿之间复制数据。工作簿的名称碰巧是随机的,因为用户可以选择文件名,所以我在代码中创建了一组工作簿。当我在程序中包含一个子例程时,它表示下标超出范围

关于如何确保子程序继续理解我对工作簿的定义,有什么想法吗

如果您不太了解第一个子系统背后的原理,我的代码将被简化:

Option Explicit
Sub testwe()
Dim wb As Workbook, wb2 As Workbook, vFile As Variant
Set wb = ActiveWorkbook 

vFile = Application.GetOpenFilename("Excel-files,*.xls", _
    1, "Select One File To Open", , False)
'if the user didn't select a file, exit sub
If TypeName(vFile) = "Boolean" Then Exit Sub
Workbooks.Open vFile
Set wb2 = ActiveWorkbook 'set the opened file as wb2

Call test123
End Sub

 sub test123()
 wb.Worksheets("Sheet1").Range("A1") = wb2.Worksheets("Sheet1").Range("B1")
 End Sub

您需要将wb和wb2设置为全局:

Dim wb As Workbook, wb2 As Workbook

Sub testwe()
    Set wb = ActiveWorkbook

    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    Set wb2 = ActiveWorkbook 'set the opened file as wb2
    Call test123
End Sub

 Sub test123()
    wb.Sheets("Sheet1").Range("A1") = wb2.Sheets("Sheet1").Range("B1")
 End Sub
编辑#1

此版本使用Doug的建议:

Sub testwe()
    Dim wb As Workbook, wb2 As Workbook
    Set wb = ActiveWorkbook
    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    Set wb2 = ActiveWorkbook 'set the opened file as wb2
    Call test123(wb, wb2)
End Sub

 Sub test123(wb As Workbook, wb2 As Workbook)
    wb.Sheets("Sheet1").Range("A1") = wb2.Sheets("Sheet1").Range("B1")
 End Sub

您在哪里为test123声明
wb
wb2
。如果我在没有显式设置
选项的情况下运行代码,我会得到一个所需的
对象
错误。另外,您确定
wb2
将有一个名为
Sheet1
的工作表吗?@douglancy您是对的,我再次尝试了代码,它显示的是运行时错误,而不是我所说的错误。。有点奇怪。我确信wb2有Sheet1。假设错误发生在
test123
中,
下标超出范围
错误将意味着没有拼写完全相同的“Sheet1”。至少我看不出还有其他原因。非常感谢!我还学到了另一件事,那就是把它们放在全球范围内——这是个糟糕的建议。除非必要,否则应避免使用全局变量。相反,将工作簿作为变量传递给子例程。此外,这并没有回答原始的
下标超出范围的问题。嗨,道格:将它们作为参数传递是个好主意……我没有考虑过……下标超出范围可能表示“Sheet1”与“Sheet1”拼写有问题。@Douglancy您是对的,对于显示代码,我可以在没有超出范围问题的情况下运行它,但是当涉及到我的整个长度时,超出范围问题就出现了up@Gary'sStudent将它们作为参数传递,您的意思是在Sub test123()上执行“Set wb2=ActiveWorkbook”?