みなさん、こんにちはケンケンです。
今回は、VBAで文字列を操作してみよう、という趣旨になります。
文字列操作ができると業務の幅が広がります。
例えば、住所・名前・日付などから特定の部分だけ抜き出して集計したい、とか
文字列から検索したい文字をピンポイントでヒットさせてフィルターを掛けたい、
そしてそれを自動化したいと思ったことはないでしょうか。
文字列操作は関数でも出来ますが、やはりファイルが重くなる傾向があるので、VBAでスッキリさせてしまいましょう。
今回は、文字列操作の基本をご紹介します。
基本とはいえ、文字列操作用の関数を組み合わせてループさせる仕組みを作って行くので実務でも充分役に立つはずです。
文字列とは
文字列とは何でしょうか。
文字の集まりのことです。
当たり前でしょ?と思うかもしれませんが、一応プログラミングの世界では、文字が集まったものを文字列として定義しています。
つまり、「あ」は文字であって文字列ではありません。「あり」は文字列です。
文字列を操作するということは、文字が2つ以上集まったものを分解したり、必要な部分だけを取り出したりする処理のことだと理解してください。
Left関数とRight関数
それでは、実際に文字列を操作してみましょう。
手始めにLeftとRightから練習してみましょう。
まず、手ごろな文字列を用意します。
新元号「令和」の元となった万葉集 梅花の宴より抜粋しました。
この文字列を使っていろいろ試してみます。
それでは、Left関数から
構成はLeft(String,Length)です。
引数Stringには指定された文字列を指します。
その文字列の左端から引数Lengthに指定された文字数分だけ取り出します。
実際にコードを書いてみましょう。
標準モジュールに記述します。
1 2 3 4 5 6 |
Sub mojiretu_left() Range("B1").Value = Left(Range("A1").Value, 8) Range("B2").Value = Left(Range("A1").Value, 9) Range("B3").Value = Left(Range("A1").Value, 10) Range("B4").Value = Left(Range("A1").Value, 11) End Sub |
これを実行すると
できましたか。
次は、Right関数(Right(String,Length))です。
RightはLeftの反対で右から指定された文字数分だけ抜き出します。
1 2 3 4 5 6 |
Sub mojiretu_right() Range("C1").Value = Right(Range("A1").Value, 8) Range("C2").Value = Right(Range("A1").Value, 9) Range("C3").Value = Right(Range("A1").Value, 10) Range("C4").Value = Right(Range("A1").Value, 11) End Sub |
上記コードを書いて実行してみましょう。
今度は右から文字列を抜き出して転記することができました。
これが、Left関数とRight関数です。
Mid関数
さあ続きまして、Mid関数についてご紹介します。
まず構成です。
Mid(String,Start,Length)となっています。
少しややこしくなりましたが、難しくありません。
日本語に翻訳すると特定の文字列(String)の指定した文字位置(Start)から指定した文字数(Length)を抜き出します。
これでもまだややこしいですかね。
では、実際にアクションをコードを実行して確認しましょう。
1 2 3 |
Sub mid_rensyu() Range("D1").Value = mid(Range("A1").Value, 9, 6) End Sub |
このコードを日本語に訳すとA1セルの文字列(String)を9文字目(Start)から6文字(Length)抜き出す。
ということです。
実行結果は以下になります。
ここまでは、個別に関数を紹介しましたが、当然これだけではつまらないですね。
ちょっと応用的なこともしてみましょう。
そこで、みなさんに問題です。出来るだけ自分で考えてみてください。
(問題)文字列を左から8文字で区切りE1に表示させ、9文字目以降は区切りたい文字数を選択できる仕組みを作ってE2からE5まで書き出しなさい。
(答え)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub mojiretu_rensyu() Dim mojiretu Dim mojikazu mojiretu = 8 '① mojikazu = Range("A3").Value '② Range("E1").Value = Left(Range("A1").Value, mojiretu) '③ mojiretu = mojiretu + 1 '④ Range("E2").Value = mid(Range("A1").Value, mojiretu, mojikazu) '⑤ mojiretu = mojiretu + mojikazu '⑥ Range("E3").Value = mid(Range("A1").Value, mojiretu, mojikazu) mojiretu = mojiretu + mojikazu Range("E4").Value = mid(Range("A1").Value, mojiretu, mojikazu) mojiretu = mojiretu + mojikazu Range("E5").Value = mid(Range("A1").Value, mojiretu, mojikazu) End Sub |
僕は上記のようにしました。(コード中のコメントの数字と下記説明文の数字はリンクしています。)
変数mojiretuにまず8を代入しスタートさせます。①
そして、Mid関数を使って区切る文字数としてA3セルで指定した数値を変数mojikazuに代入させます。②
Left関数で8文字目まで抜き出すのは問題ないですね。③
Mid関数の引数に備えて変数mojiretuの値を9にしておきます。④
Mid関数で9文字目から変数mojikazu分抜き出します。⑤
変数mojiretuにmojikazu分加えることで次のMid関数の引数Startの数に置き換えます。⑥
以降E5まで続きます。
実行結果がこちらです。
上記では、5文字ずつの結果ですが、いろいろな数字で試してみてください。
ForNextでループさせよう
文字列の基礎を紹介してきましたので、ここからはプログラミングの醍醐味であるループをさせてみましょう。
使う資料はこちらです。
売掛金集計表の時に使った会社リストです。
この所在地の部分を都道府県とそれ以下に分けてループさせるコードを考えていきます。
それでは、いつものように最初の処理の手順を考えましょう。
まず、C2セル「香川県丸亀市福島町9-3-8」について考えます。
①「香川県」までをLeft関数を使って3文字目まで抜き出す。
②丸亀市以降はMid関数を使って書き出す。
この手順でコードを考えます。
1 2 3 4 |
Sub moji_kugiri() Range("D2").Value = Left(Range("C2").Value, 3) Range("E2").Value = mid(Range("C2").Value, 4) '① End Sub |
Mid関数の第3引数Lengthが省略されていますが、省略した時は、開始位置から文字列の最後まで表示されます。①
これで、最初の処理ができたので、次はループさせます。
1 2 3 4 5 6 7 8 9 10 |
Sub moji_kugiri() Dim LRow LRow = Range("A" & Rows.Count).End(xlUp).Row Dim addressCnt For addressCnt = 2 To LRow Range("D" & addressCnt).Value = Left(Range("C" & addressCnt).Value, 3) Range("E" & addressCnt).Value = mid(Range("C" & addressCnt).Value, 4) '① Next End Sub |
変数addressCntを使って2行目から最終行(LRow)まで回します。
これを実行すると、
都道府県とそれ以下に分けられました。
まとめ
いかがでしたか。
今回は、文字列操作の基本として、Left関数・Right関数・Mid関数を勉強しました。
ここまでご覧いただいてお気づきの方もいるかと思いますが、最後の都道府県を分ける文字列操作は不完全です。
そうです。今回分けた都道府県はすべて3文字でしたが、鹿児島県と和歌山県と神奈川県は4文字なので、この3県が出てくると対応できません。
ちなみに北斗の拳は上記には属さないのでご注意ください。
また、市区町村でも分けたい時にも対応できません。
そこで次回以降は、上記の問題を解決する方法をご紹介する予定なのでご期待ください。
それでは、また次回お会いしましょう。
ここまでお読みいただいた方へおススメは以下
【ExcelVBA】シートの一覧を作成してリンクも貼り付けしよう【便利技】
[エクセルVBA]ログを取って業務管理してみよう【業務改善の意識改革】