【関数・プロパティ設定をつかう】

4 三つの文字列取得関数をつかう

5 文字列の指定位置から1文字を取得

6 文字列の文字数を取得

7 文字列のループで1文字ずつ分解

8 文字が入っているセルの最大行を取得

9 文字が入っているセルの最大列を取得

10 行のループで複数の文字列を連続分解

文字列のループで1文字ずつ分解

1. 文字列のループで1文字ずつ分解

パイさん

「今度は、Excel VBA/マクロによって1文字ずつ分解する処理を

 文字列のループ処理で一つにまとめてみましょう。

 予め、次のようなExcelシートを用意します。」

Img7_2_34

パイさん

「定数『行番号』を『3』行に、

 定数『最小列』をB列つまり『2』列に、

 定数『最大文字数』を『13』に固定して、

 列番号を変数『列番号』、開始位置を変数『文字位置』とします。

 1文字目から『最大文字数』まで1文字ずつ『文字位置』をカウントアップしていきながら、

 そのつどセルA3の値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこんでみましょう。」

ソンくん

「『行番号』を『3』、『最小列』を『2』、『最大文字数』を『13』として定数宣言、

 『列番号』・『文字位置』を整数型として変数宣言。

 Const 行番号 = 3

 Const 最小列 = 2

 Const 最大文字数 = 13

 Dim 列番号 As Integer

 Dim 文字位置 As Integer

 と記述します。

 次に、1文字目から『最大文字数』まで1文字ずつ『文字位置』をカウントアップしていきながら、

 そのつどセルA3の値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこむということだから、

 For 文字位置 = 1 To 最大文字数

   Cells(行番号, 列番号).Value = Mid(Range("A3").Value, 文字位置, 1)

 Next 文字位置

 と記述します。」

パイさん

「そうですね。ほぼ正しいプログラムコードです。

 しかし、変数『文字位置』と変数『列番号』の関係が記述されていません。

 ループ処理の中で、変数『文字位置』は1ずつカウントアップしていきますが、

 変数『列番号』は何も値が代入されていません。」

ソンくん

「確かに、変数『列番号』が『0』だと、マクロを実行したときにエラーとなってしまいます。

 変数『最小列』・変数『文字位置』と変数『列番号』の等式を考えてみます。

 『最小列』が『2』、かつ、

 文字位置』が 『1』のとき、『列番号』はB列つまり 『2』列

 文字位置』が 『2』のとき、『列番号』はC列つまり 『3』列

 文字位置』が 『3』のとき、『列番号』はD列つまり 『4』列

 文字位置』が 『4』のとき、『列番号』はE列つまり 『5』列

 文字位置』が 『5』のとき、『列番号』はF列つまり 『6』列

 文字位置』が 『6』のとき、『列番号』はG列つまり 『7』列

 文字位置』が 『7』のとき、『列番号』はH列つまり 『8』列

 文字位置』が 『8』のとき、『列番号』はI列つまり 『9』列

 文字位置』が 『9』のとき、『列番号』はJ列つまり『10』列

 文字位置』が『10』のとき、『列番号』はK列つまり『11』列

 文字位置』が『11』のとき、『列番号』はL列つまり『12』列

 文字位置』が『12』のとき、『列番号』はM列つまり『13』列

 文字位置』が『13』のとき、『列番号』はN列つまり『14』列

 ということは、

 列番号最小列 + 文字位置 - 1

  という等式が成り立ちます。


 For 文字位置 = 1 To 最大文字数

   列番号最小列 + 文字位置 - 1

   Cells(行番号, 列番号).Value = Mid(Range("A3").Value, 文字位置, 1)

  Next 文字位置

  と記述します。」


Sub Mid関数_1文字連続分解ループ()

 Const 行番号 = 3

 Const 最小列 = 2

 Const 最大文字数 = 13

 Dim 列番号 As Integer

 Dim 文字位置 As Integer

 

 For 文字位置 = 1 To 最大文字数

   列番号最小列 + 文字位置 - 1

   Cells(行番号, 列番号).Value = Mid(Range("A3").Value, 文字位置, 1)

 Next 文字位置

End Sub

パイさん

「その通りです。それでは、そのマクロを実行してみましょう。」


Img7_2_36

ソンくん

