InStr或我的通配符会导致问题吗?

时间:2016-05-02 23:10:49

标签: excel vba excel-vba text-parsing

我不知道为什么这不起作用。它是一个更大的子程序的一部分,但我已经将问题缩小到使用带有InStr函数的通配符。

我试图在InStr和通配符上找到尽可能多的信息,据我所知,应该工作。但事实并非如此。

    Dim SourceString As String
    Dim TestString As String
    Dim TempArray() As String

    SourceString = "Hello and Goodbye"
    TestString = "hello * goodbye"

    TempArray = Split(TestString, "*")
    If SourceString Like _
          Chr(42) & TempArray(0) & Chr(42) & TempArray(1) & Chr(42) Then
       Found = True
    End If

好的,我根据人们的建议尝试了一些东西,现在我就是这样......

isEmpty

我已经完成了TempArray每个部分的debug.print,它包含了空格,所以我知道它正在分裂。

我现在缺少什么? :(

2 个答案:

答案 0 :(得分:2)

InStr function不使用模式匹配,因此您的通配符星号被视为文字星号(例如Chr(42))。

也许切换到喜欢模式匹配会做出更好的布尔评估。

'method 1
If TestString Like Chr(42) & String1 & Chr(42) And _
   TestString Like Chr(42) & String2 & Chr(42) Then
    'Do Something
End If
'method 2
If TestString Like Chr(42) & String1 & Chr(42) & String2 & Chr(42) Then
    'Do Something
End If

或者,使用InStr函数的进展来确保String1和String2的正确匹配顺序。

'method 1
If CBool(InStr(1, TestString, String1, vbTextCompare)) And _
  InStr(1, TestString, String2, vbTextCompare) > InStr(1, TestString, String1, vbTextCompare) Then
    'Do Something
End If
'method 2
dim p as long
If CBool(InStr(1, TestString, String1, vbTextCompare)) Then
    p = InStr(1, TestString, String1, vbTextCompare) + Len(String1)
    If CBool(InStr(p, TestString, String2, vbTextCompare)) Then
        'Do Something
    End If
End If

答案 1 :(得分:1)

InStr(1, TestString, (String1 & "*" & String2), vbTextCompare)的隐含逻辑是:

TestString包含String1后跟0个或多个字符,后跟String2

由于Instr不支持通配符,因此将测试分解为组件

Sub Demo()
    Dim String1 As String
    Dim String2 As String
    Dim TestString As String
    Dim Location As Integer
    Dim i As Long, j As Long

    String1 = "Hello"
    String2 = "Goodbye"
    TestString = "Hello and Goodbye"
    i = InStr(1, TestString, String1, vbTextCompare)
    If i > 0 Then
        j = InStr(i + Len(String1), TestString, String2, vbTextCompare)
        If j > 0 Then
            'Do Something
        End If
    End If
End Sub

i给出String1的位置,j给出String2的位置,如果这些是您的Do Something代码需要的话

请注意,如果String2String的子字符串,或String2

之前和之后String1出现var metFital = { "IMP_TRAV_SP": { type: "cont", Est: 0.055 },....} var IMP_TRAV_SP= 20; var EvalueFital=0 for (var par in metFital) { if (metFital[par].type == "cont") { EvalueFital = EvalueFital + ((metFital[par].Est) *par); } }; ,则此处的其他答案可能会产生错误结果