将范围从Userform中的RefEdit控件传递到Variant Array

时间:2017-10-12 17:15:33

标签: arrays excel vba

我试图将指定从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)

我收到类型不匹配错误。

关于这里发生了什么的任何想法?任何帮助表示赞赏。

最佳,

1 个答案:

答案 0 :(得分:1)

欢迎使用范围!

首先,在 每个模块的顶部指定Option Explicit; VBA现在应该抱怨y0y0Ny0K未在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年)