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

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

3 逆Z式並びで更新

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

5 複数シートを連続更新

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

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

8 他のブックをオープン・クローズ

複数シートを連続更新

 今回は、Excel VBA/マクロによって、あるシートからデータを読みとり
 二つの別シートへデータを連続して書きこんでみます。


 前回は、『漢字入力帳』シートからデータを読みとり、『漢字学習帳A』シート、

 または、『漢字学習帳B』シートへデータを書きこんでみました。

 今回は、『漢字入力帳』シートからデータを読みとり、『漢字問題集』シート、

 及び、『漢字解答集』シートへデータを書きこんでみます。

 『漢字問題集』シートは出題漢字を空欄にして、

 『漢字解答集』シートは出題漢字を消さずにそのまま残します。

 そこで、その準備として、Excelマクロ有効ブック内に、

 『漢字入力帳』シートと『漢字問題集』・『漢字解答集』シートを作成しておきましょう。

 前回使用したExcelマクロ有効ブックをコピーして『9_他の複数シートを更新2.xlsm』を作成します。


『9_他の複数シートを更新2.xlsm』
『漢字入力帳』シート
Img9_4_11
『漢字問題集』シート
Img9_4_12
『漢字解答集』シート
Img9_4_13

 今回は、『漢字入力帳』シートからデータを読みとり、

 一つ目に『漢字問題集』シート、二つ目に『漢字解答集』シートを作成してみます。

 マクロ『シートから複数シート1』を、マクロ『シートから複数シート2』に名前を変えます。


 宣言部を改修します。

定数『WstMD』に『漢字問題集』を代入

定数『WstKT』に『漢字解答集』を代入

 Const WstMD = "漢字問題集"

 Const WstKT = "漢字解答集"



 処理部を改修します。

一つ目に、『漢字問題集』を作成します。

 書込ワークシート『Wst』に定数『WSheetMD』つまり『漢字問題集』を格納します。

 Wst = Worksheets(Est).Cells(読取行, 書込ワークシート列).Value をコメントアウトし

 Wst = WSheetMD を追加します。

 出題漢字の空白化の箇所をしっかりと残しておきます。

 Worksheets(Wst).Range(枠領域).value = ""


二つ目に、一つ目の『漢字問題集』の作成をコピーし、『漢字解答集』を作成するように書き換えます。

 書込ワークシート『Wst』に定数『WSheetKT』つまり『漢字解答集』を格納します。

 Wst = Worksheets(Est).Cells(読取行, 書込ワークシート列).Value をコメントアウトし

 Wst = WSheetKT を追加します。

 出題漢字の空白化の箇所をコメントアウトします。

 ' Worksheets(Wst).Range(枠領域).value = ""


  コメントアウトとは、特定の箇所をコメント化してコードを無効にすることです。

  Excel VBA/マクロでは、『'』をコードの先頭につけることで、そのコードをコメントにすることができます。

  コメントアウトは、一時的に除外するが、後で復活させるかもしれない内容を消さずに

  そのまま残しておきたいときに便利な技術です。



 【マクロ『シートから複数シート2』】

