首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用变量在callbyname函数中定义对象部件

用变量在callbyname函数中定义对象部件
EN

Stack Overflow用户
提问于 2018-06-18 15:54:27
回答 1查看 2.6K关注 0票数 0

当我想重写程序的一部分时,我正面临着一个问题。这个部分放在module1中,如下所示:

代码语言:javascript
复制
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

我要这样改写:

代码语言:javascript
复制
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是布尔型,指示哪个用户表单(frmAddRecord1或frmAddRecord2)是活动的。

然而,“运行时错误”438: Object不提供此属性或方法“。我相信我被困在了"UF“的定义部分。我可以用变量来定义"callbyname“函数的"object”部分吗?请指点。非常感谢你的真诚帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 17:34:44

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

取决于您在CallByName中使用的CallByNameprocname对应于object的不同成员:(以下情况以“迟绑定对应于早期绑定”的形式表示)

(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 )。方法列在以下代码中:(不要运行代码,代码不执行任何操作)。

代码语言:javascript
复制
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对象的对象属性,而不是方法。因此,它会触发“运行时错误”438: Object不提供此属性或方法的“错误”。

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

代码语言:javascript
复制
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 = ...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50913282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档