当我想重写部分程序时,我遇到了问题。这部分放在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”函数的“对象”部分吗?请指教。非常感谢你们真诚的帮助。
答案 0 :(得分:1)
CallByName(object, procname, calltype, [args()])
(参考:https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/callbyname-function)在运行时(后期绑定)对object
执行操作。在使用CallByName
之前,您应该确保等效的早期绑定操作有效。
根据您在calltype
中使用的CallByName
,procname
对应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
。定义中的Target
是MSForms.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 = ...