无效的过程调用或IsError&InStr的参数

我希望有人可以帮助我收到的错误?

我正在尝试在包含大量文本的单元格中查找值。 我试图在单元格中find文本"TOTAL DDD AMOUNT" ,然后返回值

(注 – Range("P1458")是一个示例单元格,我知道该值存在,并应返回一个值)。

 Dim ValDDDRng As Range Set ValDDDRng = Worksheets("DATA2").Range("P1458") Dim ValDDD As Variant If Not IsError(Mid(ValDDDRng, InStr(1, ValDDDRng, "TOTAL DDD AMOUNT", _ vbTextCompare) + 17, (InStr(1, ValDDDRng, ",", vbTextCompare)) _ - (InStr(1, ValDDDRng, "TOTAL DDD AMOUNT", vbTextCompare)))) Then 

正在查找这些值的单元格内的文本的示例。 有时开始可能会包含额外的文本,因此它与“金额”可能在单元格中的位置不一致。 我期待返回75.33的价值,但首先澄清,没有错误获得价值。 如果IsError返回一个错误,那么它将返回一个Nothing,否则返回实际的值(从示例£75.33)

****税率:58.99 GBR,总DDD金额:75.33 GBR,总费用:16.34 GBR,**蓝/绿**,文件logging准备,*****清除DDD *****

当我运行如果不是IsError的例子,我收到一个无效的过程调用或参数

"TOTAL DDD AMOUNT"之后find第一个数值的解决scheme分为2个部分。

第1部分 :使用Instr函数查找单元格内"TOTAL DDD AMOUNT"string的位置。

 xPos = InStr(1, ValDDDRng, "TOTAL DDD AMOUNT", vbTextCompare) '<-- result is 23 

第2部分 :通过使用Reg.Execute(Mid(ValDDDRng, xPos))"TOTAL DDD AMOUNT"开始,仅使用单元格的文本,使用RegEx对象获取第一个数字结果(以任何具有十进制值的格式Reg.Execute(Mid(ValDDDRng, xPos))

在您的示例中, Mid(ValDDDRng, xPos) =“总计DDD金额:75.33 GBR,总费用:16.34 GBR,**蓝/绿**,文件logging准备,*****清除DDD *****”

 Dim ValDDDRng As Range Dim ValDDD As Variant, xPos As Long ' RegEx variables Dim Reg As Object Dim RegMatches As Variant, Match As Variant Set ValDDDRng = Worksheets("DATA2").Range("P1458") xPos = InStr(1, ValDDDRng, "TOTAL DDD AMOUNT", vbTextCompare) Set Reg = CreateObject("VBScript.RegExp") With Reg .Global = True .IgnoreCase = True .Pattern = "(\d+)(?:\.(\d{1,2}))?" ' Match number (with decimals) End With Set RegMatches = Reg.Execute(Mid(ValDDDRng, xPos)) If RegMatches.Count >= 1 Then ' make sure there is at least 1 match ValDDD = RegMatches(0) ' <-- this is the numeric value you are looking for End If 

您的原始代码抛出该错误,因为在TOTAL DDD AMOUNT之前有一个逗号

这意味着您正在尝试将负数传递给Mid命令。

如果你把你的命令划分成不同的阶段,这将更容易看到:

 Sub original() Dim ValDDDRng As Range Set ValDDDRng = Worksheets("DATA2").Range("P1458") Dim ValDDD As Variant Dim totalPos, commaPos As Integer Dim total As String Dim totalSearch As String totalSearch = "TOTAL DDD AMOUNT" totalPos = InStr(1, ValDDDRng, totalSearch, vbTextCompare) commaPos = InStr(1, ValDDDRng, ",", vbTextCompare) total = Mid(ValDDDRng, totalPos + 17, commaPos - totalPos) ' commaPos - totalPos is negative! If Not IsError(total) Then MsgBox "Total is " & total Else MsgBox "Is error" End If End Sub 

以下代码片段查找TOTAL DDd AMOUNT后的逗号,然后查找75.33 GBR

 Sub improved() Dim ValDDDRng As Range Set ValDDDRng = Worksheets("DATA2").Range("P1458") Dim ValDDD As Variant Dim totalPos, commaPos As Integer Dim total As String Dim totalSearch As String totalSearch = "TOTAL DDD AMOUNT" totalPos = InStr(1, ValDDDRng, totalSearch, vbTextCompare) commaPos = InStr(totalPos, ValDDDRng, ",", vbTextCompare) ' need to find the second comma total = Mid(ValDDDRng, totalPos + 17, commaPos - totalPos - Len(totalSearch) - 1) If Not IsError(total) Then MsgBox "Total is " & total Else MsgBox "Is error" End If End Sub 

所有这一切,使用正则expression式根据Shai Rado的答案是一个更简洁的解决scheme,不同的input文本时不易碎。 我只是想告诉你错误来自哪里以及如何重新安排你的代码,以便于debugging