「セルB3~N3に、『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』

 が、書きこまれました。」



2. 文字列の文字数を取得後、文字列のループで1文字ずつ分解

パイさん

「先ほど、1文字ずつ分解する処理を文字列のループ処理で一つにまとめてみましたが、

 ループの終了値つまり定数『最大文字数』を『13』に固定していました。

 ループの終了値を毎回人が数えていては手間がかかるし時間もかかるので、

 コンピュータに計算してもらうようにしましょう。

 いったん全てのセルB3~N3の値をクリアしてください。」

Img7_2_41

ソンくん

「ループの終了値つまり変数『最大文字数』を取得するために、Len関数をつかってみます。

 引数としてセルA3から取得した文字列を渡してから、文字数を受け取り、

 変数『最大文字数』に格納してみます。

 最大文字数 = Len(Range("A3").Value)

 ループ処理の前処理として、これをループ処理より先に記述します。」

Img7_2_42

パイさん

「その通りです。

 今回は、マクロを実行する前に、

 『ビジュアル ベーシック エディター』の『コードウィンドウ』で、

 最大文字数 = Len(Range("A3").Value)

 の行の左端をクリックして、ブレークポイントを設定しておきましょう。」

Img7_2_43

ソンくん

最大文字数 = Len(Range("A3").Value)

 の行の左端をクリックすると、左端に赤丸がついて、

 プログラムコードの背景が赤に文字が白に変わり、

 ブレークポイントが設定されました。

 ところで、ブレークポイントって何ですか?」

パイさん

ブレークポイントとは、ソフトウェア開発のデバッグ作業において

 実行中のプログラムを意図的に一時停止させる箇所のことです。

 それでは、そのマクロを実行してみましょう。」

Img7_2_44

ソンくん

最大文字数 = Len(Range("A3").Value)の行に右矢印が付いて背景色が黄色になっています。」

パイさん

「それは、最大文字数 = Len(Range("A3").Value)の行で

 実行中のプログラムが一時停止している状態です。

 それでは、マウスを動かして最大文字数にカーソルを合わせてください。」

Img7_2_45

ソンくん

最大文字数のすぐ下に最大文字数 = 0という文字が表示されました。」

パイさん

「実行中のプログラムが一時停止している状態のときは、

 プログラムコードの変数に、マウスを動かしてカーソルを合わせると、

 その変数の現在値を知ることができます。

 現在、最大文字数 = 0です。

 ここで、F8をクリックした後、マウスを動かして最大文字数にカーソルを合わせてください。」

Img7_2_46

ソンくん

For 文字位置 = 1 To 最大文字数の行に右矢印が付いて背景色が黄色になりました。

 マウスを動かして最大文字数にカーソルを合わせると、

 最大文字数のすぐ下に最大文字数 = 13という文字が表示されました。」

パイさん

デバッグ中にF8をクリックすると、一時停止していたプログラムコードが実行されて、

その次の行のプログラムコードが一時停止状態となります。

 F8をクリックしたことで、最大文字数 = Len(Range("A3").Value)が実行されて、

 最大文字数 = 13となりました。

 ここで、マウスを動かしてFor 文字位置 = 1 To 最大文字数の行の最大文字数

 カーソルを合わせてください。」

Img7_2_47

ソンくん

「マウスを動かして最大文字数にカーソルを合わせると、

 最大文字数のすぐ下に最大文字数 = 13という文字が表示されました。」

パイさん

最大文字数 = Len(Range("A3").Value)が実行されて、最大文字数 = 13となったことにより、

 For 文字位置 = 1 To 最大文字数の行の最大文字数13となりました。

 このように、ブレークポイントを設定して、デバッグ作業を行えば、

 実行中のプログラムの変数の値が正しく取得されているか等を確認することができます。

 デバッグ中にF5をクリックすると、一時停止していたプログラムコード以降の

 全てのプログラムコードが最後まで一気に実行されます。

 ここで、F5をクリックしてください。」

Img7_2_48

ソンくん

「セルB3~N3に『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』

 が、書きこまれました。」

 

パイさん

「試しに、対象文字列:セルA2の値を13文字以内の適当な文字に書きかえて、マクロを実行して、

 ある文字列が左端から右端まで順に1文字ずつ分解できることを確かめてみましょう。」