文字列編集のやりかた
外部データなどから取得したデータはそのまま使えない事が多いです。
例えば前後に余計な記号が入ったり、同じ行に要らない文があったり、文字列の一部だけ利用したい事があります。
その場合、いくつかの関数を使って必要な文字列になるように加工する必要があります。
今回は、文字列加工として高頻度で利用する3つの方法について解説します。
- Replace関数 →文字列を置き換える
- Split関数 →文字列を分割させる
- Left,Mid,Right関数 →文字列の一部を取り出す
3つ目は3つの別の関数ですが、性質が同じなので同じグループとして扱っています。
Replace関数の基本構成
文字列の置き換えを行うReplace関数について解説します。
まずは基本構成の説明です。①~③は必須項目で、④~⑥は省略可能です。
① | 置換の対象文字列 |
② | 検索する文字列 |
③ | 置き換える文字列 |
④ | 検索開始位置を指定 |
⑤ | 置き換える文字列の個数 |
⑥ | 文字列比較のモードを指定 |
最小構成(①~③)
①~③のみの場合の例です。
Msgbox Replace(“山田太郎“, “山田“, “谷田“) |
山田が谷田に置き換えられて、谷田太郎と表示されます。最初から谷田太郎と表示すれば良いのですが、動作の説明のための例なので、ご了承ください。
オプション機能の解説
④検索開始位置を指定
①~③+④の場合の例です。
使用用途としては、置換対象の左の文字を削りたい場合に使うものとなります。
MsgBox Replace(“ABCDEFGHIJKLMN”, “C”, “猫”, 3) |
開始位置が3文字目でCが猫に置き換えられるので、結果はこうなります。
MsgBox Replace(“ABCDEFGHIJKLMN”, “CD”, “猫犬”, 4) |
これならどうなるでしょうか?開始位置が4文字目ですが、置換対象の文字列は3,4文字目です。
置換対象の文字列が[CD]なので[D]だけでは対象外となって、そのまま表示されます。
⑤置き換える文字列の個数
①~③+⑤の場合の例です。
通常は検索文字をすべて置き換えるのですが、⑤のところに数字を入れる事で左から指定の数字の回数までしか置き換えません。オプション4を入れずにオプション5を使うので,空白を入れて区切ります。
MsgBox Replace(“ABCABCABCABCABC”, “AB”, “エビ”, ,3) |
左から3回文字列を置き換えるので、このようになります。
⑥文字列比較のモードを指定
このオプションは筆者も使用経験が無く使う機会は少ないかもしれませんので、参考として知っておく程度で良いかと思います。
使い方は上記と同様に、,(コンマ)で区切って6つ目のところに以下の数値を入れます。
数値 | 内容 |
1 | テキストモードで比較します |
2 | Microsoft Accessでのみ使用でき、データベース内の情報に基づいて比較 |
初期値は0でバイナリモードでの比較となっています。昔は-2という引数もありましたが、現状はエラーとなって利用できません。
以上でReplace関数の解説は終わります。
Replace関数は文字列を置換するだけでなく、改行コードを置換したり、空白に置き換えて文字を消したりする使い方も多いです。使用頻度は高めなので、基本的な使い方だけは覚えておきましょう。
Split関数を使った文字の分割方法
区切る文字列 が ”山田|太郎|ヤマダ|タロウ|20歳|東京都”
区切りたい文字が | (パイプ)とします。
TMP = Split( “山田|太郎|ヤマダ|タロウ|20歳|東京都“,”|“)
このように、左辺に変数(仮でTMPとしています)、右辺にSplit関数を記載します。
実行すると、下のようにそれぞれTMP(0)からTMP(5)まで値が入っている事が分かります。
分割した文字の利用方法
変数の値として使う
分割した文字を変数としてプログラム内で利用できます。例として、メッセージボックスで変数を表示させてみます。
TMP = Split(“山田|太郎|ヤマダ|タロウ|20歳|東京都”, “|”) |
MsgBox “苗字(フリガナ):” & TMP(0) & “(” & TMP(2) & “)” & vbLf & “名前(フリガナ):” & TMP(1) & “(” & TMP(3) & “)” & vbLf & “ご年齢:” & TMP(4) & vbLf & “ご住所:” & TMP(5) |
特定の列に必要なデータがあれば、その行だけ出力する事もできますし、変数として条件分岐させるキーワードとして利用することもできます。
後で説明するセルに入れる方法よりも、変数(配列)として利用した方が、画面出力が無く高速に処理を進める事ができます。目的に応じて使い分けをしましょう。
セルに整列して値を入れる
CSVのファイルをセルに整列して値を入れる事もできます。CSVファイルは,(コンマ)で区切られたものが多いので、簡単に整理できます。CSVファイルを取り込む場合は、Open構文などの知識も必要なので、ここでは文字列を例にどのようにセルに割り当てるかだけ理解しておいてください。
TMP = Split(“山田,太郎,ヤマダ,タロウ,20歳,東京都”, “,”) |
For i = 0 To 5 |
Cells(3, i + 1) = TMP(i) |
Next i |
上記の例では3行目にそれぞれの値を入れます。
分割された数を知る
以下のように分割したとします。
TMP = Split( “山田|太郎|ヤマダ|タロウ|20歳|東京都”,”|”)
この時分割された最後の数字を確認するにはUBound(TMP)を使います。
TMPのところは適当に決めた変数なので好きな文字列にして貰って良いです。
これを利用して、分割した文字列を書き出す例を示します。
TMP = Split(“山田|太郎|ヤマダ|タロウ|20歳|東京都”, “|”) |
For i = 0 To UBound(TMP) |
Cells(3, i + 1) = TMP(i) |
Next i |
UBound(TMP)は5となります。その結果、[セルに整列して値を入れる]で紹介したサンプルコードと同じ動きになります。
UBound(TMP)を使うメリットとしては、色々な値が入ってきても自動で分割された数を判別して処理できる事です。
分割された場合だけ処理する
UBound(TMP)を利用してできる事の例として分割されたか判定する事ができます。
サンプルコードを表示します。
TMP = Split(“例の文字列”, “|”) |
If UBound(TMP) <> 0 Then |
For i = 0 To UBound(TMP) |
Cells(3, i + 1) = TMP(i) |
Next i |
End If |
分割されない場合はUBound(TMP) = 0 となるので、分割された時はUBound(TMP) <> 0となります。上の例では|を含まない文字列なので分割されず、繰り返し処理に入らずに終了します。
split関数の解説は理解できたでしょうか?
split関数は利用する機会が多い関数ですので、基礎知識として理解しておきましょう。
Right・Left・Mid関数で文字列編集しよう
Right・Left・Mid関数は文字の一部を取り出すための関数です。それぞれの利用方法は以下のようになります。
- Right関数:文字列を右から指定した数切り出す
- Left関数:文字列を左から指定した数切り出す
- Mid関数:文字列の真ん中の指定した所を切り出す
英語のイメージ通りでとても簡単なので、さっくり利用方法を覚えましょう。
Right関数:文字列を右から指定した数切り出す
Right(文字列, 文字数)
例として、下記コマンドを実施するとします。
MsgBox Right(“左左まんなかミギミギミギ”, 6) |
文字列から右の6文字を取得するので、[ミギミギミギ]が表示されます。
Left関数:文字列を左から指定した数切り出す
Left(文字列, 文字数)
例として、下記コマンドを実施するとします。
MsgBox Left(“左左まんなかミギミギミギ”, 2) |
文字列の左から2文字を取り出すので[左左]が表示されます。
Mid関数1:文字列の真ん中の指定した所を切り出す
Mid(文字列, 開始位置, 文字数)
例として、下記コマンドを実施するとします。
MsgBox Mid(“左左まんなかミギミギミギ”, 3,4) |
文字列3文字目から、4文字を取り出すので[まんなか]が表示されます。
Mid関数2(覚えなくて良いです)
Mid(文字列, 開始位置)
Mid関数はこのように文字数のところを省略することもできます。
例として、下記コマンドを実施するとします。
MsgBox Mid(“左左まんなかミギミギミギ”, 3) |
この場合は、文字列3文字目から最後の文字列まで取得されて[まんなかミギミギミギ]が表示されます。
結果的にRight関数と同じ動きで、右から文字数を数えるか、左から文字数を数えるかの違いなので、直観的に分かりやすいRight関数を使う事をお勧めします。
ということで冒頭で書いてある通り、覚えなくて良いです。
あとがき
本記事では、文字列編集に使う6個の関数について解説しました。
文字列を編集するコマンドはこの他にもAsc、Trim、Spaceなど沢山あります。今回紹介した関数はその中でも利用頻度が高く、汎用性の高いものとなりますので、是非ご活用ください。
当サイトではこの他にもVBA学習に役立つ情報を発信しております。当サイトの情報を通して、私と同じレベルか私を超えるレベルのVBAスキルを習得していただければ幸いです。