【関数・プロパティ設定をつかう】
4 三つの文字列取得関数をつかう
5 文字列の指定位置から1文字を取得
6 文字列の文字数を取得
7 文字列のループで1文字ずつ分解
8 文字が入っているセルの最大行を取得
9 文字が入っているセルの最大列を取得
10 行のループで複数の文字列を連続分解
「今度は、Excel VBA/マクロによって1文字ずつ分解する処理を文字列のループ処理で一つにまとめてみましょう。
予め、次のようなExcelシートを用意します。」
「書込行:WRwを『3』に、最大文字数:MaxStrを『13』に固定して、
書込列を変数WCm、開始位置を変数StPとします。
1文字目から最大文字数まで1文字ずつカウントアップしていきながら、
そのつどセルA3の値を1文字ずつ読みとり、
セル(WRw, WCm)に書きこんでみましょう。」
「『WRw』を『3』、『MaxStr』を『13』として定数宣言、
WCm・StPを整数型として変数宣言。
Const WRw = 3
Const MaxStr = 13
Dim WCm As Integer
Dim StP As Integer
と記述します。
次に、1文字目から最大文字数まで1文字ずつカウントアップしていきながら、
そのつどセルA3の値を1文字ずつ読みとり、セル(WRw, WCm)に書きこむということを考えてみます。
開始位置:StPを『1』から最大文字列:MaxStrまで1ずつカウントアップしていきながら、
そのつどセルA3の値を1文字ずつ読みとり、セル(WRw, WCm)に書きこむということだから、
For StP = 1 To MaxStr
Cells(WRw, WCm).Value = Mid(Range("A3").Value, StP, 1)
Next StP
と記述します。」
「そうですね。ほぼ正しいプログラムコードです。
しかし、開始位置:StPと書込列:WCmの関係が記述されていません。
ループ処理の中で、開始位置:StPは1ずつカウントアップしていきますが、
書込列:WCmは何も値が代入されていません。」
「確かに、書込列:WCmが『0』だと、マクロを実行したときにエラーとなってしまいます。
開始位置:StPと書込列:WCmの等式を考えてみます。
StPが 『1』文字目のとき、WCmはB列つまり 『2』列
StPが 『2』文字目のとき、WCmはC列つまり 『3』列
StPが 『3』文字目のとき、WCmはD列つまり 『4』列
StPが 『4』文字目のとき、WCmはE列つまり 『5』列
StPが 『5』文字目のとき、WCmはF列つまり 『6』列
StPが 『6』文字目のとき、WCmはG列つまり 『7』列
StPが 『7』文字目のとき、WCmはH列つまり 『8』列
StPが 『8』文字目のとき、WCmはI列つまり 『9』列
StPが 『9』文字目のとき、WCmはJ列つまり『10』列
StPが『10』文字目のとき、WCmはK列つまり『11』列
StPが『11』文字目のとき、WCmはL列つまり『12』列
StPが『12』文字目のとき、WCmはM列つまり『13』列
StPが『13』文字目のとき、WCmはN列つまり『14』列
ということは、
WCm = StP + 1という等式が成り立ちます。
For StP = 1 To MaxStr
WCm = StP + 1
Cells(WRw, WCm).Value = Mid(Range("A3").Value, StP, 1)
Next StP
と記述します。」
Sub Mid関数_1文字連続分解ループ()
Const WRw = 3
Const MaxStr = 13
Dim WCm As Integer
Dim StP As Integer
For StP = 1 To MaxStr
WCm = StP + 1
Cells(WRw, WCm).Value = Mid(Range("A3").Value, StP, 1)
Next StP
End Sub
「その通りです。それでは、そのマクロを実行してみましょう。」
「セルB3~N3に
『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』
が、書きこまれました。」
「先ほど、1文字ずつ分解する処理を文字列のループ処理で一つにまとめてみましたが、
ループの終了値つまり最大文字数:MaxStrを『13』に固定していました。
ループの終了値を毎回人が数えていては手間がかかるし時間もかかるので、
コンピュータに計算してもらうようにしましょう。
いったん全てのセルB3~N3の値をクリアしてください。」
「ループの終了値つまり最大文字数:MaxStrを取得するために、Len関数をつかってみます。
引数としてセルA3から取得した文字列を渡してから、文字数を受け取り、変数『MaxStr』に格納してみます。
MaxStr = Len(Range("A3").Value)
ループ処理の前処理として、これをループ処理より先に記述します。」
「その通りです。
今回は、マクロを実行する前に、
『ビジュアル ベーシック エディター』の『コードウィンドウ』で、
MaxStr = Len(Range("A3").Value)
の行の左端をクリックして、ブレークポイントを設定しておきましょう。」
「MaxStr = Len(Range("A3").Value)
の行の左端をクリックすると、左端に赤丸がついて、
プログラムコードの背景が赤に文字が白に変わり、
ブレークポイントが設定されました。
ところで、ブレークポイントって何ですか?」
「ブレークポイントとは、ソフトウェア開発のデバッグ作業において
実行中のプログラムを意図的に一時停止させる箇所のことです。
それでは、そのマクロを実行してみましょう。」
「MaxStr = Len(Range("A3").Value)の行に右矢印が付いて背景色が黄色になっています。」
「それは、MaxStr = Len(Range("A3").Value)の行で
実行中のプログラムが一時停止している状態です。
それでは、マウスを動かしてMaxStrにカーソルを合わせてください。」
「MaxStrのすぐ下にMaxStr = 0という文字が表示されました。」
「実行中のプログラムが一時停止している状態のときは、
プログラムコードの変数に、マウスを動かしてカーソルを合わせると、
その変数の現在値を知ることができます。
現在、MaxStr = 0です。
ここで、F8をクリックした後、マウスを動かしてMaxStrにカーソルを合わせてください。」
「For StP = 1 To MaxStrの行に右矢印が付いて背景色が黄色になりました。
マウスを動かしてMaxStrにカーソルを合わせると、
MaxStrのすぐ下にMaxStr = 13という文字が表示されました。」
「デバッグ中にF8をクリックすると、一時停止していたプログラムコードが実行されて、
その次の行のプログラムコードが一時停止状態となります。
F8をクリックしたことで、MaxStr = Len(Range("A3").Value)が実行されて、
MaxStr = 13となりました。
ここで、マウスを動かしてFor StP = 1 To MaxStrの行のMaxStrに
カーソルを合わせてください。」
「マウスを動かしてMaxStrにカーソルを合わせると、
MaxStrのすぐ下にMaxStr = 13という文字が表示されました。」
「MaxStr = Len(Range("A3").Value)が実行されて、MaxStr = 13となったことにより、
For StP = 1 To MaxStrの行のMaxStrも13となりました。
このように、ブレークポイントを設定して、デバッグ作業を行えば、
実行中のプログラムの変数の値が正しく取得されているか等を確認することができます。
デバッグ中にF5をクリックすると、一時停止していたプログラムコード以降の
全てのプログラムコードが最後まで一気に実行されます。
ここで、F5をクリックしてください。」
「セルB3~N3に『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』
が、書きこまれました。」
「試しに、対象文字列:セルA2の値を13文字以内の適当な文字に書きかえて、マクロを実行して、
ある文字列が左端から右端まで順に1文字ずつ分解できることを確かめてみましょう。」
◇もしもPython-xlwingsだったら、
2023-03-19
2021-12-20
2021-12-12