将函数的结果写入变量,结果可能是对象

时间:2018-06-28 10:30:48

标签: vba excel-vba object variant excel

如果我有一个可能返回对象或原始类型的函数-在其中,我可以执行以下操作来处理这两种情况:

openModal() {

const myModalOptions: ModalOptions = {
  enableBackdropDismiss: true,
  showBackdrop:true
};




const myModal: Modal = this.modal.create(ModaltestComponent,myModalOptions);

myModal.present();

myModal.onDidDismiss((data) => {
  console.log("I have dismissed.");

});

但是,如何对存储Function Result() As Variant 'may be object or not '... get item - the return value If IsObject(item) Then Set Result = item Else Result = item End If End Function 的变量执行相同的测试,而无需两次运行该函数?例如

Result

Dim myResult As Variant
If IsObject(Result) Then 'test return type of function
    Set myResult = Result
Else
    myResult = Result
End If

我正在尝试将一系列对象/非对象写入变量类型的数组

3 个答案:

答案 0 :(得分:3)

一种可行的解决方案是通过传递变量ByRef直接写入变量。这样Function就没有返回值,因此可以变成Sub

Sub Result(ByRef writeTo As Variant)
    '... get item - the return value
    If IsObject(item) Then
        Set writeTo = item
    Else
        writeTo = item
    End If
End Sub

称为

Dim myResult As Variant
Result myResult 'overwrites whatever writeTo contains

答案 1 :(得分:1)

例如,来自一个类的片段,该片段动态处理调用类的函数。如果可以基于RubberDuck Reflection API实现一些基本的VBA反射,则正在进行原型制作。当我动态地调用类和模块函数时,没有可靠的方法可以提前知道是否从函数调用中返回基元或对象类型。

请注意,我尚未测试代码,因此需要在InvokeMember函数中添加一些错误处理。

Greedo的解决方案类似,期望函数结果通过引用是一个单独的参数,这种方式可以放入例如函数调用中。 CallByName作为第二个参数。第一个参数是存储引用调用结果的变量。函数结果参数y是通过引用引用的,因为可能会生成一个数组,并且避免传入时将整个数组复制到内存中。

Public Function InvokeMember(ByVal obj As Object, ParamArray args() As Variant) As Variant
    Assign InvokeMember, CallByName(obj, Me.FullName, Me.CallType, args)
End Function

在一个模块中,来自VBA Extension Library

的代码
' Assign x to y regardless of object or primitive
Public Sub Assign(ByRef x as Variant, ByRef y as Variant)

    If IsObject(y) Then
        Set x = y
    Else
        x = y
    End If

End Sub

感谢这个问题,它帮助我解决了相同的问题,避免在处理返回的对象,数组或原始数据类型时两次调用同一函数。

答案 2 :(得分:0)

另一种解决方案是使用Array()函数并将函数或属性输出包装在其中。
当我测试原始解决方案时,从内存中来看,它不适用于仅来自类属性的值起作用的地方。使用接口或直接使用属性并获取变体结果时,这是一个问题。
注意:我认为这不适用于返回UDT或固定字符串长度的函数/属性。

在您的示例中使用以下内容:

Dim myResult As Variant
Dim resultOutput as Variant
resultOutput = Array(Result)
If VBA.IsObject(resultOutput(0)) Then
    set myResult = resultOutput(0)
Else
    myResult = resultOutput(0)
End If