【関数・プロパティ設定をつかう】
7 文字列のループで1文字ずつ分解
8 文字が入っているセルの最大行を取得
9 文字が入っているセルの最大列を取得
10 行のループで複数の文字列を連続分解
11 列のループで複数の文字列を連続分解
12 指定した行番号と列番号のセル番地を取得
13 特定の文字列を指定文字列に置き換える
「今回は、Excel VBA/マクロによって、
Mid関数と文字列のループ処理、更に、行のループ処理を組み合わせて、
複数行の文字列を左端から右端まで順に1文字ずつ分解してみましょう。
サンプルデータとして次のようなExcelシートを用意します。」
「Excelの3行目に固定して、A列のセルから取得した文字列を左端から右端まで順に1文字ずつ分解した文字を、
B列からM列までのセルに順に格納してみましょう。
読取列:『読取列』をA列つまり『1』列、読取行:『行番号』を『3』行目、最大文字数を変数『最大文字数』、
書込列を変数『列番号』、開始位置を変数『文字位置』としてから、プログラムコードを考えてみましょう。」
「『読取列』を『1』、『行番号』を『3』として定数宣言、
『最大文字数』・『列番号』・『文字位置』を整数型として変数宣言。
Const 読取列 = 1
Const 行番号 = 3
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integerと記述します。
先ず、A列のセルの値から最大文字数を取得します。
最大文字数 = Len(Cells(行番号, 読取列).Value)
1文字目から最大文字数まで1文字ずつカウントアップしていきながら、
そのつどA列のセルの値を1文字ずつ読みとり、セル(REw, 列番号)に書きこみます。
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value = Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
と記述します。」
Sub 指定行_1文字連続分解()
Const 読取列 = 1
Const 行番号 = 3
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integer
最大文字数 = Len(Cells(行番号, 読取列).Value)
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value = Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
End Sub
「その通りです。それでは、そのマクロを実行してみましょう。」
「2列目(B列)から11列目(K列)までのセルに『セ』『ル』『に』『文』『字』『を』『書』『き』『こ』『む』が、
書きこまれました。」
「Excelの3行目から12行目にかけて、A列のセルから取得した文字列を
左端から右端まで順に1文字ずつ分解した文字を、B列からM列までのセルに順に格納してみましょう。
読取列:『読取列』をA列つまり『1』列、
最小行:『最小行』を『3』行目、
最大行:『最大行』を『12』行目、
読取行を変数『行番号』、
最大文字数を変数『最大文字数』、
書込列を変数『列番号』、
開始位置を変数『文字位置』としてから、プログラムコードを考えてみましょう。」
「『読取列』を『1』、『最小行』を『3』、『最大行』を『12』として定数宣言、
『行番号』・『最大文字数』・『列番号』・『文字位置』を整数型として変数宣言。
Const 読取列 = 1
Const 最小行 = 3
Const 最大行 = 12
Dim 行番号 As Integer
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integerと記述します。」
「ほぼOKなんですが、一点アドバイスします。
読取行:『行番号』を整数型『Integer』として変数宣言していますが、
整数型『Integer』では -32,768~32,767の範囲の数しか格納できません。
つまり、『Integer』では 32,767行までしか格納できません。
しかし、Excelの最大行数は、32,767行より、はるかに多いです。
Excel2003までは、最大行数=65,536行だったのですが、
Excel2007からは、最大行数=1,048,576行となっています。
そのため、もしマクロでExcelの行数が32,767行を超えるようなデータを扱うときは、
『Integer』ではデータを格納できなくなってしまいます。
だけど、長整数型『long』なら -2,147,483,648~2,147,483,647の範囲まで格納できます。
つまり、『long』なら 2,147,483,647行まで格納できます。
Excelの行数が32,767行を超えるようなケースもあるかもしれないので、
行に関して変数宣言するときは、長整数型『long』をつかうことをお薦めします。」
「わかりました。読取行:『行番号』は、長整数型『long』として変数宣言します。
Dim 行番号 As long
と記述します。」
「次に、A列のセルの値から最大文字数を取得します。
その後、1文字目から最大文字数まで1文字ずつカウントアップしていきながら、
そのつどA列のセルの値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこみます。
最大文字数 = Len(Cells(行番号, 読取列).Value)
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value _
= Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
このプログラムコードの集まりを【ブロックA】とします。
それから、Excelの最小行:『最小行』(3行目)から最大行:『最大行』(12行目)にかけて、
各行の処理【ブロックA】をループ処理で実行します。
そこで、【ブロックA】をはさむように、
【ブロックA】の前後にFor 行番号 = 最小行 To 最大行とNext 行番号を
追加します。
For 行番号 = 最小行 To 最大行
【ブロックA】
Next 行番号
と記述します。」
Sub 行ループ_1文字連続分解()
Const 読取列 = 1
Const 最小行 = 3
Const 最大行 = 12
Dim 行番号 As long
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integer
For 行番号 = 最小行 To 最大行
最大文字数 = Len(Cells(行番号, 読取列).Value)
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value _
= Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
Next 行番号
End Sub
「それでは、そのマクロを実行してみましょう。」
「Excelの3行目から12行目にかけて、A列のセルから取得した文字列を左端から右端まで
順に1文字ずつ分解した文字が、2列目(B列)から13列目(M列)までのセルに順に書きこまれました。」
「予め、次のようなExcelシートを用意します。
ExcelのA列の文字が入っているセルの最大行を取得した後、最小行から最大行にかけて、
A列のセルから取得した文字列を左端から右端まで順に1文字ずつ分解した文字を、
B列からM列までのセルに順に格納してみましょう。
読取列:『読取列』をA列つまり『1』列、最小行:『最小行』を『3』行目、
最大行を変数『最大行』、読取行を変数『行番号』、最大文字数を変数『最大文字数』、
書込列を変数『列番号』、開始位置を変数『文字位置』としてから、ソースコードを考えてみましょう。」
「『読取列』を『1』、『最小行』を『3』として定数宣言、
『最大行』・『行番号』を長整数型として変数宣言。
『最大文字数』・『列番号』・『文字位置』を整数型として変数宣言。
Const 読取列 = 1
Const 最小行 = 3
Dim 最大行 As long
Dim 行番号 As long
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integerと記述します。
先ず、ExcelのA列の文字が入っているセルの最大行を取得します。
最大行 = Cells(Rows.Count, "A").End(xlUp).Row
次に、A列のセルの値から最大文字数を取得します。
その後、1文字目から最大文字数まで1文字ずつカウントアップしていきながら、
そのつどA列のセルの値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこみます。
最大文字数 = Len(Cells(行番号, 読取列).Value)
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value _
= Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
このプログラムコードの集まりを【ブロックB】とします。
それから、Excelの最小行:『最小行』(3行目)から最大行:『最大行』(12行目)にかけて、
各行の処理【ブロックB】をループ処理で実行します。
For 行番号 = 最小行 To 最大行
【ブロックB】
Next 行番号
と記述します。」
Sub 最大行取得後_行ループ_1文字連続分解()
Const 読取列 = 1
Const 最小行 = 3
Dim 最大行 As long
Dim 行番号 As long
Dim 最大文字数 As Integer
Dim 列番号 As Integer
Dim 文字位置 As Integer
最大行 = Cells(Rows.Count, "A").End(xlUp).Row
For 行番号 = 最小行 To 最大行
最大文字数 = Len(Cells(行番号, 読取列).Value)
For 文字位置 = 1 To 最大文字数
列番号 = 文字位置 + 1
Cells(行番号, 列番号).Value _
= Mid(Cells(行番号, 読取列).Value, 文字位置, 1)
Next 文字位置
Next 行番号
End Sub
「その通りです。それでは、そのマクロを実行してみましょう。」
「Excelの3行目から12行目にかけて、A列のセルから取得した文字列を2列目(B列)から13列目(M列)までのセルに
左端から右端まで順に1文字ずつ分解した文字が、
順に書きこまれました。」
「このように、Mid関数と文字列のループ処理、更に、行のループ処理を組み合わせると、
複数行の文字列を左端から右端まで順に1文字ずつ分解することができます。」
◇もしもPython-xlwingsだったら、
2023-03-19
2021-12-20
2021-12-12