在 VBA Excel 2007 中传递变体 ByRef

Posted

技术标签:

【中文标题】在 VBA Excel 2007 中传递变体 ByRef【英文标题】:Passing Variant ByRef in VBA Excel 2007 【发布时间】:2016-02-04 21:07:42 【问题描述】:

我在名为 MainForm 的用户窗体中声明了一个公共 Variant 变量

Public increaseArray As Variant
Public countryArray As Variant

然后在 sub on 按钮中单击 MainForm:

Sub testButton_Click()

    Dim country As Variant

    Set countryArray = Module1.callSomeFunctionThatReturnsVariant(1)
    Set increaseArray = Module1.callSomeFunctionThatReturnsVariant(2)
    For Each country In countryArray
        Call Module1.createPage(country)
    Next country
End Sub

在模块 1 中我有:

Function callSomeFunctionThatReturnsVariant(ByVal testInt As Integer) As Variant
   .... do something when testInt = 1
   .... do something when testInt = 2
   callSomeFunctionThatReturnsVariant = someVariant
End Function

Public Sub createPage(ByVal country As String)

     Dim testInt As Integer

     ... do something
     testInt=insertSection(country, MainForm.increaseArray)
End Sub

Function insertSection(ByVal country As String, arr as Variant) As Integer
     Dim arrCountry As Variant

     For Each arrCountry In arr
         If country = "France" Then
             ...do something
             insertSection = 1
             Exit Function
         End If
     Next arrCountry

     insertSection = 2

End Function

在将 MainForm.increaseArray 传递给 insertSection() 函数时,出现 ByRef 参数类型不匹配错误。我试过使用Function insertSection(ByVal country As String, ByVal arr as Variant) As Integer,但我得到了同样的错误。

如果我尝试在 createPage sub Dim testArray As Variant 中定义 Variant 变量并从它的 getter 函数 Set testArray = MainForm.getterForIncreaseArray 中获取 increaseArray,我会收到类型不匹配错误... 如果我将 getter 函数直接传递给 insertSection 函数的调用者,我会得到 ByRef 参数类型不匹配...

请帮忙:)

【问题讨论】:

我不认为用户表单的范围不在它之外,即使它是公开的。 @findwindow,错了,你肯定可以,只是你需要声明为公共,然后用用户窗体的名称调用它。至于问题,将参数传递为 byref (实际上是写 byref ,不要偷懒) @PatrickLepelletier 您有文档或代码来证明这一点吗?我不得不破解自己的代码,但如果范围超出范围就好了。 【参考方案1】:

这个简单的代码运行良好。

不允许在用户表单中声明公共数组(因此使用变体作为伪装是个好主意)。

但是,函数不想接受将它作为参数作为合法数组传递,所以我使用了一个临时的“合法”数组。

在 UserForm1 上:

Option Explicit

Public a As Variant 'i would usually declare it like this : Public a() as variant, but public arrays not allowed in userforms (throws error)
'Private a() as variant ,  would not throw error (inside userform)

Private Sub UserForm_Initialize()
Dim i&
ReDim a(1 To 2) 'absolutely needed, it shows a is actually an array type
a(1) = 1
a(2) = 2
End Sub

Private Sub UserForm_Terminate()
Erase a
End Sub

在一个模块中: 显式选项

Sub test()
Load UserForm1
Dim b&
Call get_value(1, UserForm1.a, b)
Unload UserForm1
MsgBox b
End Sub

Sub get_value(ByVal i&, ByRef arr As Variant, ByRef answer As Long) ' function won't let it through, i used a sub with aditionnal variable as Byref.
answer = arr(i)
End Sub

通过调用 TEST 启动它。

注意:我没有成功在函数中传递参数,所以在 SUB 中通过添加一个名为 Answer 的参数(即 Byref)来实现。

注意2:我回顾了我的旧代码,看起来你可以在函数中传递一个 byref 数组(伪装成变体),但可能是因为这个不是用 () 或其他东西声明的,它没有不想通过函数工作。

注3:在深入研究之后,我找到了一个使用函数的解决方案,并且正如我所想,数组声明是麻烦制造者:

'in a module (use the same userform as before)
Sub test()
Load UserForm1
Dim b&
Dim i& 'counter
Dim Temp_Array() As Long 'as variant works too, but i filled it with numbers so as long is ok too
ReDim Temp_Array(LBound(UserForm1.a) To UBound(UserForm1.a))
'Temp_Array = UserForm1.a 'damn, i first thought this would work, in the same way you can fill a listbox in one simple line (wich would be a 3rd solution passing an array from the userform to a module)
For i = LBound(UserForm1.a) To UBound(UserForm1.a)
    Temp_Array(i) = UserForm1.a(i)
Next i
b = get_value(1, Temp_Array)
Erase Temp_Array
Unload UserForm1
MsgBox b
End Sub

Function get_value(ByVal i&, ByRef arr As Variant) As Long
get_value = arr(i)
End Function

【讨论】:

i didn't succeed in passing argument in a Function OP 正在使用函数...所以你也必须破解它。 推不动的时候拉 下班了,但一定要记得回来看看。 通过使用魔杖、大量啤酒和一个临时数组(这次像我通常所做的那样声明),'passing variables byref'(或'array through Function')起作用了。 【参考方案2】:

根据 findwindow 的评论。您不能从表单中使用模块 1 中的内容,因为它超出了其范围。相反,尝试将 module1 中的所有代码放入一个新的类模块中。从您的表单中实例化一个实例,它应该可以正常工作。

【讨论】:

以上是关于在 VBA Excel 2007 中传递变体 ByRef的主要内容,如果未能解决你的问题,请参考以下文章

VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定

在 VBA Excel 2007 中使用命名范围

如何使用 vba 在 Excel 2007 中找到条件格式单元格的填充颜色值?

Excel VBA:将变体数组返回到选定范围时需要 255 转置字符限制的解决方法

字符串中的正确函数(Excel 2007 VBA)