【ExcelVBA】指定した間隔で文字列に文字(列)を挿入する

この記事では、指定した間隔で文字列に文字(列)を挿入する方法についてご説明します。

【動画】指定した間隔で文字列に文字(列)を挿入する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


セルA1に入力された値に対して3文字間隔で「-」を文字列に挿入し、挿入後の文字列をセルA2に出力しています。

マクロ作成の流れ

STEP.1
挿入対象の文字列から、挿入位置までの文字列を抜き出して配列に格納する
挿入対象の文字列から、挿入位置までの文字列を抜き出して配列に格納します。
例えば、「abcdefghijk」という文字列に対して3文字間隔で文字を挿入したい場合は、「abc」の3文字を配列に格納します。
STEP.2
STEP.1の処理を繰り返す
STEP.1の処理を繰り返します。
なお、STEP.1の処理を繰り返す場合、「abc」の文字列を配列に格納したら、次に配列に格納する文字列は4文字目からはじめます。
その次は「def」、その次は「ghi」と、開始する文字位置を3つずつずらしていきながら配列に格納していきます。
STEP.3
STEP.2まで繰り返して文字列が格納された配列の値をJoin関数を使って「-」をつなげ、セルに出力する
STEP.2まで繰り返して文字列が格納された配列の値をJoin関数を使って「-」をつなげ、セルに出力します。

コードの例

Excelのマクロのコード(例)

Option Explicit

Sub strIns()

    Dim cnt                 As Long         'ループ処理用カウンタ
    Dim splitStrAry()       As String       '分割した文字列を格納する配列
    Dim aryCnt              As Long         '配列要素数用カウンタ
    
    '文字(列)を挿入する位置を設定する
    Const InsStrPos As Integer = 3
    
    'セルA1の文字列に対して文字を挿入する分だけループする
    For cnt = 1 To Len(Range("A1").Value) Step InsStrPos
        
        '配列の最後の次元の要素数を変更する
        '→今回は要素数を1つ拡張する
        ReDim Preserve splitStrAry(aryCnt)
        
        'Mid関数で抽出した文字列を配列splitStrAryに格納する
        splitStrAry(aryCnt) = Mid(Range("A1").Value, cnt, InsStrPos)
        
        aryCnt = aryCnt + 1
    
    Next cnt
    
    'Join関数で配列の文字列に「-」を結合させてセルA2に出力する
    Range("A2") = Join(splitStrAry, "-")

End Sub

コードの解説

注目すべきコード①

最初に見て頂きたいのは13行目です。

    'セルA1の文字列に対して文字を挿入する分だけループする
    For cnt = 1 To Len(Range("A1").Value) Step InsStrPos

以上のコードは、挿入対象の文字列から、挿入位置までの文字列を抜き出して配列に格納する処理を繰り返すループのコードです。

このコードの大事な部分は「Step InsStrPos」の部分です。

これは、カウンタ変数をInsStrPosの数ずつ増やすという意味です。

今回は変数InsStrPosには3の値を指定しています。(10行目)

    '文字(列)を挿入する位置を設定する
    Const InsStrPos As Integer = 3

3文字間隔で「-」を挿入したいので、3文字間隔で文字列を抜き出す必要があるため、3文字間隔だと抜き出す文字列の先頭は1、4、7、11・・・となるためStepにInsStrPosを指定しています。

注目すべきコード②

次に見て頂きたいのは13行目です。

        'Mid関数で抽出した文字列を配列splitStrAryに格納する
        splitStrAry(aryCnt) = Mid(Range("A1").Value, cnt, InsStrPos)

以上のコードは、Mid関数で抽出した文字列を配列splitStrAryに格納している処理です。

変数cntはセルA1の文字列から、抜き出す文字列の先頭位置を指しており、変数InsStrPosは抜き出す文字列の長さになります。

変数cntは、ループを繰り返すごとに1、4、7、11と値がカウントされていき、変数InsStrPosは値が3で指定されているので、ループ1回目ではセルA1の文字列の1文字目から3文字を抜き出し、ループ2回目ではセルA1の文字列の4文字目から3文字を抜き出します。

3回目以降も同じように文字列を抜き出して配列splitStrAryに格納します。

なので、配列には「abc」、「def」、「ghi」・・・といったように文字列が格納されていきます。

注目すべきコード③

次に見て頂きたいのは27行目です。

    'Join関数で配列の文字列に「-」を結合させてセルA2に出力する
    Range("A2") = Join(splitStrAry, "-")

以上のコードは、Join関数は配列の文字列全てを結合し、結合する際はその文字列を「-」で区切ってセルA2に出力しているコードです。

例えば「abc」、「def」、「ghi」と配列に格納されている場合は「-」で区切って、「abc-def-ghi」のように1つの文字列に結合しセルA2に出力されます。

動作確認

マクロ実行前

セルA1には文字列「abcdefghijklmn」が入力されています。

マクロ実行後

セルA2には文字列「abc-def-ghi-jkl-mn」が出力されました。

セルA1の文字列「abcdefghijklmn」に対し、配列に3文字間隔で切り出した「abc」「def」「ghi」「jkl」「mn」の文字列が格納され、Join関数で切り出した文字列と「-」を結合し1つの文字列にしてA2のセルに出力しています。

最後に

本記事では、指定した間隔で文字列に文字(列)を挿入する方法についてご説明しました。

もしある文字列に対して指定した間隔で文字列に文字(列)を挿入したい時は配列とJoin関数を使うと簡単に実現することができます。

指定した間隔で文字列に文字(列)を挿入したい時は本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら