【他のレンジ/シート/ブックを更新する】
1 他のレンジを更新
2 他のシートを更新
3 逆Z式並びで更新
4 複数シートを更新
5 他のブックを更新
6 他のブックをオープン・クローズ
7 新規ブックを作成し更新
マクロ『シートからシート4』では、『漢字入力帳』シートに用意した10問の漢字文字列を読みこみ、
『漢字学習帳』シートに漢字問題を、10列の横並びで書きこむという処理を実行しました。
次は、Excel VBA/マクロによって、『漢字入力帳』シートに用意した10問の漢字文字列を読みこみ、
『漢字学習帳』シートに漢字問題を、5列×2行の表並びで書きこむという処理を実行します。
問題番号の動きを図に表すと、次の図の水色の矢印のような動きになります。
セル(1行,10列) → セル(1行,8列) → セル(1行,6列) → セル(1行,4列) → セル(1行,2列)
→ セル(2行,10列) → セル(2行,8列) → セル(2行,6列) → セル(2行,4列) → セル(2行,2列)という
順番で、それぞれのセルに問題番号 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 を書きこみます。
『Z』を左右逆にしたような並び方なので、今後、この並び方を『逆Z式並び』と呼ぶことにします。
『逆Z式並び』で問題番号が書きこまれるセルアドレス・行・列の動きを表に表すと、
次の表のような動きになります。
マクロ『シートからシート4』をコピーして、マクロ『シートからシート5』とします。
マクロ『シートからシート4』では、『漢字入力帳』シートの最小行:『EMinRw』(2行目)から
最大行:『EMaxRw』(11行目)のループの中で、漢字問題作成処理の最初に、
先頭行に問題番号を読み書きするプログラムコードを追加しました。
今回は、Excel VBAによって、その問題番号を元に、5列×2行の逆Z式並びとなるように
書込問題番号行と書込列を算出しながら『漢字学習帳』シートに問題番号及び漢字問題を
書きこむプログラムコードを追加してみましょう。
では、宣言部を改修しましょう。
書込問題番号最小行『WMDNoMinRw』に『1』行目を設定して定数宣言
Const WMDNoMinRw = 1
書込最大列『WMaxCm』に『10』列目を設定して定数宣言
Const WMaxCm = 10
書込列数『WCmCnt』に『5』を設定して定数宣言
Const WCmCnt = 5
書込ステップ行『WStpRw』に『15』行を設定して定数宣言
Const WStpRw = 15
書込問題番号行『WMDNoRw』を長整数型として変数宣言
Dim WMDNoRw As Long とします。
【『シートからシート5』_ 宣言部】
そして、処理部を改修しましょう。
ここで、四則演算(加減乗除)などの算術計算を行うための記号『算術演算子』を紹介します。
Excel VBAで用意されている主な『算術演算子』を表にまとめると次のようになります。
足し算の『+』と引き算の『-』は、数学でつかう記号と同じでわかりやすいですが、
掛け算の『*』と割り算の『/』は、数学でつかう記号と違うので要注意です。
掛け算の『*』と割り算の『/』は、パソコンのキーボードに必ず割り当てられていて、
パソコン上の算術演算子の定番となっています。
Modは割り算の余りを返すという特殊な算術演算子ですが、割り算の余りによって
列が確定するようなときに便利な算術演算子です。詳しくは後ほど紹介します。
『漢字入力帳』シートの最小行:『EMinRw』(2行目)から最大行:『EMaxRw』(11行目)のループの中で、
漢字問題番号を取得し、その問題番号を元に5列×2行の表並びとなるように書込問題番号行と書込列を
算出しながら『漢字学習帳』シートに問題番号および漢字問題を書きこむプログラムコードを追加します。
問題番号が書きこまれる行と列の動きを表に表すと、次の表のような動きになります。
特に青の罫線で囲んだ問題番号と行及び列の動きに着目してください。
以下、『漢字入力帳』シートの最小行:『EMinRw』(2行目)から最大行:『EMaxRw』(11行目)の
ループの中にいるとイメージしてください。
問題を元に書込問題番号行を算出します。
問題と書込問題番号行の関係は次の表のようになります。
この表によると、問題番号が1から5までは行が1、問題番号が6から10までは行が16となっています。
つまり、問題番号が5の倍数になる毎に、行が15ずつ増加しているということです。
試しに、問題番号を5で割ってみます。
この問題番号÷5の整数部分を取り出します。
Excel VBAでは引数の整数部分を取得する関数として、Int関数が用意されています。
◇Int関数:引数の整数部分を取得
このInt関数をつかって問題番号÷5の整数部分を取り出したときの数値を表にします。
問題番号とInt(問題番号 / 5)を比較してみると、
問題番号1~4は同じ数値0、問題番号5~9は同じ数値1、となっています。
問題番号1~5は同じ数値として0、問題番号6~10は同じ数値として1、となれば、
改行が上手くいきます。
そこで、問題番号から1を引くことで、改行が上手くいくように調整します。
問題番号 – 1 を5で割ってInt関数をつかったときの数値を表にします。
問題番号1~5は同じ数値として0、問題番号6~10は同じ数値として1、となりました。
次は、問題番号1~5は同じ行として1、問題番号6~10は同じ行として16、
となるように調整していきます。
Int((問題番号 - 1) / 5)に対して書込ステップ行:15を掛けたときの数値を表にします。
問題番号1~5は同じ数値として0、問題番号6~10は同じ数値として15、となりました。
このInt((問題番号 - 1) / 5)×15の数値と行を比較してみると、
行が、Int((問題番号 - 1) / 5)×15より、1多くなっています。
そこで、Int((問題番号 - 1) / 5) * 15に1を加えることで、
行が正確な数値となるように調整します。
Int((問題番号 - 1) / 5) * 15に1を加えたときの数値を表にします。
問題番号1~5は同じ行として1、問題番号6~10は同じ行として16、となり、
Int((問題番号 - 1) / 5)×15 + 1 と 行 が、全て一致しました。
書込問題番号行の算出をプログラムコードにすると、
WMDNoRw = Int((MDNo - 1) / WCmCnt) * WStpRw + WMDNoMinRw
となります。
問題を元に書込列を算出します。問題と書込列の関係は次の表のようになります。
この表によると、
問題番号が1のときは、列が10、
問題番号が2のときは、列が8、
問題番号が3のときは、列が6、
問題番号が4のときは、列が4、
問題番号が5のときは、列が2、
問題番号が6のときは、列が10、
問題番号が7のときは、列が8、
問題番号が8のときは、列が6、
問題番号が9のときは、列が4、
問題番号が10のときは、列が2、となっています。
つまり、問題番号を5で割ったときの余りと列に関連性があるということです。
試しに、問題番号を5で割ったときの余りを計算してみます。
Excel VBAには、割り算の余りを返すという算術演算子として、Mod算術演算子が用意されています。
◇Mod算術演算子:割り算の余りを返す
このMod算術演算子をつかって問題番号÷5の余りを計算したときの数値を表にします。
問題番号と問題番号 Mod 5を比較してみると、
問題番号が1のときは、数値1、
問題番号が2のときは、数値2、
問題番号が3のときは、数値3、
問題番号が4のときは、数値4、
問題番号が5のときは、数値0、
問題番号が6のときは、数値1、
問題番号が7のときは、数値2、
問題番号が8のときは、数値3、
問題番号が9のときは、数値4、
問題番号が10のときは、数値0、となっています。
一方、
問題番号が1のときは、列が10、
問題番号が2のときは、列が8、
問題番号が3のときは、列が6、
問題番号が4のときは、列が4、
問題番号が5のときは、列が2、
問題番号が6のときは、列が10、
問題番号が7のときは、列が8、
問題番号が8のときは、列が6、
問題番号が9のときは、列が4、
問題番号が10のときは、列が2、となっています。
開始列は列:10であるため、列が10のときは数値が0となるようにしておきたいところです。
そこで、問題番号から1を引くことで、列が10のときは数値が0となるように調整します。
Mod算術演算子をつかって、問題番号 – 1 を5で割ったときの余りを表にします。
問題番号が1のときは、数値0、
問題番号が2のときは、数値1、
問題番号が3のときは、数値2、
問題番号が4のときは、数値3、
問題番号が5のときは、数値4、
問題番号が6のときは、数値0、
問題番号が7のときは、数値1、
問題番号が8のときは、数値2、
問題番号が9のときは、数値3、
問題番号が10のときは、数値4、となり、
列が10のときは数値が0となりました。
次は、
問題番号が1のときは、列が10、
問題番号が2のときは、列が8、
問題番号が3のときは、列が6、
問題番号が4のときは、列が4、
問題番号が5のときは、列が2、
問題番号が6のときは、列が10、
問題番号が7のときは、列が8、
問題番号が8のときは、列が6、
問題番号が9のときは、列が4、
問題番号が10のときは、列が2、となるように調整していきます。
書込最大列:10から、(問題番号 - 1) Mod 5に対して書込ステップ列:-2を掛けたものを引いた数値
を表にします。
問題番号が1のときは、数値10となり、列が10、
問題番号が2のときは、数値8となり、列が8、
問題番号が3のときは、数値6となり、列が6、
問題番号が4のときは、数値4となり、列が4、
問題番号が5のときは、数値2となり、列が2、
問題番号が6のときは、数値10となり、列が10、
問題番号が7のときは、数値8となり、列が8、
問題番号が8のときは、数値6となり、列が6、
問題番号が9のときは、数値4となり、列が4、
問題番号が10のときは、数値2となり、列が2、となり、
10 + (問題番号 - 1) Mod 5 * (- 2) と 列 が、全て一致しました。
書込列の算出をプログラムコードにすると、
WCm = WMaxCm + ((MDNo - 1) Mod WCmCnt) * WStpCm
となります。
以降、次のコードウィンドウの水色の枠のように、書込問題番号行:WMDNoRw、書込列:WCm、
書込サブ行:WSRw、枠領域:WKRngを更新しながら、その値によりセル位置を指定し、問題の更新、
1文字書き込み、枠の設定、ふりがなの更新を実行します。
【『シートからシート5』_ 処理部】
それでは、このマクロを実行してみましょう。
『漢字入力帳』シートに用意した10問の漢字文字列が、文字分割されて『漢字学習帳』シートに、
『逆Z式並び』で書きこまれました。
2023-03-19
2021-12-20
2021-12-12