Sub シートから複数シート2()

 Const Est = "漢字入力帳"

 Const WSheetMD = "漢字問題集"

 Const WSheetKT = "漢字解答集"

 Const 読取問題番号列 = "A"

 Const 読取列 = "B"

 Const 最大枠数 = 4

 Const 漢字最小列 = 3

 Const 漢字最大列 = 6

 ' Const 書込ワークシート列 = "K"

 Const 読取最小行 = 2

 Const 最大列 = 10

 Const 書込列数 = 5

 Const 書込ステップ列 = -2

 Const 書込問題番号最小行 = 1

 Const 書込ステップ行 = 15


 Dim Wst As String

 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

 Dim 問題番号 As Long

 Dim 書込問題番号行 As Long

 Dim 最小行 As Long



 '◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 漢字問題集 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆

 Wst = WSheetMD

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

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

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

 問題番号 = Worksheets(Est).Cells(読取行, 読取問題番号列).Value

 書込問題番号行 = Int((問題番号 - 1) / 書込列数) * 書込ステップ行 _

 + 書込問題番号最小行

 最小行 = 書込問題番号行 + 1

 列番号 = 最大列 + ((問題番号 - 1) Mod 書込列数) * 書込ステップ列


 ' Wst = Worksheets(Est).Cells(読取行, 書込ワークシート列).Value


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

 .Address(False, False), "1", "")

 枠領域 = 列英字名 & 書込問題番号行

 Worksheets(Wst).Range(枠領域).Value = 問題番号

 Worksheets(Wst).Range(枠領域).Font.Size = 10


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

 最大文字数 = Len(txt)

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

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

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

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

 Next 文字位置

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


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

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

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

 If 漢字名 <> "" Then

 文字位置 = InStr(Worksheets(Est).Cells(読取行, 読取列).Value, _

 漢字名)

 If 文字位置 > 0 Then

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

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

 .Address(False, False), "1", "")

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

 Worksheets(Wst).Range(枠領域).Borders.LineStyle _

 = xlContinuous

 Worksheets(Wst).Range(枠領域).Value = ""


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

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

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

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

 .Address(False, False), "1", "")

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

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

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

 Worksheets(Wst).Range(枠領域).HorizontalAlignment _

 = -4131

 Worksheets(Wst).Range(枠領域).Orientation = -4166

 Worksheets(Wst).Range(枠領域).ShrinkToFit = True

 End If

 End If

 End If

 Next 漢字列

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

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

 Next 読取行

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



 '◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 漢字解答集 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆

 Wst = WSheetKT

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

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

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

 問題番号 = Worksheets(Est).Cells(読取行, 読取問題番号列).Value

 書込問題番号行 = Int((問題番号 - 1) / 書込列数) * 書込ステップ行 _

 + 書込問題番号最小行

 最小行 = 書込問題番号行 + 1

 列番号 = 最大列 + ((問題番号 - 1) Mod 書込列数) * 書込ステップ列


 ' Wst = Worksheets(Est).Cells(読取行, 書込ワークシート列).Value


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

 .Address(False, False), "1", "")

 枠領域 = 列英字名 & 書込問題番号行

 Worksheets(Wst).Range(枠領域).Value = 問題番号

 Worksheets(Wst).Range(枠領域).Font.Size = 10


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

 最大文字数 = Len(txt)

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

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

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

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

 Next 文字位置

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


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

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

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

 If 漢字名 <> "" Then

 文字位置 = InStr(Worksheets(Est).Cells(読取行, 読取列).Value, _

 漢字名)

 If 文字位置 > 0 Then

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

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

 .Address(False, False), "1", "")

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

 Worksheets(Wst).Range(枠領域).Borders.LineStyle _

 = xlContinuous

 Worksheets(Wst).Range(枠領域).Value = ""


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

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

 If ふりがな名 <> "" Then

 ふりがな列 = 列番号 + 1

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

 .Address(False, False), "1", "")

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

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

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

 Worksheets(Wst).Range(枠領域).HorizontalAlignment _

 = -4131

 Worksheets(Wst).Range(枠領域).Orientation = -4166

 Worksheets(Wst).Range(枠領域).ShrinkToFit = True

 End If

 End If

 End If

 Next 漢字列

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

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

 Next 読取行

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


End Sub

 それでは、マクロ『シートから複数シート2』を実行してみます。


『9_他の複数シートを更新2.xlsm』
     _ 『漢字問題集』シート
Img9_4_14
『9_他の複数シートを更新2.xlsm』
     _ 『漢字解答集』シート
Img9_4_15

 『漢字入力帳』シートに用意した10問の漢字文字列が、

 出題漢字を空欄にした『漢字問題集』シートと、

 出題漢字をそのまま残した『漢字解答集』シートへ、

 書きこまれました。