首页 > 解决方案 > 调用另一个子时 ByRef 类型不匹配

问题描述

我试图通过使用 for 循环传递 i 值来在 VBA 中有一个子程序来调用另一个子程序。问题是当您运行 forLoop() 子程序时,出现错误 ByRef 类型不匹配。我只是在尝试这个示例方法,看看它是否有效,以便我可以放入更大的宏中。

我尝试添加 ByVal 方法,但错误仍然存​​在。有人请帮助我。

forLoop 子

Public Sub forLoop()

 For i = 1 To 3

    Call Fetch_data(i)
    
 Next i
End Sub

Fetch_data() 子

Sub Fetch_data(num As Integer)
    
    Dim data As String
    Dim myCellValue As range
    Dim myCellValue1 As range
    Dim sht As String
    
    Set sht = "mySheet" & num
    Set myCellValue = sht.range("J6")
    Set myCellValue1 = sht.range("J8")
    myCellValue1.Value = myCellValue.Value
    
End Sub

标签: excelvba

解决方案


问题是

Sub Fetch_data(num As Integer)

是相同的

Sub Fetch_data(ByRef num As Integer)

所以通过参考Call Fetch_data(i)给出。i但是由于在forLoop()变量i中没有声明它是Variant默认Integer的,因此类型不匹配。确保正确使用Option Explicit和声明所有变量:

Public Sub forLoop()
    Dim i As Integer
    For i = 1 To 3
        Fetch_data i
    Next i
End Sub

您也可以制作参数ByVal,因为不需要它ByRef(否则您的子Fetch_data可能会弄乱循环计数器forLoop

Sub Fetch_data(ByVal num As Integer)
    Dim data As String
    Dim myCellValue As range
    Dim myCellValue1 As range
    Dim sht As Worksheet
    
    Set sht = ThisWorkbook.Worksheets("mySheet" & num)
    Set myCellValue = sht.range("J6")
    Set myCellValue1 = sht.range("J8")
    myCellValue1.Value = myCellValue.Value 
End Sub

推荐阅读