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

1 あるレンジから別レンジを更新

2 あるシートから別シートを更新

3 逆Z式並びで更新

4 セルで指定したシートを更新

5 複数シートを連続更新

6 Subプロシージャの定義と呼び出し

7 あるブックから別ブックを更新

あるレンジから別レンジを更新

 今回は、Excel VBA/マクロによって、あるレンジからデータを読みとり別レンジへデータを書きこんでみます。


 今回から、Excel VBA/マクロによって漢字学習アプリを作成します。

 先ず、漢字入力帳のサンプルを次のように作成します。

Img8_1_11

 漢字入力帳の仕様は、次の通りです。

 (1) B列に問題文を横書きで記述します。

 (2) C~F列に問題にしたい漢字を1文字ずつ記述します。

 (3) G~J列に問題にしたい漢字のふりがなを1文字ずつ記述します。

 (4) A列に番号を記述します。


 次に、マクロを記述しますが、その仕様は次の通りです。

 (1) 漢字入力帳の2~11行を順に読みとる。

 (2) 漢字入力帳のB列に記述されている文を1文字ずつ分解しながら漢字学習帳に縦書きで書きこむ。

 (3) 漢字入力帳のC~F列に記述されている漢字が漢字学習帳に書きこんだ文字の中にあれば、

   そこを空欄のマスにして、併せてそのすぐ右側に、漢字入力帳のG~J列に記述されている

   ふりがなを書きこむ。


 マクロを実行すれば、次のような漢字学習帳が作成されます。

Img8_1_12

 最初に、同一シート内で、漢字入力帳から、漢字学習帳を作成するマクロをつくってみます。



1. 文字列を1文字ずつ分解しながら縦書きで連続するセルに書きこむ

 先ず、Excelの2行目、B列に記述されている文を1文字ずつ分解しながらL列に2行目から

 縦書きで書きこんでみます。

定数『読取列』に『B』列を代入

定数『読取行』に『2』行目を代入

定数『列番号』にL列つまり『12』列を代入

定数『最小行』に『2』行目を代入


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

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

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

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


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

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

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

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

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


 『行のループで複数の文字列を連続分解』でつくったマクロ『指定行_1文字連続分解』を

 そのままコピーして、新しくマクロ『レンジからレンジ1』をつくります。

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

 ここで、このマクロをつかって、Excel VBAコードの構成を説明します。

 Excel VBAコードは、大きく宣言部処理部に分かれます。

 宣言部には、変数や定数の宣言を記述します。

 処理部には、代入文、ループ処理、条件分岐処理、

 そして関数やプロパティの設定などの処理手順を記述します。

 このように、宣言部処理部と分けておくと、Excel VBAコードが記述しやすくなり、

 また、Excel VBAコードが改修しやすくなります。


 先ず、宣言部を改修します。

定数『読取列』に『B』列を代入

定数『読取行』に『2』行目を代入

定数『列番号』にL列つまり『12』列を代入

定数『最小行』に『2』行目を代入


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

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

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

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

 Const 読取列 = "B"

 Const 読取行 = 2

 Const 列番号 = 12

 Const 最小行 = 2


 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 文字位置 As Integer



 そして、処理部を改修します。

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

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

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

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

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

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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

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

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====


 【マクロ『レンジからレンジ1』】

Sub レンジからレンジ1()

 Const 読取列 = "B"

 Const 読取行 = 2

 Const 列番号 = 12

 Const 最小行 = 2


 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 文字位置 As Integer


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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

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

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====

End Sub

 それでは、マクロ『レンジからレンジ1』を実行してみます。


Img8_1_16

 Excelの2行目、B列に記述されている文が1文字ずつ分解されて、

 L列に2行目から縦書きで書きこまれました。



2. 文字列の中に特定の文字があれば、該当セルを空欄のマスにする

Img8_1_21

 次は、ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルを空欄のマスにしてみます。


定数『読取列』に『B』列を代入

定数『読取行』に『2』行目を代入

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入

定数『列番号』にL列つまり『12』列を代入

定数『最小行』に『2』行目を代入


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

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

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

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

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

漢字名を文字列型の変数『漢字名』として定義

列英字名を文字列型の変数『列英字名』として定義

枠領域を文字列型の変数『枠領域』として定義


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

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

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

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

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

 

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

変数『漢字名』にセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

セル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『文字位置』に格納

