6

私は VBA を初めて使用し、2 つのシート間で部分的な文字列 (またはセル) の一致を行いたいと考えています。

Name1 の例は、「IT エグゼクティブ Sally Lim」です。

Name2 の例は「Sally Lim」です。

Name1 = Sheets("Work").Cells(RowName1, ColName1)
Name2 = Sheets("Roster").Cells(RowName2, ColName2)

'This condition doesn't work
If Name1 = "*" & Name2 & "*" Then
    'The "Name2" comes out with a compile error: Invalid Qualifier
    Name2.Font.Strikethrough
    Exit Do
Else
    End If

しかし、それは機能していません。コーディングを実行すると、何も起こらないか、エラーが表示されます。助けてください

編集されたコーディング:

If ShiftName Like "*" & CashName & "*" Then
    CashName.Font.Strikethrough = True

John Coleman の提案に従って宣言を「文字列」から「範囲」に変更した後、取り消し線の部分が解決され、「コンパイル エラー」が表示されなくなりました。

Name1 と Name2 を両方とも Sally に変更してテストし、次の条件を三振に使用すると動作します。条件を実行不可能にしたのは「*」であると私は信じていました。

If ShiftName Like CashName Then
    CashName.Font.Strikethrough = True

それに応じて条件を変更して部分一致を行うにはどうすればよいですか?

2番目の編集:

私の悪い!Name1 が大文字になっていることに気付きました。

4

2 に答える 2

5

の使用に関する @MacroMan の回答に加えてLike、正しく使用する必要もありますStrikethrough。これはブール型のプロパティで、True に設定する必要があります。

If Name1 Like "*" & Name2 Then
    Name2.Font.Strikethrough = True
    Exit Do
Else
    End If

編集時:

拡張された質問に基づいて、次のようなことができます。

Dim Name1 As Range, Name2 As Range 'If you don't have this already declared

'then ... in the loop:

Set Name1 = Sheets("Work").Cells(RowName1, ColName1)
Set Name2 = Sheets("Roster").Cells(RowName2, ColName2)

If Name1.Value Like "*" & Name2.Value & "*" Then
    Name2.Font.Strikethrough = True
    Exit Do
Else
    End If

Range 変数で使用することは厳密には必要ではありません.Value(それを使用しなくても期待どおりに動作する比較を使用しますLike) が、範囲変数を使用する場合は、既定のプロパティに依存するのではなく、明示的に指定することが適切な VBA コーディング スタイルであると多くの人が考えています。範囲オブジェクト。

Name1変数をName2完全に省略することもできます。

If Sheets("Work").Cells(RowName1, ColName1).Value Like "*" & Sheets("Roster").Cells(RowName2, ColName2).Value & "*" Then
   Sheets("Roster").Cells(RowName2, ColName2).Font.Strikethrough = True
    Exit Do
Else
    End If

最後の発言:Else直後に続くEnd Ifはやや無意味です。おそらく、実際のコードはelse句で何かを行います。そうでない場合-elseを完全に削除し、End If直後に持っていますExit Do

于 2016-05-13T11:07:56.857 に答える