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

1 他のレンジを更新

2 他のシートを更新

3 逆Z式並びで更新

4 複数シートを更新

5 他のブックを更新

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

7 新規ブックを作成し更新

複数シートを更新

 今回は、Excel VBA/マクロによってあるシートのセルから複数シートのセルに文字を代入するマクロをつくってみます。



1. 複数シートを更新

 前回は、『漢字入力帳』シートからデータを読みとり、『漢字学習帳』シートへデータを書きこみました。

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

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

 そこで、その準備として、Excelマクロ有効ブック内に、『漢字入力帳』シートと

 『漢字学習帳A』・『漢字学習帳B』シートを作成しておきましょう。

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


『9_他の複数シートを更新1.xlsm』
『漢字入力帳』シート
Img9_3_11
『漢字学習帳A』シート
Img9_3_12
『漢字学習帳B』シート
Img9_3_13

 書込ワークシートとして『漢字学習帳A』シートと『漢字学習帳B』シートの

 どちらのワークシートに何を書き込むかを予め決めておく必要があります。

 書込ワークシートをどのシートにするかを決める方法は何通りもありますが、

 今回は、『漢字入力帳』シートのK列に書込ワークシート名を予め記入しておき、

 マクロ実行時に問題番号毎にそれを読みとることにします。

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


 では、宣言部を改修しましょう。

 定数・変数の宣言を追加します。

 書込ワークシート列『WSheetCm_ENT』に『11』列目を設定して定数宣言

 Const WSheetCm_ENT = 11

 書込ワークシート『WSheet』を文字列型として変数宣言

 Dim WSheet As String とします。


 【『シートから複数シート1』_ 宣言部】

Img9_3_21

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

 入力行のカウントアップのループの中で、『漢字入力帳』シートの11列(K列)の書込ワークシートを、

 変数『WSheet』に格納します。

 WSheet = Worksheets(ESheet).Cells(読取行, WSheetCm_ENT).Value を追加します。


 【『シートから複数シート1』_ 処理部】

Img9_3_22

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

『9_他の複数シートを更新1.xlsm』
     _ 『漢字学習帳A』シート
Img9_3_31
『9_他の複数シートを更新1.xlsm』
     _ 『漢字学習帳B』シート
Img9_3_32

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

 『漢字学習帳A』シートに1~5問、『漢字学習帳B』シートに6~10問が書きこまれました。



2. 問題シートと解答シートを更新

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

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

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

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

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

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

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

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

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


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

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

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

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


 では、宣言部を改修しましょう。

 書込ワークシート『WSheetMD』に『漢字問題集』を設定して定数宣言

 Const WSheetMD = "漢字問題集"

 書込ワークシート『WSheetKT』に『漢字解答集』を設定して定数宣言

 Const WSheetKT = "漢字解答集" とします。


 【『シートから複数シート2』_ 宣言部】

Img9_3_51

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

 【『シートから複数シート2』_ 処理部(1)】

Img9_3_52

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

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

 WSheet = WSheetMD を追加します。

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

 Worksheets(WSheet).Range(枠領域).Value = "" とします。


 【『シートから複数シート2』_ 処理部(2)】

Img9_3_53

 二つ目に、『漢字解答集』を作成します。

 最初に、書込ワークシート『WSheet』に定数『WSheetKT』

 つまり『漢字解答集』を格納します。

 WSheet = WSheetKT を追加します。

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

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

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

 'Worksheets(WSheet).Range(枠領域).Value = ""

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

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


 【『シートから複数シート2』_ 処理部(3)】

Img9_3_54

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

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

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

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

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

 書きこまれました。



3. 他のプロシージャを呼び出す

 前回のマクロ『シートから複数シート2』はすごく長いです。

 『漢字問題集』シートと『漢字解答集』シートを作成する処理(青の枠線内のコード)は、

 『出題漢字の空白化』の箇所を除けば全く同じです。

 『漢字問題集』シートと『漢字解答集』シートを作成する処理で共通する部分は、

 別のプロシージャに切り離すことができます。

 そして、その切り離したプロシージャを元のプロシージャから何度でも呼び出すことができます。

 そうすることで、長いマクロを非常に短くすることができます。

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

 『漢字問題集』シート、及び、『漢字解答集』シートへデータを書きこむために、

 元のプロシージャから共通部分を切り離して、

 元のプロシージャからそのプロシージャを2回呼び出すマクロをつくります。

 それを図に表すと次のようになります。

Img9_3_70

 そこで、その準備として、Excelマクロ有効ブック内に、『漢字入力帳』シートと

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

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

