この記事では、このマクロ(エクセルVBA)で肝になる実際に文字列をどうやって検索しているのかについての解説です。
検索の肝になっているのは下記のコードです。
Do While NamaeNagasa >= KBanme
KBanme = KBanme + 1
KensakuChar = Mid(Namae, KBanme, 1)
If KensakuChar <> " " Or KensakuChar <> " " Then
Exit Do
End If
Loop
Do While NamaeNagasa >= LBanme
LBanme = LBanme + 1
ListChar = Mid(ListNamae, LBanme, 1)
If ListChar <> " " Or ListChar <> " " Then
Exit Do
End If
Loop
For p = 0 To ListNagasa
r = r + 1
If KensakuChar = ListChar Then
Charsu = Charsu + 1
If NamaeNagasa = Charsu Then
With MeNamae
.ListBox1.AddItem (ListNamae)
'Call 個別へ表示(ByVal i)
S2.Cells(g, 2) = i
g = g + 1
End With
KBanme = 0
GoTo Label1
'Exit For
'Else
'Exit Do
End If
Do While NamaeNagasa >= Charsu
KBanme = KBanme + 1
KensakuChar = Mid(Namae, KBanme, 1)
If KensakuChar <> " " Or KensakuChar = " " Then
Exit Do
Else
KBanme = KBanme + 1
KensakuChar = Mid(Namae, KBanme, 1)
If KensakuChar <> " " Or KensakuChar = " " Then
Exit Do
End If
End If
Loop
Do While ListNagasa >= LBanme
LBanme = LBanme + 1
ListChar = Mid(ListNamae, r, 1)
If ListChar <> " " Or ListChar = " " Then
Exit Do
Else
LBanme = LBanme + 1
ListChar = Mid(ListNamae, r, 1)
If ListChar <> " " Or ListChar = " " Then
Exit Do
End If
End If
Loop
Else
'r = r + 1
Do While ListNagasa >= LBanme And Renzoku = True
LBanme = LBanme + 1
ListChar = Mid(ListNamae, LBanme, 1)
If Charsu >= 1 Then
Renzoku = False
End If
If ListChar <> " " Or KensakuChar = " " Then
Exit Do
End If
Loop
End If
Next
解説
このプログラムは、検索する文字列とリストにある文字列を比較し、一致するものをListBoxに追加する機能を持っています。
以下は、主要な機能と処理の概要です。
Do Whileループ: 検索する文字列とリストにある文字列の先頭の空白をスキップするために、検索文字列とリスト文字列の位置をそれぞれKBanme、LBanmeに設定し、ループを使用して空白をスキップします。
Forループ: リストの各文字列についてループします。検索文字列とリスト文字列を比較して、一致するものがあればListBoxに追加します。また、一致した文字列の位置をシート上に表示します。
この過程では検索される文字列と検索する文字列から1文字ずつ取り出して比較します。
検索される側の取り出した1文字が検索する側の取り出した1文字と一致しない場合は、検索される側の文字列の2番目の1文字を取り出して再び一致するかどうかを比較します。
この作業を繰り返して、検索される側の文字列すべての文字が検索する側の文字列の1番最初の文字とまったく一致しない場合は何の処理も行わずにループを抜けます。
もし検索される側の文字列に検索する側の最初の1文字が一致したら違うループに入ります。
そこで検索される側の2番目の文字と検索する側の2番目の文字が一致するかを比較します。
この作業の繰り返しで3番目、4番目と検索する側の文字列すべての文字を順番に比較して、検索する側の文字列の文字数分比較してすべての文字数分の文字が一致したらリストボックスに検索された文字列を含むすべての文字をリストボックスに追加してループを抜けます。
その繰り返しで順番にワークシートの文字列を比較していきます。
やってることは非常にシンプルでただ単に1文字ずつ取り出して比較しているだけです。1文字一致したら違うループに入れるのは2番目、3番目、それ以降の文字列を比較するループは最初の1文字が一致してからでないと、やる意味がないためです。検索する側の文字列から最初に取り出した1文字が検索される側の文字列内のすべての文字と一致しなかった場合はそれ以降の比較は不要なため検索効率化のために最初のループ内でまずは検索する側の最初の1文字が検索される側の文字列内に含まれているかを選別します。
条件文: 条件文を使用して、ループから抜けるかどうかを判断します。たとえば、一致した文字列が見つかった場合、Label1へジャンプします。
Mid関数: Mid関数は、文字列の一部を返します。たとえば、Mid(Namae, KBanme, 1)は、検索する文字列のKBanme番目の文字を返します。
ListBox1.AddItem: ListBox1に項目を追加するためのメソッドです。
With文: With文は、複数のプロパティまたはメソッドを一度に指定することができます。たとえば、With MeNamae .ListBox1.AddItem (ListNamae)は、MeNamaeフォームのListBox1にListNamaeを追加します。
ただし、コードがどのように機能するかについて詳しく理解するには、より多くのコンテキストが必要です。たとえば、変数の初期化やループの中で変数がどのように更新されるかなどの詳細な情報が必要です。