我试图将指定从userform中的refedit控件指定的范围传递给variant数组。我有以下代码:
Private Sub CommandButton1_Click()
Dim y0 As Variant
Dim X0 As Variant
y0 = Range(RefEdit1.Value)
X0 = Range(RefEdit2.Value)
MsgBox (TypeName(y0))
Call DataCheck
Me.Hide
End Sub
消息框显示y0确实是Variant(),但是,当我尝试做一些事情,比如找出y0的尺寸或者使用我有的PrintArray子程序打印它(已经适用于其他数组) ,我收到错误消息。见下文:
Private Sub DataCheck()
'Check dimensions of original data
y0N = UBound(y0, 1)
y0k = UBound(y0, 2)
'X0N = UBound(X0, 1) - LBound(X0, 1) + 1
'X0k = UBound(X0, 2) - LBound(X0, 2) + 1
Debug.Print "N y0 = "; y0N
Debug.Print "k y0 = "; y0k
'Debug.Print "N y0 = "; X0N
'Debug.Print "k y0 = "; X0k
End Sub
我收到“运行时错误'13'”消息。此外,当我将鼠标悬停在此声明上时:
y0N = UBound(y0, 1)
我收到类型不匹配错误。
关于这里发生了什么的任何想法?任何帮助表示赞赏。
最佳,
丹
答案 0 :(得分:1)
欢迎使用范围!
首先,在 每个模块的顶部指定Option Explicit
; VBA现在应该抱怨y0
,y0N
和y0K
未在DataCheck
中声明。
CommandButton1_Click
范围中的两个变量 locals :您无法在另一个范围中访问它们 - 并且每个过程定义了一个单独的范围。
运行时错误13具有误导性;它说的是,因为没有Option Explicit
,一个未声明的变量只会被声明"声明"在现场,在运行时,并初始化为vbEmpty
,作为隐式Variant
。由于vbEmpty
的类型为Empty
并且不是数组,因此UBound
不知道如何处理它并抛出错误,这实际上意味着&#34 ;我不期待那种类型"。
所以你需要学习传递参数 - 注意数组必须通过引用传递,所以我建议指定ByRef
显式修饰符(如果未指定,则ByRef
是隐式的):
Private Sub DataCheck(ByRef xArray As Variant, ByRef yArray As Variant)
'...
End Sub
而不是:
Call DataCheck
你有:
DataCheck x0, y0
(Call
关键字已经过时了20年)