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

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

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

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

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

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

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

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

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

パイさん

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

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

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

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

Img7_4_11

パイさん

「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

パイさん

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

Img7_4_12

ソンくん

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

 書きこまれました。」


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

パイさん

「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

パイさん

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

Img7_4_13

ソンくん

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

 順に1文字ずつ分解した文字が、2列目(B列)から13列目(M列)までのセルに順に書きこまれました。」


3. 最大行の取得後、行のループでセルの文字列を1文字ずつ連続分解

パイさん

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

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

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

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

 読取列:『読取列』をA列つまり『1』列、最小行:『最小行』を『3』行目、

 最大行を変数『最大行』、読取行を変数『行番号』、最大文字数を変数『最大文字数』、

 書込列を変数『列番号』、開始位置を変数『文字位置』としてから、ソースコードを考えてみましょう。」

Img7_4_14

ソンくん

「『読取列』を『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

パイさん

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

Img7_4_15

ソンくん

「Excelの3行目から12行目にかけて、A列のセルから取得した文字列を2列目(B列)から13列目(M列)までのセルに

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

 順に書きこまれました。」


パイさん

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

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



目 次

1. セルに文字を書きこむ
セルに文字を書きこむ

2. RangeとCellsでセルの位置を指定する
RangeとCellsでセルの位置を指定する

3. ループ処理でセルに値を書きこむ
ループ処理でセルに値を書きこむ

4. ループ処理でセルの値を読みとる
ループ処理でセルの値を読みとる

5. ループ処理でセルからセルへ値を代入する
ループ処理でセルからセルへ値を代入する

6. 条件分岐処理でセルの操作を分ける
条件分岐処理でセルの操作を分ける

7. 関数・プロパティ設定をつかう
関数・プロパティ設定をつかう

8. 他のレンジ/シート/ブックを更新する
他のレンジ/シート/ブックを更新する




YouTube

Excelマクロの実用版とデモ版


ブログ