输入框在VBA中收到编译错误

时间:2018-02-03 16:05:39

标签: excel vba excel-vba

我正在学习如何创建输入框,并且我不断收到同样的错误。我尝试了两台不同的计算机并收到了同样的错误。我得到的错误是"编译错误:错误的参数数量或无效的属性赋值"

这是我的代码:

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;

非常感谢帮助。

谢谢,

2 个答案:

答案 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项目和模块名称分别为VBAProject1Module1)总是优先于定义的任何其他函数在任何其他引用的类型库中 - 包括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”取消对话框,此条件都为FalseInputBox函数在取消时返回一个空字符串指针,当一个空字符串输入好的时候返回一个实际的空字符串。

因此,如果需要将空字符串视为有效输入,您需要能够将其与已取消的输入框区分开来,则需要比较字符串指针:

If StrPtr(Link) <> 0 Then

当用户明确取消时,此条件仅为False,如果用户提供了合法的空字符串,则仍会评估为True