変数『文字位置』が 0 より大きいとき

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

変数『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの周りを実線で囲う

枠領域を空白にする


 マクロ『レンジからレンジ1』をコピーして、マクロ『レンジからレンジ2』をつくります。


 先ず、宣言部を改修します。定数及び変数を追加します。

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入


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

漢字名を文字列型の変数『漢字名』として定義

列英字名を文字列型の変数『列英字名』として定義

枠領域を文字列型の変数『枠領域』として定義

 Const 漢字最小列 = 3

 Const 漢字最大列 = 6


 Dim 漢字列 As Integer

 Dim 漢字名 As String

 Dim 列英字名 As String

 Dim 枠領域 As String


 そして、処理部に、

 『ExcelのC~F列に記述されている漢字が文字列の中にあれば該当セルを空欄のマスにする』

 という処理を追加します。

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

変数『漢字名』にセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

セル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『文字位置』に格納

変数『文字位置』が 0 より大きいとき

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

変数『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの周りを実線で囲う

枠領域を空白にする

 ' ===== 漢字列のカウントアップS =====

 For 漢字列 = 漢字最小列 To 漢字最大列

 漢字名 = Cells(読取行, 漢字列).Value

 If 漢字名 <> "" Then

 文字位置 = InStr(Cells(読取行, 読取列).Value, 漢字名)

 If 文字位置 > 0 Then

 行番号 = 最小行 + 文字位置 – 1

 列英字名 = Replace(Cells(1, 列番号).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Borders.LineStyle = xlContinuous

 Range(枠領域).Value = ""

 End If

 End If

 Next 漢字列

 ' ===== 漢字列のカウントアップE =====


 【マクロ『レンジからレンジ2』】

Sub レンジからレンジ2()

 Const 読取列 = "B"

 Const 読取行 = 2

 Const 漢字最小列 = 3

 Const 漢字最大列 = 6

 Const 列番号 = 12

 Const 最小行 = 2


 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 文字位置 As Integer

 Dim 漢字列 As Integer

 Dim 漢字名 As String

 Dim 列英字名 As String

 Dim 枠領域 As String


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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

 行番号 = 最小行 + 文字位置 - 1

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====


 ' ===== 漢字列のカウントアップS =====

 For 漢字列 = 漢字最小列 To 漢字最大列

 漢字名 = Cells(読取行, 漢字列).Value

 If 漢字名 <> "" Then

 文字位置 = InStr(Cells(読取行, 読取列).Value, 漢字名)

 If 文字位置 > 0 Then

 行番号 = 最小行 + 文字位置 – 1

 列英字名 = Replace(Cells(1, 列番号).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Borders.LineStyle = xlContinuous

 Range(枠領域).Value = ""

 End If

 End If

 Next 漢字列

 ' ===== 漢字列のカウントアップE =====

End Sub

 それでは、マクロ『レンジからレンジ2』を実行してみます。


Img8_1_25

 ExcelのセルC2に記述されている漢字『書』があったセルL8が空欄のマスになりました。



3. 文字列の中に特定の文字があれば、該当セルの右側にふりがなを書きこむ

Img8_1_31

 次は、ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルのすぐ右側に、

 G~J列に記述されているふりがなを書きこみます。


定数『読取列』に『B』列を代入

定数『読取行』に『2』行目を代入

定数『最大枠数』に『4』を代入

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入

定数『列番号』にL列つまり『12』列を代入

定数『最小行』に『2』行目を代入


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

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

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

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

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

漢字名を文字列型の変数『漢字名』として定義

列英字名を文字列型の変数『列英字名』として定義

枠領域を文字列型の変数『枠領域』として定義

ふりがな読取列を整数型の変数『ふりがな読取列』として定義

ふりがな書込列を整数型の変数『ふりがな列』として定義

ふりがな名を文字列型の変数『ふりがな名』として定義


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

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

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

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

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

 

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

変数『漢字名』にセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

セル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『文字位置』に格納

変数『文字位置』が 0 より大きいとき

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

変数『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの周りを実線で囲う

枠領域を空白にする

 

変数『ふりがな読取列』に『漢字列』+『最大枠数』を代入

変数『ふりがな名』にセル(『読取行』,『ふりがな読取列』)の値を代入

変数『ふりがな名』が空白でないとき

変数『ふりがな列』に『列番号』+ 1 を代入

変数『ふりがな列』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの値に『ふりがな名』を代入

枠領域のセルのフォントサイズを8に設定

枠領域のセルの横方向の配置を左詰めに設定

枠領域のセルの文字の配置を縦方向に設定

枠領域のセルの文字を縮小して全体を表示に設定


 マクロ『レンジからレンジ2』をコピーして、マクロ『レンジからレンジ3』をつくります。


 先ず、宣言部を改修します。定数及び変数を追加します。

定数『最大枠数』に『4』を代入


ふりがな読取列を整数型の変数『ふりがな読取列』として定義

ふりがな書込列を整数型の変数『ふりがな列』として定義

ふりがな名を文字列型の変数『ふりがな名』として定義

 Const 最大枠数 = 4


 Dim ふりがな読取列 As Integer

 Dim ふりがな列 As Integer

 Dim ふりがな名 As String


 そして、処理部に、

 『ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルのすぐ右側に、

  G~J列に記述されているふりがなを書きこむ』という処理を追加します。

変数『ふりがな読取列』に『漢字列』+『最大枠数』を代入

変数『ふりがな名』にセル(『読取行』,『ふりがな読取列』)の値を代入

変数『ふりがな名』が空白でないとき

変数『ふりがな列』に『列番号』+ 1 を代入

変数『ふりがな列』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの値に『ふりがな名』を代入

枠領域のセルのフォントサイズを8に設定

枠領域のセルの横方向の配置を左詰めに設定

枠領域のセルの文字の配置を縦方向に設定

枠領域のセルの文字を縮小して全体を表示に設定


 ふりがな読取列 = 漢字列 + 最大枠数

 ふりがな名 = Cells(読取行, ふりがな読取列).Value

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

 列英字名 = Replace(Cells(1, ふりがな列).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Value = ふりがな名

 Range(枠領域).Font.Size = 8

 Range(枠領域).HorizontalAlignment = -4131

 Range(枠領域).Orientation = -4166

 Range(枠領域).ShrinkToFit = True

 End If



 【マクロ『レンジからレンジ3』】

Sub レンジからレンジ3()

 Const 読取列 = "B"

 Const 読取行 = 2

 Const 最大枠数 = 4

 Const 漢字最小列 = 3

 Const 漢字最大列 = 6

 Const 列番号 = 12

 Const 最小行 = 2


 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 文字位置 As Integer

 Dim 漢字列 As Integer

 Dim 漢字名 As String

 Dim 列英字名 As String

 Dim 枠領域 As String

 Dim ふりがな読取列 As Integer

 Dim ふりがな列 As Integer

 Dim ふりがな名 As String


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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

 行番号 = 最小行 + 文字位置 - 1

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====


 ' ===== 漢字列のカウントアップS =====

 For 漢字列 = 漢字最小列 To 漢字最大列

 漢字名 = Cells(読取行, 漢字列).Value

 If 漢字名 <> "" Then

 文字位置 = InStr(Cells(読取行, 読取列).Value, 漢字名)

 If 文字位置 > 0 Then

 行番号 = 最小行 + 文字位置 – 1

 列英字名 = Replace(Cells(1, 列番号).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Borders.LineStyle = xlContinuous

 Range(枠領域).Value = ""


 ふりがな読取列 = 漢字列 + 最大枠数

 ふりがな名 = Cells(読取行, ふりがな読取列).Value

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

 列英字名 = Replace(Cells(1, ふりがな列).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Value = ふりがな名

 Range(枠領域).Font.Size = 8

 Range(枠領域).HorizontalAlignment = -4131

 Range(枠領域).Orientation = -4166

 Range(枠領域).ShrinkToFit = True

 End If

 End If

 End If

 Next 漢字列

 ' ===== 漢字列のカウントアップE =====

End Sub

 それでは、マクロ『レンジからレンジ3』を実行してみます。


Img8_1_34

 「ExcelのセルG2に記述されている漢字『か』がセルM8に書きこまれました。



4. 行のループで漢字学習帳を作成する

Img8_1_41

 Excelの漢字入力帳のB列に記述されている文を1文字ずつ分解しながら、漢字学習帳に2行目から

 縦書きで書きこみ、漢字入力帳のC~F列に記述されている漢字が漢字学習帳に書きこんだ文字の中にあれば、

 当セルを空欄のマスにして、併せてそのすぐ右側に、漢字入力帳のG~J列に記述されているふりがなを書きこむ。

 この一連の処理を、漢字入力帳の最小行から最大行までのループ処理で一気に実行し、L列からAD列まで

 瞬時に書きこみます。


定数『読取列』に『B』列を代入

定数『最大枠数』に『4』を代入

定数『漢字最小列』にC列つまり『3』列を代入

定数『漢字最大列』にF列つまり『6』列を代入

定数『読取最小行』に『2』を代入

定数『最小列』にL列つまり『12』列を代入

定数『書込ステップ列』に『2』を代入

定数『最小行』に『2』行目を代入


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

読取行を長整数型の変数『読取行』として定義

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

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

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

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

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

漢字名を文字列型の変数『漢字名』として定義

列英字名を文字列型の変数『列英字名』として定義

枠領域を文字列型の変数『枠領域』として定義

ふりがな読取列を整数型の変数『ふりがな読取列』として定義

ふりがな書込列を整数型の変数『ふりがな列』として定義

ふりがな名を文字列型の変数『ふりがな名』として定義

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


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

変数『列番号』に定数『最小列』の値を代入

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

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

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

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

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

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

 

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

変数『漢字名』にセル(『読取行』,『漢字列』)の値を代入

変数『漢字名』が空白でないとき

セル(『読取行』,『読取列』)の値から『漢字名』の位置を調べて変数『文字位置』に格納

変数『文字位置』が 0 より大きいとき

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

変数『列番号』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの周りを実線で囲う

枠領域を空白にする

 

変数『ふりがな読取列』に『漢字列』+『最大枠数』を代入

変数『ふりがな名』にセル(『読取行』,『ふりがな読取列』)の値を代入

変数『ふりがな名』が空白でないとき

変数『ふりがな列』に『列番号』+ 1 を代入

変数『ふりがな列』を列英字名に変換し変数『列英字名』に代入

変数『枠領域』に『列英字名』&『行番号』を代入

枠領域のセルの値に『ふりがな名』を代入

枠領域のセルのフォントサイズを8に設定

枠領域のセルの横方向の配置を左詰めに設定

枠領域のセルの文字の配置を縦方向に設定

枠領域のセルの文字を縮小して全体を表示に設定

変数『列番号』に『列番号』+『書込ステップ列』を代入


 マクロ『レンジからレンジ3』をコピーして、マクロ『レンジからレンジ4』をつくります。


 先ず、宣言部を改修します。定数及び変数を追加します。

定数『読取最小行』に『2』を代入

定数『最小列』にL列つまり『12』列を代入

定数『書込ステップ列』に『2』を代入


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

読取行を長整数型の変数『読取行』として定義

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

 Const 読取最小行 = 2

 Const 最小列 = 12

 Const 書込ステップ列 = 2


 Dim 読取最大行 As Long

 Dim 読取行 As Long

 Dim 列番号 As Integer


 そして、処理部を改修します。

Excelの漢字入力帳のB列に記述されている文を1文字ずつ分解しながら、

漢字学習帳に2行目から縦書きで書きこみ、漢字入力帳のC~F列に記述されている漢字が

漢字学習帳に書きこんだ文字の中にあれば、該当セルを空欄のマスにして、

併せてそのすぐ右側に、漢字入力帳のG~J列に記述されているふりがなを書きこむ。

これは、マクロ『レンジからレンジ3』の処理部に記述されていることなので、

マクロ『レンジからレンジ3』の処理部がブロックとしてそのままつかえます。

マクロ『レンジからレンジ3』の処理部【ブロックA】とします。

【ブロックA】

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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

 行番号 = 最小行 + 文字位置 - 1

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====


 ' ===== 漢字列のカウントアップS =====

 For 漢字列 = 漢字最小列 To 漢字最大列

 漢字名 = Cells(読取行, 漢字列).Value

 If 漢字名 <> "" Then

 文字位置 = InStr(Cells(読取行, 読取列).Value, 漢字名)

 If 文字位置 > 0 Then

 行番号 = 最小行 + 文字位置 – 1

 列英字名 = Replace(Cells(1, 列番号).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Borders.LineStyle = xlContinuous

 Range(枠領域).Value = ""


 ふりがな読取列 = 漢字列 + 最大枠数

 ふりがな名 = Cells(読取行, ふりがな読取列).Value

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

 列英字名 = Replace(Cells(1, ふりがな列).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Value = ふりがな名

 Range(枠領域).Font.Size = 8

 Range(枠領域).HorizontalAlignment = -4131

 Range(枠領域).Orientation = -4166

 Range(枠領域).ShrinkToFit = True

 End If

 End If

 End If

 Next 漢字列

 ' ===== 漢字列のカウントアップE =====


先ず、ExcelのB列の文字が入っているセルの最大行を取得するプログラムコードを追加します。

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

それから、漢字入力帳の最小行:『読取最小行』(2行目)から最大行:『読取最大行』にかけて、

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

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

【ブロックA】の一つ上の行に

For 読取行 = 読取最小行 To 読取最大行

【ブロックA】の一つ下の行に

Next 読取行を追加します。

マクロ『レンジからレンジ3』までは『列番号』を定数としていましたが、

今回のマクロから『列番号』を変数に変更します。

そのため、『列番号』のカウントアップが必要となります。

漢字入力帳の最小行から最大行までのループ処理の中で、

『列番号』は行が1行増加するたびに、L列から2列ずつカウントアップしていきます。

そのため、漢字入力帳の最小行から最大行までのループ処理の中に、

列番号 = 列番号 + 書込ステップ列を追加します。

更に、『列番号』の初期値はL列(12列目)なので、そのループ処理の前に、

列番号 = 最小列を追加します。

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

 列番号 = 最小列

 For 読取行 = 読取最小行 To 読取最大行

 【ブロックA】

 列番号 = 列番号 + 書込ステップ列

 Next 読取行


 【マクロ『レンジからレンジ4』】

Sub レンジからレンジ4()

 Const 読取列 = "B"

 Const 最大枠数 = 4

 Const 漢字最小列 = 3

 Const 漢字最大列 = 6

 Const 読取最小行 = 2

 Const 最小列 = 12

 Const 書込ステップ列 = 2

 Const 最小行 = 2


 Dim 読取最大行 As Long

 Dim 読取行 As Long

 Dim 行番号 As Long

 Dim txt As String

 Dim 最大文字数 As Integer

 Dim 文字位置 As Integer

 Dim 漢字列 As Integer

 Dim 漢字名 As String

 Dim 列英字名 As String

 Dim 枠領域 As String

 Dim ふりがな読取列 As Integer

 Dim ふりがな列 As Integer

 Dim ふりがな名 As String

 Dim 列番号 As Integer


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

 列番号 = 最小列

 ' ===== 読取行のカウントアップS =====

 For 読取行 = 読取最小行 To 読取最大行

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

 最大文字数 = Len(txt)

 ' ===== 対象文字列文字位置のカウントアップS =====

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

 行番号 = 最小行 + 文字位置 - 1

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

 Next 文字位置

 ' ===== 対象文字列文字位置のカウントアップE =====


 ' ===== 漢字列のカウントアップS =====

 For 漢字列 = 漢字最小列 To 漢字最大列

 漢字名 = Cells(読取行, 漢字列).Value

 If 漢字名 <> "" Then

 文字位置 = InStr(Cells(読取行, 読取列).Value, 漢字名)

 If 文字位置 > 0 Then

 行番号 = 最小行 + 文字位置 – 1

 列英字名 = Replace(Cells(1, 列番号).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Borders.LineStyle = xlContinuous

 Range(枠領域).Value = ""


 ふりがな読取列 = 漢字列 + 最大枠数

 ふりがな名 = Cells(読取行, ふりがな読取列).Value

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

 列英字名 = Replace(Cells(1, ふりがな列).Address _

 (False, False), "1", "")

 枠領域 = 列英字名 & 行番号

 Range(枠領域).Value = ふりがな名

 Range(枠領域).Font.Size = 8

 Range(枠領域).HorizontalAlignment = -4131

 Range(枠領域).Orientation = -4166

 Range(枠領域).ShrinkToFit = True

 End If

 End If

 End If

 Next 漢字列

 ' ===== 漢字列のカウントアップE =====

 列番号 = 列番号 + 書込ステップ列

 Next 読取行

 ' ===== 読取行のカウントアップE =====

End Sub

 それでは、マクロ『レンジからレンジ4』を実行してみます。


Img8_1_44

 ExcelのL列からAD列にかけて、漢字の書きこみ問題が作成されました。