【问题标题】:Range.Find.Execute error "Argument Not Optional" Excel VBARange.Find.Execute 错误“参数不是可选的”Excel VBA
【发布时间】:2015-08-24 12:33:29
【问题描述】:

我的名字是 Joe,我是 Excel VBA 编程的非常新手。在实习期间,我被要求编写一个有助于分析停车数据的程序,我决定使用 Excel 作为基础来存储数据并创建图表。我还决定我需要使用宏来改进程序的功能和自动化。

我学习了基本的 Excel VBA 只是为了开发这个表格,所以这是我第一次在 Excel 中编写宏。

无论如何,工作表的数据存储在不同时间段的列中,并且列顶部的单元格标记了该列。数据按土地利用类型分隔,例如购物中心、电影院、超市等。用户可以单击组合框来选择土地利用,并有一个宏显示相应土地利用的数据使用 Range.Find 方法的图表。我的问题是一些土地用途没有与它们相关的不同功能的数据,我希望能够在 Range.Find 方法返回错误之前知道这一点。因此,我认为一个简单的 If 语句可以通过合并 Range.Find.Execute 方法来工作,该方法应该返回一个布尔值,但在运行时总是返回一个错误,“Argument not Optional”。调试器总是突出显示“查找”。

我正在 Excel IDE 中进行编辑(如果您可以这样称呼它),而不是外部 VBA 编辑器。我当前的 Excel 版本是 2010。

我还搜索了 Stack Overflow、MSDN 和其他网站以寻求答案,但我似乎找不到答案。如果我错过了这个问题的答案,如果我找到或有人指出,我会删除它。

下面是一些可以在工作表中使用的示例代码,除了第一行总是返回错误。 MSDN 网站上的示例代码似乎也不起作用。

If Range("A1:B20").Find.Execute(ComboBox1.Value) = True Then

    Range("A1:B20").Find(ComboBox1.Value).Activate

    'And do this

Else

    MsgBox ("No data available for this selection.")

    'And do this
End If

【问题讨论】:

  • 我注意到您使用的Find 对象和Execute 方法似乎是Microsoft Word 对象和方法,而不是Excel。
  • @Soulfire 谢谢,似乎是这样。我在想它返回一个布尔值,它在 word 中执行,但它在 Excel 中返​​回一个范围对象。

标签: vba excel


【解决方案1】:

首先,如果您要继续使用 VBA,我强烈建议您添加书签 this doc page。这对您今后将是无价的:)

当您查看Range.Find 的文档时,它说有一个必需参数。在您的第一个 if 语句中,您尝试不带参数调用它:

If Range("A1:B20").Find.Execute(ComboBox1.Value) = True Then

请注意,文档还说

如果没有找到匹配项,则此方法返回 Nothing。

大概你想做的事情是这样的:

Dim FoundRange as Range
Set FoundRange = Range("A1:B20").Find(ComboBox1.Value)

if not(FoundRange is Nothing) then
    Range("A1:B20").Find(ComboBox1.Value).Activate
    'And do this
else
    MsgBox ("No data available for this selection.")
end if

【讨论】:

  • 迈克尔,非常感谢。我在想它返回一个布尔值而不是一个 Range 对象,所以这应该可以解决我的问题。我会告诉你它是否有效。
  • 太棒了!很高兴帮助:)
【解决方案2】:

Find() 如果成功则返回 Range 对象,而不是布尔值。而且没有Find.Execute

Dim r As Range
Set r = Range("A1:B20").Find(ComboBox1.Value)

If Not r Is Nothing Then

    r.Activate

    'And do this

Else

    MsgBox ("No data available for this selection.")

    'And do this
End If

【讨论】:

  • 邦德,谢谢你的回答。你是对的,我认为它返回一个布尔值而不是一个范围对象,这样应该可以解决问题。
【解决方案3】:

我认为问题在于您需要给 Find 一个要查找的值(我不确定您为什么要使用 .execute)。

以下应该有效:

If not Range("A1:B20").Find(ComboBox1.Value) is nothing Then

    Range("A1:B20").Find(ComboBox1.Value).Activate

    'And do this

Else

    MsgBox ("No data available for this selection.")

    'And do this
End If

请注意,我使用“Is Nothing”来确定是否在该范围内找到了 combobox1.value。

【讨论】:

  • 谢谢,使用“Nothing”而不是“False”似乎可行,因为我认为它会返回布尔值而不是 Range 对象。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多