当我想重写程序的一部分时,我正面临着一个问题。这个部分放在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 FunctionFrmAddRecord1Shown和FrmAddRecord2Shown是布尔型,指示哪个用户表单(frmAddRecord1或frmAddRecord2)是活动的。
然而,“运行时错误”438: Object不提供此属性或方法“。我相信我被困在了"UF“的定义部分。我可以用变量来定义"callbyname“函数的"object”部分吗?请指点。非常感谢你的真诚帮助。
发布于 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中使用的CallByName,procname对应于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 )。方法列在以下代码中:(不要运行代码,代码不执行任何操作)。
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对象的对象属性,而不是方法。因此,它会触发“运行时错误”438: Object不提供此属性或方法的“错误”。
我认为您要做的实际上是在Target对象( MSForms.Control对象)上使用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 = ...
https://stackoverflow.com/questions/50913282
复制相似问题