Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用变量在callbyname函数中定义对象部分_Excel_Vba - Fatal编程技术网

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

Excel 使用变量在callbyname函数中定义对象部分,excel,vba,Excel,Vba,当我想重写部分程序时,我面临一个问题。这部分放在模块1中,如下所示: Public Function InputCorr(Target As MSForms.Control) As Boolean If FrmAddRecord1Shown Then Target.Value = CallByName(frmAddRecord1, Target.Name & "_Min", VbMethod) ElseIf FrmAddRecord2Shown Then

当我想重写部分程序时,我面临一个问题。这部分放在模块1中,如下所示:

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是布尔值,表示哪个用户窗体frmAddRecord1或FRMADDRECORD2处于活动状态

但是,运行时错误438:对象不支持此属性或方法。我想我被困在了关键的部分。我可以用变量定义callbyname函数的对象部分吗?请给我一些建议。非常感谢您的真诚帮助。

CallByNameobject、procname、calltype、[args]参考:在运行时后期绑定期间对对象执行操作。在使用CallByName之前,您应该确保等效的早期绑定操作有效

根据您在CallByName中使用的calltype,procname对应于对象的不同成员:以下情况以后期绑定对应于早期绑定的形式表示

1 CallByNameobject、procname、calltype:=vbGet对应于对象。[属性]

2 CallByNameobject、procname、calltype:=vbLet对应于对象。[属性,它是一个值]

3 CallByNameobject,procname,calltype:=vbMethod对应于对象。[方法]

4 CallByNameobject,procname,calltype:=vbSet对应于对象。[属性,它是一个对象]

现在,在您的函数中,您正在UF对象上执行一个UserForm对象,该对象具有CallByNameUF、procname、VbMethod,这与上面提到的案例3相对应。因此,procname应该是UserForm对象的一个方法。您可以在对象浏览器中检查UserForm对象的方法,在VBA编辑器中按F2键,然后在MSForms库下查找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。定义中的目标是MSForms.Control对象,它是UserForm对象的对象属性,而不是方法。因此,它触发运行时错误438:对象不支持此属性或方法错误

我认为您实际上是在目标对象MSForms.Control对象上使用CallByName。我建议将您的功能更改为:

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.\u Min方法。也许这是一个隐藏的方法,但您必须确保此方法存在


另外,您没有指定函数的返回值是什么。最后一行应该是:InputCorr=…

非常感谢您一步一步地详细描述我的问题。但是我太笨了,vba太绿了,我不能完全理解。由于我的函数在用变量替换frmAddRecord1和frmAddRecord2之前运行良好,我相信我的声明存在问题。您能解释一下函数的用途吗?我找到了原因,因为frmAddRecord2是类,而不是用户形式,现在函数使用正确的类型运行顺畅。