2016-05-02 7 views
1

これはなぜ動作しないのかわかりません。これははるかに大きなサブルーチンの一部ですが、この問題をInStr関数でのワイルドカードの使用に限定しました。InStrまたはワイルドカードで問題が発生していますか?

できるだけ多くの情報をInStrとワイルドカードで検索しようとしましたが、これまでのところになるはずです。しかし、それはしません。

Dim String1 As String 
    Dim String2 As String 
    Dim TestString As String 
    Dim Location As Integer 

    String1 = "Hello" 
    String2 = "Goodbye" 
    TestString = "Hello and Goodbye" 
    Location = InStr(1, TestString, (String1 & "*" & String2), vbTextCompare) 
    If Location >= 1 then 
     'Do Something 
    End If 

OK、私は人々が示唆されているものに基づいていくつかのことを試してみた、そして今、私はこの時点でのよ...

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 

私は、ののDebug.Printを行ってきましたTempArrayの各セクションには空白が含まれているので、分けることが分かります。

今は何が欠けていますか? :(

答えて

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 

、文字列1と文字列2の正しい照合順序を保証するために、InStr関数機能の進行を使う。

'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

の前と後の両方に発生した場合、あなたの 'Instr'のバージョンが失敗する可能性がある場合、ここで他の答えが間違った結果を与えることがあなたの何かのコード

注意のために必要とされる場合'String2'が' String1'の前または後に発生する場合 –

+0

String1がString1の前に出現すると失敗しますが、これはOPが動作していた 'String1&" *& "String2'パターンに従うように設計されています元々。私は、String2がString1の部分文字列であり、最初の一番左の文字ではないという偽陽性を考えなかった。 +1良いキャッチ!私は訂正で編集します。私はあなた自身の答えに近いものを思いついたようだ。 – Jeeped

+0

String2がString1の後の_and_の前にある場合、それは偽の否定を与えます。最初のコードは最初のコードを検出し、falseを返しますが、2番目のコードはパターンと一致する必要があります。 –

1

InStr(1, TestString, (String1 & "*" & String2), vbTextCompare)の暗黙の論理である:

TestStringコンポーネント

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 
に試験を打破、 Instrはワイルドカードをサポートしていないので、 String2

続いて、0個以上の文字が続くString1が含ま

iは、String1の位置を与え、jは、の位置を与えるこれらはString2StringのストリングであるかString2String1

関連する問題