使用变量在callbyname函数中定义对象部分

时间:2018-06-18 15:54:27

标签: excel-vba vba excel

当我想重写部分程序时,我遇到了问题。这部分放在module1中,如下所示:

Public Function InputCorr(Target As MSForms.Control) As Boolean

    If FrmAddRecord1Shown Then
        Target.Value = CallByName(frmAddRecord1, Target.Name & "_Min", VbMethod)
    ElseIf FrmAddRecord2Shown Then
        Target.Value = CallByName(frmAddRecord2, Target.Name & "_Min", VbMethod)
    End If

End Function

我将改写如下:

Public Function InputCorr(Target As MSForms.Control) As Boolean

    Dim UF As UserForm

    If FrmAddRecord1Shown Then
        set UF = frmAddRecord1
    ElseIf FrmAddRecord2Shown Then
        set UF = frmAddRecord2
    EndIf 

    Target.Value = CallByName(UF, Target.Name & "_Min", VbMethod)

End Function

FrmAddRecord1Shown和FrmAddRecord2Shown是布尔值,表示哪个userform(frmAddRecord1或frmAddRecord2)处于活动状态。

但是,“运行时错误”438“:对象不支持此属性或方法”。我相信我被困在“UF”定义部分。我可以用变量定义“callbyname”函数的“对象”部分吗?请指教。非常感谢你们真诚的帮助。

1 个答案:

答案 0 :(得分:1)

CallByName(object, procname, calltype, [args()])(参考:https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/callbyname-function)在运行时(后期绑定)对object执行操作。在使用CallByName之前,您应该确保等效的早期绑定操作有效。

根据您在calltype中使用的CallByNameprocname对应object的不同成员:(以下情况以&#的形式表示) 34;后期绑定对应于早期绑定")

(1)CallByName(object, procname, calltype:=vbGet)对应object.[Property]

(2)CallByName(object, procname, calltype:=vbLet)对应object.[Property, which is a value]

(3)CallByName(object, procname, calltype:=vbMethod)对应object.[Method]

(4)CallByName(object, procname, calltype:=vbSet)对应object.[Property, which is an object]

现在,在您的函数中,您正在UF对象(UserForm对象)上执行CallByName(UF, procname, VbMethod),这与上面提到的Case(3)相对应。因此,您的procname应该是UserForm对象的方法。您可以在对象浏览器中检查UserForm对象的方法(在VBA编辑器中按F2,然后在MSForms Libary下找到UserForm)。这些方法列在以下代码中:(不要运行代码,代码不做任何事情。)

Private Sub UserFormMethods()
    Dim ufForm As UserForm

    Set ufForm = frmAddRecord1

    With ufForm
        .Copy
        .Cut
        .Paste
        .RedoAction
        .Repaint
        .Scroll
        .SetDefaultTabOrder
        .UndoAction
    End With
End Sub

但是,在CallByName函数中,procname参数为Target.Name。定义中的TargetMSForms.Control对象,它是UserForm对象的对象PROPERTY,而不是METHOD。因此,它会触发"运行时错误" 438":对象不支持此属性或方法"错误。

我认为您要做的是在CallByName对象(Target对象)上实际使用MSForms.Control。我建议将你的功能改为:

Public Function InputCorr(Target As MSForms.Control) As Boolean
    Dim UF As UserForm
    Dim ctlTarget As MSForms.Control

    If FrmAddRecord1Shown Then
        Set UF = frmAddRecord1
    ElseIf FrmAddRecord2Shown Then
        Set UF = frmAddRecord2
    End If

    Set ctlTarget = CallByName(UF, Target.Name, VbGet)
    Call CallByName(ctlTarget, "_Min", VbMethod)
End Function

我无法在对象浏览器中找到MSForms.Control._Min方法。也许这是一种隐藏的方法,但你必须确保这种方法存在。

另外,您没有指定函数的返回值。它应该有一个最后一行,如:InputCorr = ...