複数のかっこの中から文字列を取り出す
「かっこの中の文字列を取り出す事は可能ですか?」という質問をいただきました。
以前はワークシート関数を使った方法を紹介させていただきました。
マクロでもできます。マクロの方が色々な事が出来ます。
- 1つの文字列の中にある複数のかっこの組み合わせから文字列を抽出
- 複数のセルにある文字列の中からかっこの中の値を取り出せます
先にどんなことが出来るのか分かる様に動画を用意しておきました。
続いてコード&解説を用意しています。
関連記事
マクロを使わずにセルに関数を直書きするパターンの記事も用意しています。
動画
動画を見る為の判断材料を事前に提示します。
C列の情報からD列以降にかっこの中の文字列を取り出しています。
最終的にはこのような状態になります。(実在の住所ではないです)
動画の解説
ポイントは3つです。
- 複数のかっこの組み合わせからそれぞれ情報を取り出す
- 指定のセルに前かっこと後かっこを記入する
- かっこの組み合わせが悪い時はエラーを出す
複数のかっこの組み合わせからそれぞれ情報を取り出す
文字列の中から1組のかっこの組み合わせを作り値を取り出します。
続けて次のかっこの組み合わせを探しに行くというコードを組んでいます。
これで1つの文字列の中にある複数のかっこの組み合わせにも対応出来る様にしています。
指定のセルに前かっこと後かっこを記入する
ひと言かっこと言いますが人によって選択するかっこは様々です。
各自が適宜かっこを定義出来る様にセルに入力するかたちを取り入れました。
かっこの組み合わせが悪い時はエラーを出す
前かっこと後かっこの組み合わせが確認出来ない時にはエラーを出すようにしています。
問題がある場所でコードを止める様にしたのでどこのかっこの組み合わせが悪いのかすぐに分かります。
文字列をメンテナンスしてから再度実行ボタンを押す事で間単にかっこの中の文字列が取り出せます。
ワークシートとコードを紹介
ここからは動画で用意したデータを再現する事を考えていきます。
まずはワークシートです。ご自身で用意していただく為にセルの配置が分かる画像を用意しました。
続いてコードです。VBEにそのまま貼り付けて使う事が出来る様にコードを用意しています。
加えて簡単ですが解説も用意しておきました。
ワークシート
今回シートは提供しないのでシートの情報は各自で再現してください。
ボタンの作り方はこちらの記事をご覧ください。
- 実行/削除ボタン
- セルB8に前かっこ
- セルB9に後かっこ
- セルC13以降に文字列
- D~H列に抽出後の文字列を記入
Enjoy Excel
コード
コードは2つあります。
最初は実行ボタンのコードです。
コードはそのままVBEに貼り付ける事で使う事ができます。
ただしワークシートをご用意いただく必要があります。
Sub かっこの中()
'変数の定義
Dim aop As String 'an open parenthesis 前かっこ とする
Dim acp As String 'an close parenthesis 後ろかっこ とする
Dim cnt As Long ' count ループ用の変数
Dim nbr As String ' number 検索文字列
Dim srh As Long ' serch ループ用の変数
Dim chk1 As String 'check1 チェック用
Dim chk2 As String 'check2 チェック用
Dim olen As Long 'openlen 前かっこの位置
Dim clen As Long 'closelen 後ろかっこの位置
Dim rw As Long 'row 行番号
Dim clm As Long 'column 列番号
'**************************************************
'1、下準備と検索文字列の有無を確認
rw = Cells(Rows.Count, 3).End(xlUp).Row
clm = 4
'セルの値から前かっこと後ろかっこを認識する
aop = Cells(8, 2)
acp = Cells(9, 2)
'検索文字列の有無を確認
If rw <= 12 Then
MsgBox "C列に文字列が居ません。確認お願いします。", vbInformation, "確認"
Exit Sub
End If
'**************************************************
'2、検索文字列をループする
For cnt = 13 To rw
'3、各検索文字列の文字数取得
nbr = Len(Cells(cnt, 3))
'文字列を1文字ずつループ
For srh = 1 To nbr
'4、前かっこを探して変数chk1にtを記入後変数olenに前かっこの位置を代入
If Mid(Cells(cnt, 3), srh, 1) = aop Then
chk1 = "t" 'True の t を意味しています
olen = srh
End If
'5、後ろかっこを探して変数chk2にtを記入後変数clenに後ろかっこの位置を代入
If Mid(Cells(cnt, 3), srh, 1) = acp Then
chk2 = "t" 'True の t を意味しています
clen = srh
'6、chk1とchk2にtが記入されている時はかっこ内の値をセルに書き出す
If chk1 = "t" And chk2 = "t" Then
Cells(cnt, clm) = Mid(Cells(cnt, 3), olen + 1, (clen - olen) - 1)
clm = clm + 1
chk1 = ""
chk2 = ""
olen = 0
clen = 0
Else
'前かっこが検出されず後ろかっこが検出されたらメッセージボックスを展開
MsgBox cnt & "行目の文字列は前かっこと後ろかっこの数が合わないようです。 " _
& vbCrLf & "C列の文字列を確認後再度実行ボタンを押下してください。" _
, vbInformation, "確認"
Exit Sub
End If
End If
Next
'変数clmを初期値の4に戻す
clm = 4
Next
'**************************************************
End Sub
続いて削除ボタンのコードです。このコードは説明しません。
コピペも手動でお願いします
Sub 値の削除()
Dim rw As Long 'row 行番号
rw = Cells(Rows.Count, 3).End(xlUp).Row
Range(Cells(13, 4), Cells(rw, 8)).ClearContents
End Sub
関数
Len関数とMid関数を使用しています。
Len関数
指定した文字列や変数の文字数を返します。
引数のStringは必ず指定します。文字列or文字列型の変数を指定しましょう。
使用例
引数として与えた文字列の文字数が返ってきます。
番号 | 使用例 | 関数の戻り値 |
---|---|---|
1 | Len(“おはようございます”) | 9 |
2 | Len(“ABCDE”) | 5 |
Mid関数
指定した文字列から文字を取り出します。指定方法を説明します。
引数は3つです。length以外は必須です。
- stringでは文字列or文字列型の変数を指定しましょう。
- startは取り出す文字の開始位置を指定します。
- lengthは省略可能です。引数startから何文字を取り出すのかを指示します。
Lengthを省略すると開始位置から後ろ全ての文字列が抽出されます。
使用例
番号 | 使用例 | 関数の戻り値 |
---|---|---|
1 | Mid(“おはようございます”,1,4) | おはよう |
2 | Mid(“ABCDE”,4,2) | DE |
コードの解説
まずは要点だけ書き出します。
- 1下準備と検索文字列の有無を確認
前かっこ、後かっこの定義やC列の文字列の有無を確認
- 2検索文字列をループする
C列の最初から最後の文字列まで周回出来る様ループを用意
- 3各検索文字列の文字数取得
C列の文字列の文字数を取得する
- 4前かっこへの処理
前かっこを確認後変数chk1にtを記入後変数olenに前かっこの位置を代入
- 5後ろかっこへの処理
後かっこを確認後変数chk2にtを記入後変数clenに後ろかっこの位置を代入
- 6chk1とchk2のチェック
各変数にtが記入されている時はかっこ内の値をセルに書き出す
1、下準備と検索文字列の有無を確認
最終行を確認したりかっこから取り出した値を記入する為の列を定義しています。
19、20行目で前かっこと後かっこを定義しています。
条件分岐でC列に文字が居なかった時はメッセージボックスでお知らせする様にしました。
文字列の最終行を取得するコードはこちらをご覧ください。
関連記事VBA-6Cellsプロパティを使ってシートの最終行と列を取得する
2、検索文字列をループする
1で取得した最終行をもとにループを組みます。
これで全ての文字例にアプローチするための環境を用意します。
3、各検索文字列の文字数取得
ここからは各文字列の処理です。まずは対象となる文字列の文字数を数えます。
その後文字列を1文字ずつ確認していく為のループを用意します。
4、前かっこへの処理
対象の文字列を1文字ずつ確認していきます。36行目からの条件分岐です。
前かっこで定義した文字を見付けたら各種変数に値を代入していきます。
5、後ろかっこへの処理
対象の文字列を1文字ずつ確認していきます。42行目からの条件分岐です。
後かっこで定義した文字を見付けたら各種変数に値を代入していきます。
6、chk1とchk2のチェック
47行目からの条件分岐です。
変数chk1とchk2にtが代入されていたらかっこの組み合わせが出来ている事になります。
Mid関数を使ってかっこの中から値を取り出します。48行目です。
その後変数を空欄orゼロに戻して次のかっこの組み合わせを探しに行きます。
代わって47行目の条件分岐がFalseの時の処理です。
変数chk1にtが代入されていないという事は前かっこが認識されてない事になります。
その時は対象行含めメッセージボックスでエラーをお知らせする様にしました。
合わせてプロシージャを強制的に終了させるのでエラーがあった場所が特定し易い様になっています。
まとめ
過剰にかっこを付けた文字列からかっこの中の文字列を取り出すというコードを紹介しました。
資料など文字が沢山書いてあるデータからかっこ内の文字列を抽出する様な事があれば活躍できます。
他にも条件分岐や繰り返し処理、比較演算、メッセージボックスなど色々な機能を盛り込みました。
このコードが書けるようになれば各種機能の理解にもつながります。
是非ご自身でもコードを書いてみてください。
ほかにもVBAは色々な機能が詰まっています。関連記事を用意しましたのでご覧ください。
おすすめカテゴリーコードの書き方全般へのリンク