『9_他の複数シートを更新3.xlsm』
『漢字入力帳』シート
Img9_3_71
『漢字問題集』シート
Img9_3_72
『漢字解答集』シート
Img9_3_73

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

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

 元のプロシージャから共通部分を切り離して、

 元のプロシージャからそのプロシージャを2回呼び出すようにマクロのみ変更します。

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


 では、宣言部を改修しましょう。

 先ず、マクロ『シートから複数シート3』から、宣言部を切りとって、モジュールの最上部に貼り付けます。

Img9_3_74

 これで、宣言部が、サブプロシージャ『シートから複数シート3』から独立したことになりますが、

 このままでは二つ以上のプロシージャの間で変数及び定数を共有することができません。

 二つ以上のプロシージャの間で変数を共有できるようにするためには、

 変数宣言文字『Dim』を別の変数宣言文字に置き換える必要があります。

 変数宣言文字には次の図のような順序があります。

Img9_3_75

 このように、変数宣言文字は、Dim < Private < Publicの順に変数として使用できる範囲が

 広くなっていきます。

 変数宣言文字『Dim』はそのプロシージャ内だけでしか変数を使用できませんが、

 変数宣言文字『Private』または『Public』を使えば二つ以上のプロシージャの間で

 変数を共有できるようになります


 今回のマクロでは、変数宣言文字『Private』でも構わないのですが、

 変数宣言文字『Public』を使えばより確実に広範囲に変数を共有できるため、これからは、

 二つ以上のプロシージャの間で変数を共有できるようにするために『Public』を使うようにします。

 変数宣言文字『Dim』を、変数宣言文字『Public』に置き換えてみましょう。

Img9_3_76


 変数宣言文字『Public』は、定数宣言文字『Const』の前に付けることで、

 二つ以上のプロシージャの間で定数を共有できるようになります。

 変数宣言文字『Public』を、定数宣言文字『Const』の前に付けてみましょう。

Img9_3_77


 宣言部の改修は完了したのですが、ここで一つアドバイスをしておきます。

 モジュールの最上部に宣言部を記述するときは、

 先頭行に、『Option Explicit』ステートメントを入れるようにしましょう。

Img9_3_81

 この『Option Explicit』ステートメントは、モジュール内のすべての変数の明確な宣言を強制します。

 『Option Explicit』ステートメントを使用すると、

 既存の変数の名前を入力する場合の誤入力を避けることができます。

 これで、モジュール最上部の宣言部は次のようになりました。

 【宣言部】

Img9_3_82

 では、処理部を改修しましょう。

 サブプロシージャ『ワークシート更新』を新しくつくります。

 (1) サブプロシージャ『シートから複数シート3』のすぐ下に『ワークシート更新』という名前の

   サブプロシージャをつくります。

 (2) サブプロシージャ『シートから複数シート3』から、『漢字問題集』シートを作成する部分

   (青の枠線内のコード)を切りとって、サブプロシージャ『ワークシート更新』に貼り付けます。

 (3) サブプロシージャ『ワークシート更新』の中で、『出題漢字の空白化』の箇所(赤の枠線内のコード)を、

   書込ワークシートが『漢字問題集』のときのみ、『出題漢字の空白化』を実行するようにコードを書き換えます。

 If WSheet = WSheetMD Then

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

 End If


 【サブプロシージャ『ワークシート更新』】

Img9_3_84

 サブプロシージャ『シートから複数シート3』を改修します。

 (1) サブプロシージャ『シートから複数シート3』から、『漢字解答集』シートを作成する部分を削除します。

 (2) 書込ワークシートに『漢字問題集』を格納した後、サブプロシージャ『ワークシート更新』を呼び出し、

   『漢字問題集』シートを作成するように記述します。

 (3) 書込ワークシートに『漢字解答集』を格納した後、サブプロシージャ『ワークシート更新』を呼び出し、

   『漢字解答集』シートを作成するように記述します。


 あるサブプロシージャから別のサブプロシージャを呼び出すには、『Call』ステートメントを使用します。

Img9_3_85

 サブプロシージャ『ワークシート更新』を呼び出すときは、Call ワークシート更新とします。


 【サブプロシージャ『シートから複数シート3』】

Img9_3_86

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


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

 『漢字入力帳』シートに用意した10問の漢字文字列が、出題漢字を空欄にした『漢字問題集』シートと、

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


 長いプロシージャは、共通する部分を分離して、別のプロシージャに切り離すことができます。

 そして、その切り離したプロシージャを元のプロシージャから何度でも呼び出すことができます。

 そうすることで、長いマクロを非常に短くすることができます。




目 次

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

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

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

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

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

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

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

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


YouTube

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


ブログ