【问题标题】:Passing range from a RefEdit Control in a Userform to a Variant Array将范围从用户窗体中的 RefEdit 控件传递到变体数组
【发布时间】:2017-10-13 01:48:18
【问题描述】:

我正在尝试将从用户窗体中的 refedit 控件指定的范围传递给变量数组。我有以下代码:

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)

我收到 类型不匹配 错误。

对这里发生的事情有任何想法吗?感谢您提供任何帮助。

最好的,

【问题讨论】:

  • 您在哪里将变量x0y0 传递到Sub DataCheck?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请阅读如何创建minimal reproducible exampleHow to Ask

标签: arrays excel vba


【解决方案1】:

欢迎使用范围界定!

首先,在 每个模块的顶部指定Option Explicit; VBA 现在应该抱怨 y0y0Ny0K 没有在 DataCheck 中声明。

这两个变量是locals,在CommandButton1_Click范围中:你不能在另一个范围中访问它们——而且每个procedure 定义了一个单独的范围

运行时错误 13 具有误导性;意思是因为没有Option Explicit,一个未声明的变量只是在现场“声明”,在运行时,并初始化为vbEmpty,作为一个隐含的Variant。由于vbEmptyEmpty 类型并且不是数组,UBound 不知道如何处理它并抛出一个基本上意味着“我没想到那种类型”的错误。

所以你需要学习传递参数——注意数组必须通过引用传递,所以我建议明确指定ByRef修饰符(@ 987654334@ 如果未指定,则为隐式):

Private Sub DataCheck(ByRef xArray As Variant, ByRef yArray As Variant)
    '...
End Sub

现在不是:

Call DataCheck

你有:

DataCheck x0, y0

Call 关键字已废弃 20 年)

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多