Excel 将子函数中定义的变量传递给函数VBA

Excel 将子函数中定义的变量传递给函数VBA,excel,vba,Excel,Vba,我试图使用sub来确定一个动态范围,作为许多函数的输入。我想做的最简单的版本是这样的 这种方法给了我错误。将sub和函数放在不同的模块中没有帮助。我犯了什么错误 Global Info As Range Sub InfoSetter() Worksheets("Example").Activate ActiveSheet.UsedRange.Select Set Info = Selection End Sub Function Test() As Variant

我试图使用sub来确定一个动态范围,作为许多函数的输入。我想做的最简单的版本是这样的

这种方法给了我错误。将sub和函数放在不同的模块中没有帮助。我犯了什么错误

Global Info As Range

Sub InfoSetter()
    Worksheets("Example").Activate
    ActiveSheet.UsedRange.Select
    Set Info = Selection

End Sub

Function Test() As Variant

    Test = Info.Address

End Function

试试下面的方法。这将从设置info值的函数调用sub。这意味着在函数计算时,您的信息将始终是当前使用的范围。此外,使用.Activate和.Select通常被认为是不好的做法。下面的代码在不使用任何一个的情况下执行相同的操作

Global Info As Range

Sub InfoSetter()
    Set Info = Worksheets("Example").UsedRange
End Sub

Function Test() As Variant
    Application.Volatile 'Added so function updates automatically when sheet calculates
    Call InfoSetter
    Test = Info.Address

End Function

编辑:添加应用程序。函数开头的Volatile将使其在工作表每次计算时更新。

根据omegastripes的评论,您的错误可能是因为您的范围为空。给定的测试是一个变体,建议您按如下所示测试空范围

Global Info As Range

Sub TryMe()
MsgBox Test
End Sub
你的代码


你有什么错误?你的代码对我来说很好。对,我明白了,如果我把它们都放在一个模块中,它就可以工作了。但是我想把sub放在一个单独的模块中,这样我就可以从工作表中运行它来设置Info变量,而函数应该放在第二个模块中。但是当我把第二个函数放在另一个模块中时,我得到了一个值错误。考虑到信息是空的,我想在第一个InfoSetter调用之前,您会得到一个值错误。将检查添加到函数测试中,smth类似于If TypeNameInfo Range Then InfoSettervolatile函数可能会增加不必要的开销,如果要强制更新范围,则可能更适合激活或停用包含该范围的工作表。
Sub InfoSetter()
    Set Info = Worksheets("Example").UsedRange
End Sub

Function Test() As Variant
If Info Is Nothing Then
    Test = "Ï'm empty"
Else
    Test = Info.Address
End If
End Function