Excel 使用变量在callbyname函数中定义对象部分
当我想重写部分程序时,我面临一个问题。这部分放在模块1中,如下所示: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
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是类,而不是用户形式,现在函数使用正确的类型运行顺畅。