Excel UDF中调用RandBetween函数提示未定义问题咨询
问题成因
RandBetween是Excel工作表函数,不属于VBA原生内置函数,在VBA中调用必须显式通过Application.WorksheetFunction对象调用,否则会被识别为未定义的过程/函数。你在Sub过程中可正常运行大概率是对应Sub代码已添加该前缀,或工程额外引用了包含该函数的依赖库,而UDF运行时的上下文不会自动加载这类隐含依赖,因此触发报错。- 原代码中
Choose(RandBetween(1, 2), Left(A, 2), Right(A, 2)) Or Choose(1, Left(A, 2), Right(A, 2))的逻辑存在错误:Or是VBA的逻辑运算符,无法实现随机二选一的效果,只会将两个Choose返回的字符串做布尔运算,最终返回True/False而非你需要的截取结果。
修复方案
提供两种兼容方案,均可实现需求:
方案1:显式调用工作表函数实现
Function SCountry(A As String) ' 可选:添加下一行可让函数每次工作表重算时自动更新随机结果 ' Application.Volatile If Len(A) = 2 Then SCountry = A ElseIf Len(A) = 4 Then SCountry = Choose(Application.WorksheetFunction.RandBetween(1, 2), Left(A, 2), Right(A, 2)) Else SCountry = "Error" End If End Function
方案2:使用VBA原生随机函数实现(兼容性更强)
不需要依赖Excel工作表函数,在所有VBA环境下都可正常运行:
Function SCountry(A As String) ' 可选:添加下一行可让函数每次工作表重算时自动更新随机结果 ' Application.Volatile If Len(A) = 2 Then SCountry = A ElseIf Len(A) = 4 Then ' VBA原生Rnd生成1-2的随机整数,效果等同于RandBetween(1,2) Randomize SCountry = Choose(Int(2 * Rnd + 1), Left(A, 2), Right(A, 2)) Else SCountry = "Error" End If End Function
这里加Randomize是为了避免每次打开文件时随机序列重复,保证随机结果的随机性。
内容的提问来源于stack exchange,提问作者Guerreiro
相关产品推荐
相关产品推荐

