我正在学习如何创建输入框,并且我不断收到同样的错误。我尝试了两台不同的计算机并收到了同样的错误。我得到的错误是"编译错误:错误的参数数量或无效的属性赋值"
这是我的代码:
Option Explicit
Sub InputBox()
Dim ss As Worksheet
Dim Link As String
Set ss = Worksheets("ss")
Link = InputBox("give me some input")
ss.Range("A1").Value = Link
With ss
If Link <> "" Then
MsgBox Link
End If
End With
End Sub
当我运行代码时,会突出显示单词&#34; inputbox&#34;
非常感谢帮助。
谢谢,
答案 0 :(得分:4)
三件事
1)调用你的子词而不是保留词InputBox
,因为这可能会混淆事物。 *编辑......仅此一项就可以解决您的错误。请参阅@Mat's Mug的引用。
2)A̶p̶p̶l̶i̶c̶a̶t̶i̶o̶n̶.̶I̶n̶p̶u̶t̶B̶o̶x̶(̶“̶g̶i̶v̶e̶̶m̶e̶̶s̶o̶m̶e̶̶̶̶̶̶̶̶̶̶̶̶̶)̶使用VBA.Interaction.InputBox(”给我一些输入“)。除了第一点之外,您还可以执行此操作。文档here。
3)与vbNullString
比较而不是“”。见here。从本质上讲,您通常希望这样做,因为vbNullString
正如该链接所述,分配和处理速度更快,占用的内存更少。
Sub GetInput()
Dim ss As Worksheet
Dim Link As String
Set ss = Worksheets("ss")
Link = VBA.Interaction.InputBox("give me some input")
ss.Range("A1").Value = Link
' With ss ''commented out as not sure how this was being used. It currently serves no purpose.
If Link <> vbNullString Then
MsgBox Link
End If
' End With
End Sub
编辑:引用@Mat's Mug:
[在OP的代码中,实际调用的是] VBA.Interaction.InputBox,但是调用被过程的标识符“InputBox”遮蔽,这导致错误。将它更改为Application.InputBox“修复”问题,但根本不调用相同的函数。解决方案是完全限定调用(即VBA.Interaction.InputBox),或重命名过程(例如Sub DoSomething()或两者。
答案 1 :(得分:1)
Sub InputBox()
该程序隐含Public
。大概是用标准模块编写的,这使得它具有全局作用。
Link = InputBox("give me some input")
这意味着调用VBA.Interaction.InputBox
函数,通常会成功。除了命名过程InputBox
之外,您已经更改了VBA解析此标识符的方式:它不再解析为全局范围VBA.Interaction.InputBox
函数;它解析为您的InputBox
过程,因为VBAProject1.Module1.InputBox
(假设您的VBA项目和模块名称分别为VBAProject1
和Module1
)总是优先于定义的任何其他函数在任何其他引用的类型库中 - 包括VBA标准库。
当VBA解析成员调用时,它只查看标识符。如果参数不匹配,它就不会说“嗯好吧,不是那个”并继续在全球范围内搜索更多不同签名的匹配 - 而是它爆炸并说“我找到了你正在寻找的程序for,但我不知道如何处理这些参数“。
如果您更改签名以接受String
参数,则会收到递归调用:
Sub InputBox(ByVal msg As String)
那将编译并运行......并很快炸掉调用堆栈,因为对运行时调用堆栈的深度存在硬性限制。
因此,一个解决方案可能是正确限定 InputBox
调用,以便编译器确切知道该成员的查找位置:
Link = VBA.Interaction.InputBox("give me some input")
另一个解决方案可能是正确命名您的程序,使其名称以动词开头,粗略地描述正在发生的事情,并且不会与全局范围内的任何其他事件发生冲突:
Sub TestInputBox()
另一个解决方案/解决方法可能是使用恰好在Excel对象模型中可用的类似函数as QHarr suggested:
Link = Application.InputBox("give me some input")
这不是您之前调用的函数,并且只能在其InputBox
类中具有Application
成员的VBA主机中工作,而VBA.Interaction.InputBox
全局function在VBA标准库中定义,适用于任何VBA主机。
关于此的说明:
If Link <> "" Then
无论用户是单击“确定”还是通过“X-out”取消对话框,此条件都为False
。 InputBox
函数在取消时返回一个空字符串指针,当一个空字符串输入好的时候返回一个实际的空字符串。
因此,如果需要将空字符串视为有效输入和,您需要能够将其与已取消的输入框区分开来,则需要比较字符串指针:
If StrPtr(Link) <> 0 Then
当用户明确取消时,此条件仅为False
,如果用户提供了合法的空字符串,则仍会评估为True
。