VBAで文字列を取り出す複数のかっこの中の値を1クリックで集める

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

複数のかっこの中から文字列を取り出す

かっこの中の文字列を取り出す事は可能ですか?」という質問をいただきました。

以前はワークシート関数を使った方法を紹介させていただきました。

マクロでもできます。マクロの方が色々な事が出来ます

EnjoyExcel
EnjoyExcel
  • 1つの文字列の中にある複数のかっこの組み合わせから文字列を抽出
  • 複数のセルにある文字列の中からかっこの中の値を取り出せます

先にどんなことが出来るのか分かる様に動画を用意しておきました。

続いてコード&解説を用意しています。

関連記事

マクロを使わずにセルに関数を直書きするパターンの記事も用意しています。

動画

動画を見る為の判断材料を事前に提示します。

C列の情報からD列以降にかっこの中の文字列を取り出しています。

アウトプット

最終的にはこのような状態になります。(実在の住所ではないです)

movie-summary
C列の情報から1クリックでD列以降にかっこの中の文字列を取り出しています。

動画の解説

ポイントは3つです。

  • 複数のかっこの組み合わせからそれぞれ情報を取り出す
  • 指定のセルに前かっこと後かっこを記入する
  • かっこの組み合わせが悪い時はエラーを出す
3つのポイントを見易い様にピックアップしました。

複数のかっこの組み合わせからそれぞれ情報を取り出す

文字列の中から1組のかっこの組み合わせを作り値を取り出します。

続けて次のかっこの組み合わせを探しに行くというコードを組んでいます。

これで1つの文字列の中にある複数のかっこの組み合わせにも対応出来る様にしています。

指定のセルに前かっこと後かっこを記入する

ひと言かっこと言いますが人によって選択するかっこは様々です。

各自が適宜かっこを定義出来る様にセルに入力するかたちを取り入れました。

かっこの組み合わせが悪い時はエラーを出す

前かっこと後かっこの組み合わせが確認出来ない時にはエラーを出すようにしています。

問題がある場所でコードを止める様にしたのでどこのかっこの組み合わせが悪いのかすぐに分かります。

文字列をメンテナンスしてから再度実行ボタンを押す事で間単にかっこの中の文字列が取り出せます。

ワークシートとコードを紹介

ここからは動画で用意したデータを再現する事を考えていきます。

まずはワークシートです。ご自身で用意していただく為にセルの配置が分かる画像を用意しました。

続いてコードです。VBEにそのまま貼り付けて使う事が出来る様にコードを用意しています。

加えて簡単ですが解説も用意しておきました。

ワークシート

今回シートは提供しないのでシートの情報は各自で再現してください。

ボタンの作り方はこちらの記事をご覧ください。

関連記事VBA-9Withステートメントを組み合わせてシートに罫線を引く

シートの情報
  1. 実行/削除ボタン
  2. セルB8に前かっこ
  3. セルB9に後かっこ
  4. セルC13以降に文字列
  5. D~H列に抽出後の文字列を記入
各自ご用意下さい

Enjoy Excel
作業前
D列以降にC列の情報から値を取り出します。
作業後
コードでは1つの文字列より5個以上値を取り出す事も可能です。その際はセルをI列まで用意してください。

コード

コードは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関数

指定した文字列や変数の文字数を返します。

Len(string)

引数のStringは必ず指定します。文字列or文字列型の変数を指定しましょう。

使用例

引数として与えた文字列の文字数が返ってきます。

番号使用例関数の戻り値
1Len(“おはようございます”)9
2Len(“ABCDE”)5
変数を指定する時は文字列型の変数という事を忘れない様にしましょう。

Mid関数

指定した文字列から文字を取り出します。指定方法を説明します。

Mid(string,start,{length})

引数は3つです。length以外は必須です。

  • stringでは文字列or文字列型の変数を指定しましょう。
  • startは取り出す文字の開始位置を指定します。
  • lengthは省略可能です。引数startから何文字を取り出すのかを指示します。

Lengthを省略すると開始位置から後ろ全ての文字列が抽出されます。

使用例
番号使用例関数の戻り値
1Mid(“おはようございます”,1,4)おはよう
2Mid(“ABCDE”,4,2)DE
lengthはstartからの文字数になります。ご注意ください。

コードの解説

まずは要点だけ書き出します。

作業の流れ
  • 1
    下準備と検索文字列の有無を確認

    前かっこ、後かっこの定義やC列の文字列の有無を確認

  • 2
    検索文字列をループする

    C列の最初から最後の文字列まで周回出来る様ループを用意

  • 3
    各検索文字列の文字数取得

    C列の文字列の文字数を取得する

  • 4
    前かっこへの処理

    前かっこを確認後変数chk1にtを記入後変数olenに前かっこの位置を代入

  • 5
    後ろかっこへの処理

    後かっこを確認後変数chk2にtを記入後変数clenに後ろかっこの位置を代入

  • 6
    chk1とchk2のチェック

    各変数にtが記入されている時はかっこ内の値をセルに書き出す

1、下準備と検索文字列の有無を確認

最終行を確認したりかっこから取り出した値を記入する為の列を定義しています。

19、20行目で前かっこと後かっこを定義しています。

条件分岐でC列に文字が居なかった時はメッセージボックスでお知らせする様にしました。

文字列の最終行を取得するコードはこちらをご覧ください。

関連記事VBA-6マクロでエクセルシートの指定範囲から最終行を取得する

2、検索文字列をループする

1で取得した最終行をもとにループを組みます。

これで全ての文字例にアプローチするための環境を用意します。

3、各検索文字列の文字数取得

ここからは各文字列の処理です。まずは対象となる文字列の文字数を数えます。

その後文字列を1文字ずつ確認していく為のループを用意します。

4、前かっこへの処理

対象の文字列を1文字ずつ確認していきます。36行目からの条件分岐です。

前かっこで定義した文字を見付けたら各種変数に値を代入していきます。

5、後ろかっこへの処理

対象の文字列を1文字ずつ確認していきます。42行目からの条件分岐です。

後かっこで定義した文字を見付けたら各種変数に値を代入していきます。

6、chk1とchk2のチェック

47行目からの条件分岐です。

変数chk1とchk2にtが代入されていたらかっこの組み合わせが出来ている事になります。

Mid関数を使ってかっこの中から値を取り出します。48行目です。

その後変数を空欄orゼロに戻して次のかっこの組み合わせを探しに行きます。

代わって47行目の条件分岐がFalseの時の処理です。

変数chk1にtが代入されていないという事は前かっこが認識されてない事になります。

msgbox-error
画像はは22行目の文字列にエラーがあった時のメッセージボックスです

その時は対象行含めメッセージボックスでエラーをお知らせする様にしました。

合わせてプロシージャを強制的に終了させるのでエラーがあった場所が特定し易い様になっています。

まとめ

過剰にかっこを付けた文字列からかっこの中の文字列を取り出すというコードを紹介しました。

資料など文字が沢山書いてあるデータからかっこ内の文字列を抽出する様な事があれば活躍できます。

他にも条件分岐や繰り返し処理比較演算メッセージボックスなど色々な機能を盛り込みました。

このコードが書けるようになれば各種機能の理解にもつながります。

是非ご自身でもコードを書いてみてください。

ほかにもVBAは色々な機能が詰まっています。関連記事を用意しましたのでご覧ください。

おすすめカテゴリーコードの書き方全般へのリンク

EnjoyExcel

タイトルとURLをコピーしました