文字列操作の基本(Left・Mid・InStr・Replace・Split・StrConv で取引先名やコードを整える)
取引先名の表記ゆれや、コードに混じった全角文字・空白を、Left・Mid・Right・InStr・Replace・Split・Trim・StrConv で整える方法です。Trim で全角スペースが消えない点などの落とし穴も解説します。
どんな場面で使うか
複数の部署やシステムから集めたデータでは、同じ取引先が「株式会社山田商事」「(株)山田商事」「山田商事 」のように別々の書き方で入っていることがよくあります。商品コードも「ab-001」「AB-001」のように全角と半角が混在し、そのままでは集計や突合で別物として扱われてしまいます。
集計や照合の前に文字列の表記をそろえておくと、Dictionary や VLOOKUP での一致漏れを大きく減らせます。この記事では、表記をそろえるときによく使う関数と、その組み合わせ方を紹介します。
よく使う文字列関数
VBA の文字列関数は、ワークシート関数と名前が似ているものが多く、覚えやすいのが特徴です。主なものは次のとおりです。InStr は見つからないときに 0 を返すため、「含まれているか」の判定にも使えます。
- Left(文字列, n)/Right(文字列, n):先頭・末尾から n 文字を取り出す
- Mid(文字列, 開始, n):途中から n 文字を取り出す(開始位置は 1 から)
- InStr(文字列, 探す文字):最初に見つかった位置を返す。見つからなければ 0
- Replace(文字列, 前, 後):文字を置き換える。後に空文字を指定すると削除になる
- Split(文字列, 区切り):区切り文字で分割して配列にする(0 始まり)
- Trim:前後の半角スペースを取り除く
- StrConv(文字列, vbNarrow/vbWide/vbUpperCase):半角・全角・大文字に変換する
取引先名とコードを整える関数
次の2つの関数は、取引先名とコードをそれぞれのルールでそろえます。取引先名は会社の種類の表記を取り除いて比較用の名前にし、コードは英数字を半角の大文字にそろえます。ワークシートからも =NormalizeCode(A2) のように呼び出せます。
' 取引先名を比較用にそろえる(例:「(株)山田商事 」→「山田商事」)
Function NormalizeCompany(ByVal src As String) As String
Dim s As String, i As Long
Dim marks As Variant
s = StrConv(src, vbWide) ' 社名はいったん全角にそろえる(半角カナも全角になる)
marks = Array("株式会社", "有限会社", "合同会社", "(株)", "(有)", "㈱", "㈲")
For i = LBound(marks) To UBound(marks)
s = Replace(s, marks(i), "")
Next i
s = Replace(s, ChrW(12288), "") ' 全角スペース(途中の空白も含む)を取り除く
NormalizeCompany = Trim(s)
End Function
' コードを半角・大文字にそろえる(例:「ab-001」→「AB-001」)
Function NormalizeCode(ByVal src As String) As String
Dim s As String
s = StrConv(src, vbNarrow) ' 全角英数字・記号を半角に
s = Replace(s, "ー", "-") ' ハイフンのつもりで入力された長音をそろえる
s = UCase(Trim(s))
NormalizeCode = s
End FunctionSplit と InStr で項目を分ける
「営業部/山田太郎」のように1つのセルに複数の情報が入っている場合は、Split で分割できます。区切り文字が入っていない値もあるときは、先に InStr で含まれているかを確認すると、配列の範囲外を参照するエラーを防げます。
Dim parts As Variant, dept As String, staff As String
If InStr(cellText, "/") > 0 Then
parts = Split(cellText, "/")
dept = Trim(parts(0))
staff = Trim(parts(UBound(parts)))
Else
dept = ""
staff = Trim(cellText)
End Ifつまずきやすい点
VBA の Trim は半角スペースしか取り除きません。全角スペースが混じったデータでは、見た目は同じでも一致しないままになります。上のコードのように、全角スペースは Replace で明示的に取り除くか、半角に置き換えてから Trim します。
StrConv の vbNarrow は、英数字だけでなくカタカナも半角カナに変えてしまいます。社名や氏名に使うと「ヤマダ」のようになるため、カタカナを含む項目には使わず、英数字中心のコードに限定してください。また、ハイフンのつもりで長音記号の「ー」が入力されていると、半角にしたときに「ー」となり、ハイフンと一致しません。どの記号が混じっているかはデータによって違うため、変換後の結果を実データで一度確認することをおすすめします。
表記をそろえた値は、元の列を上書きせず別の列に出力しておくと、変換ルールに誤りがあったときに元に戻せます。
- Trim は全角スペースを消さない
- vbNarrow はカタカナも半角にする
- 整えた値は別の列に出力し、元データを残す