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

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

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

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

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

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

12 指定した行番号と列番号のセル番地を取得

13 特定の文字列を指定文字列に置き換える

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

パイさん

「今回は、Excel VBA/マクロによって、

 Mid関数文字列のループ処理、更に、行のループ処理を組み合わせて、

 複数行の文字列を左端から右端まで順に1文字ずつ分解してみましょう

 サンプルデータとして次のようなExcelシートを用意します。」

Img7_4_11

パイさん

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

 定数『読取列』をA列つまり『1』列に、

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

 対象文字列を変数『txt』、対象文字列の文字数を変数『最大文字数』、

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

 セル(『行番号』,『読取列』)の値を変数『txt』に格納

 Len関数をつかい変数『txt』から文字数を取得し、変数『最大文字数』に格納

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

 そのつど、変数『最小列』・変数『文字位置』から変数『列番号』を算出し、

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

ソンくん

「『行番号』を『3』、『読取列』を『1』、『最小列』を『2』として定数宣言、

 『txt』を文字列型として定数宣言、

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

 Const 行番号 = 3

 Const 読取列 = 1

 Const 最小列 = 2

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 列番号 As Integer

 Dim 文字位置 As Integer


 変数『txt』にセル(『行番号』,『読取列』)の値を格納します。

 txt = Cells(行番号, 読取列).Value


 Len関数をつかい変数『txt』から文字数を取得し、変数『最大文字数』に格納します。

 最大文字数 = Len(txt)


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

 そのつど、変数『最小列』・変数『文字位置』から変数『列番号』を算出します。

 そして、変数『txt』の値を1文字ずつ読みとり、セル(行番号, 列番号)に値を書きこみます。

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

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

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

 Next 文字位置

  と記述します。」


Sub 指定行_1文字連続分解()

 Const 行番号 = 3

 Const 読取列 = 1

 Const 最小列 = 2

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 列番号 As Integer

 Dim 文字位置 As Integer

 

 txt = Cells(行番号, 読取列).Value

 最大文字数 = Len(txt)

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

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

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

 Next 文字位置

End Sub

パイさん

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

Img7_4_12

ソンくん

「2列目(B列)から11列目(K列)までのセルに『セ』『ル』『に』『文』『字』『を』『書』『き』『こ』『む』が、

 書きこまれました。」



2. 行のループでセルの文字列を1文字ずつ連続分解

パイさん

「ExcelのA列の文字が入っているセルの最大行を取得した後、

 最小行から最大行にかけて、

 A列のセルから取得した文字列を左端から右端まで順に1文字ずつ分解した文字を、

 B列からM列までのセルに順に格納してみましょう。」

定数『読取列』にA列つまり『1』列を格納

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

定数『最小行』に『3』行を格納

最大行を長整数型の変数『最大行』として定義

行番号を長整数型の変数『行番号』として定義

対象文字列を文字列型の変数『txt』として定義

対象文字列の文字数を整数型の変数『最大文字数』として定義

列番号を整数型の変数『列番号』として定義

文字数を取り出す開始位置を整数型の変数『文字位置』として定義

 

1列目の最大行を取得し、変数『最大行』に格納

変数『行番号』を『最小行』から『最大行』までカウントアップしながら以下の処理を繰り返す

変数『txt』にセル(『行番号』,『読取列』)の値を代入

Len関数をつかい変数『txt』から文字数を取得し、変数『最大文字数』に格納

変数『文字位置』を0から『最大文字数』までカウントアップしながら以下の処理を繰り返す

変数『列番号』に『最小列』+『文字位置』-『1』を代入

セル(『行番号』,『列番号』)の値に変数『txt』から取得した『文字位置』の文字を代入


ソンくん

「『読取列』を『1』、『最小列』を『2』、『最小行』を『3』として定数宣言、

 『最大行』・『行番号』を長整数型として変数宣言、

 『txt』を文字列型として定数宣言、

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

 Const 読取列 = 1

 Const 最小列 = 2

 Const 最小行 = 3

 Dim 最大行 As Long

 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 列番号 As Integer

 Dim 文字位置 As Integer


 Excelの1列目の文字が入っているセルの最大行を取得します。

 最大行 = Cells(Rows.Count, 読取列).End(xlUp).Row

 最大行には『12』が入ります。


 セル(『行番号』,『読取列』)の値を変数『txt』に格納

 Len関数をつかい変数『txt』から文字数を取得し、変数『最大文字数』に格納

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

 そのつど、変数『最小列』・変数『文字位置』から変数『列番号』を算出し、

 そして、変数『txt』の値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこみます。」

 txt = Cells(行番号, 読取列).Value

 最大文字数 = Len(txt)

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

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

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

 Next 文字位置


パイさん

「OKです。

 このプログラムコードの集まりを【ブロックA】とします。

 それから、Excelの『最小行』(3行目)から『最大行』(12行目)にかけて、

 【ブロックA】(各行の処理)ループ処理で実行します。

 そこで、【ブロックA】をはさむように、

 【ブロックA】の前後に

 For 行番号 = 最小行 To 最大行

 Next 行番号

 追加します。」

 For 行番号 = 最小行 To 最大行

 【ブロックA】

 Next 行番号


Sub 行ループ_1文字連続分解()

 Const 読取列 = 1

 Const 最小列 = 2

 Const 最小行 = 3

 Dim 最大行 As Long

 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 列番号 As Integer

 Dim 文字位置 As Integer

 

 最大行 = Cells(Rows.Count, 読取列).End(xlUp).Row

 

 For 行番号 = 最小行 To 最大行

 txt = Cells(行番号, 読取列).Value

 最大文字数 = Len(txt)

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

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

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

 Next 文字位置

 Next 行番号

End Sub

パイさん

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


Img7_4_13

ソンくん

「Excelの3行目から12行目にかけて、A列のセルから取得した文字列を

 左端から右端まで順に1文字ずつ分解した文字が、

 2列目(B列)から13列目(M列)までのセルに

 書きこまれました。」


パイさん

「このように、Mid関数文字列のループ処理、更に、行のループ処理を組み合わせると、

 複数行の文字列を左端から右端まで順に1文字ずつ分解することができます。」