【他のレンジ/シート/ブックを更新する】
1 他のレンジを更新
2 他のシートを更新
3 逆Z式並びで更新
4 複数シートを更新
5 他のブックを更新
6 他のブックをオープン・クローズ
7 新規ブックを作成し更新
今回から、Excel VBA/マクロによって漢字学習アプリを作成します。
先ず、漢字入力帳のサンプルを次のように作成します。
漢字入力帳の仕様は、次の通りです。
(1) B列に問題文を横書きで記述します。
(2) C~F列に問題にしたい漢字を1文字ずつ記述します。
(3) G~J列に問題にしたい漢字のふりがなを1文字ずつ記述します。
(4) A列に番号を記述します。
次に、マクロを記述しますが、その仕様は次の通りです。
(1) 漢字入力帳の2~11行を順に読みとる。
(2) 漢字入力帳のB列に記述されている文を1文字ずつ分解しながら漢字学習帳に縦書きで書きこむ。
(3) 漢字入力帳のC~F列に記述されている漢字が漢字学習帳に書きこんだ文字の中にあれば、そこを空欄の
マスにして、併せてそのすぐ右側に、漢字入力帳のG~J列に記述されているふりがなを書きこむ。
マクロを実行すれば、次のような漢字学習帳が作成されます。
最初に、同一シート内で、漢字入力帳から、漢字学習帳を作成するマクロをつくってみます。
先ず、Excelの2行目、B列に記述されている文を1文字ずつ分解しながらL列に2行目から縦書きで
書きこんでみます。
以前つくったマクロ『指定行_1文字連続分解』を元に、マクロ『レンジからレンジ1』をつくります。
【マクロ『指定行_1文字連続分解』】
『指定行_1文字連続分解』のマクロをそのままコピーします。
ここで、このマクロをつかって、Excel VBAコードの構成を説明します。
Excel VBAコードは、大きく宣言部と処理部に分かれます。
宣言部には、変数や定数の宣言を記述します。
処理部には、代入文、ループ処理、条件分岐処理、
そして関数やプロパティの設定などの処理手順を記述します。
このように、宣言部と処理部と分けておくと、Excel VBAコードが記述しやすくなり、
また、Excel VBAコードが改修しやすくなります。
先ず、宣言部を改修します。
今回は、読込列がB列なので読込列:ECmを2、読込行が2行なので読込行:ERwを2とします。
書込列がL列なので書込列:WCmを12、書込行は変動するものなので書込行:WRwを長整数型の変数とします。
【『レンジからレンジ1』_ 宣言部】
次に、処理部を改修します。
書込行:WRwとMid関数の開始位置:StPとの関係は次のように記述します。
開始位置:StPが1のとき書込行:WRwは2行目、
開始位置:StPが2のとき書込行:WRwは3行目、
開始位置:StPが最大文字数のとき書込行:WRwは最大文字数+1行目なので、
WRw = StP + 1とします。
【『レンジからレンジ1』_ 処理部】
マクロを実行します。
Excelの2行目、B列に記述されている文が1文字ずつ分解されて、L列に2行目から縦書きで書きこまれました。
次は、ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルを空欄のマスにしてみます。
マクロ『レンジからレンジ1』を元にマクロ『レンジからレンジ2』をつくります。
【『レンジからレンジ1』】
『レンジからレンジ1』のマクロを全てコピーします。
先ず、宣言部を改修します。変数及び定数を追加します。
最大枠数『MaxWakuSu』に『4』個を設定して定数宣言
Const MaxWakuSu = 4
漢字最小列『MinCm_ENT』に『3』列目を設定して定数宣言
Const MinCm_ENT = 3
漢字最大列『MaxCm_ENT』に『6』列目を設定して定数宣言
Const MaxCm_ENT = 6
列英字名『AlphaCm』を文字列型として変数宣言
Dim AlphaCm As String
漢字列『KCm』を整数型として変数宣言
Dim KCm As Integer
漢字名『Kanzi』を文字列型として変数宣言
Dim Kanzi As String
文字位置数『MojiNo』を整数型として変数宣言
Dim MojiNo As Integer
書込サブ行『WSRw』を長整数型として変数宣言
Dim WSRw As Long
枠領域『WKRng』を文字列型として変数宣言
Dim WKRng As String
【『レンジからレンジ2』_ 宣言部】
そして、処理部を改修します。
ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルを空欄のマスにしてみます。
(1) 書込列12列目の列英字名を取得
AlphaCm = Replace(Cells(1, WCm).Address(False, False), "1", "")
(2) 書込行に初期値として1を代入
WRw = 1
(3) Excelの3列目から6列目までをループ処理で漢字列をカウントアップ
For KCm = MinCm_ENT To MaxCm_ENT
Next KCm
(4) 漢字名を取得
Kanzi = Cells(ERw, KCm).Value
(5) 漢字名が空白でないとき、
If Kanzi <> "" Then
End If
(6) 該当漢字の文字位置数を取得
MojiNo = InStr(Cells(ERw, ECm).Value, Kanzi)
(7) 該当漢字の文字位置数が0より大きいとき、
If MojiNo > 0 Then
End If
(8) 書込サブ行を書込行+文字位置数により算出
WSRw = WRw + MojiNo
(9) 枠領域を列英字名と書込サブ行の文字連結により算出
WKRng = AlphaCm & WSRw
(10) 枠領域を実線で囲む
Range(WKRng).Borders.LineStyle = xlContinuous
(11) 枠領域を空欄にする
Range(WKRng).Value = ""
【『レンジからレンジ2』_ 処理部】
このマクロを実行してみます。
ExcelのセルC2に記述されている漢字『書』があったセルL8が空欄のマスになりました。
次は、ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルのすぐ右側に、
G~J列に記述されているふりがなを書きこみます。
マクロ『レンジからレンジ2』を元にマクロ『レンジからレンジ3』をつくります。
『レンジからレンジ2』のマクロを全てコピーします。
先ず、宣言部を改修します。変数の宣言を追加します。
ふりがな書込列『FWCm』を整数型として変数宣言
Dim FWCm As Integer
ふりがな列『FCm』を整数型として変数宣言
Dim FCm As Integer
ふりがな名『Furigana』を文字列型として変数宣言
Dim Furigana As String
【『レンジからレンジ3』_ 宣言部】
そして、処理部を改修します。
ExcelのC~F列に記述されている漢字が文字列の中にあれば、該当セルのすぐ右側に、G~J列に
記述されているふりがなを書きこみます。
下記の青字のプログラムコードを追加します。
(1) 書込列12列目の列英字名を取得
AlphaCm = Replace(Cells(1, WCm).Address(False, False), "1", "")
(2) 書込行に初期値として1を代入
WRw = 1
ふりがな書込列を書込列+1により算出
FWCm = WCm + 1
(3) Excelの3列目から6列目までをループ処理で漢字列をカウントアップ
For KCm = MinCm_ENT To MaxCm_ENT
Next KCm
ふりがな列を漢字列+最大枠数により算出
FCm = KCm + MaxWakuSu
(4) 漢字名を取得
Kanzi = Cells(ERw, KCm).Value
(5) 漢字名が空白でなければ、
If Kanzi <> "" Then
End If
(6) 該当漢字の文字位置数を取得
MojiNo = InStr(Cells(ERw, ECm).Value, Kanzi)
ふりがな名を取得
Furigana = Cells(ERw, FCm).Value
(7) 該当漢字の文字位置数が0より大きければ、
If MojiNo > 0 Then
End If
ふりがなが空白でなければ
If Furigana <> "" Then
End If
(8) 書込サブ行を書込行+文字位置数により算出
WSRw = WRw + MojiNo
(9) 枠領域を列英字名と書込サブ行の文字連結により算出
WKRng = AlphaCm & WSRw
(10) 枠領域を実線で囲む
Range(WKRng).Borders.LineStyle = xlContinuous
(11) 枠領域を空欄にする
Range(WKRng).Value = ""
ふりがなの更新
Cells(WSRw, FWCm).Value = Furigana
【『レンジからレンジ3』_ 処理部】
このマクロを実行します。
「ExcelのセルG2に記述されている漢字『か』がセルM8に書きこまれました。
Excelの漢字入力帳のB列に記述されている文を1文字ずつ分解しながら、漢字学習帳に2行目から
縦書きで書きこみ、漢字入力帳のC~F列に記述されている漢字が漢字学習帳に書きこんだ文字の中にあれば、
当セルを空欄のマスにして、併せてそのすぐ右側に、漢字入力帳のG~J列に記述されているふりがなを書きこむ。
この一連の処理を、漢字入力帳の最小行から最大行までのループ処理で一気に実行し、L列からAD列まで
瞬時に書きこみます。
マクロ『レンジからレンジ3』を元にマクロ『レンジからレンジ4』をつくってみます。
『レンジからレンジ3』のマクロを全てコピーします。
先ず、宣言部を改修します。
読込最小行『EMinRw』に『2』行目を設定して定数宣言
Const EMinRw = 2
書込最小列『WMinCm』に『12』列目を設定して定数宣言
Const WMinCm = 12
書込ステップ列『WStpCm』に『2』列を設定して定数宣言
Const WStpCm = 2
読込行『ERw』を長整数型として変数宣言
Dim ERw As Long
読込最大行『EMaxRw』を長整数型として変数宣言
Dim EMaxRw As Long
書込列『WCm』を整数型として変数宣言
Dim WCm As Integer
【『レンジからレンジ4』_ 宣言部】
そして、処理部を改修します。
Excelの漢字入力帳のB列に記述されている文を1文字ずつ分解しながら、
漢字学習帳に2行目から縦書きで書きこみ、漢字入力帳のC~F列に記述されている漢字が
漢字学習帳に書きこんだ文字の中にあれば、該当セルを空欄のマスにして、
併せてそのすぐ右側に、漢字入力帳のG~J列に記述されているふりがなを書きこむ。
これは、マクロ『レンジからレンジ3』の処理部に記述されていることなので、
マクロ『レンジからレンジ3』の処理部がブロックとしてそのままつかえます。
マクロ『レンジからレンジ3』の処理部を【ブロックA】とします。
先ず、ExcelのB列の文字が入っているセルの最大行(X行目)を取得するプログラムコードを追加します。
EMaxRw = Range("B65536").End(xlUp).Row
それから、漢字入力帳の最小行:『EMinRw』(2行目)から最大行:『EMaxRw』(X行目)にかけて、
各行の処理【ブロックA】をループ処理で実行します。
そこで、【ブロックA】をはさむように、【ブロックA】の前後に
For ERw = EMinRw To EMaxRwと
Next ERwを追加します。
For ERw = EMinRw To EMaxRw
【ブロックA】
Next ERw
マクロ『レンジからレンジ3』までは書込列『WCm』が定数でしたが、
今回のマクロから書込列『WCm』が変数に変わっています。
そのため、書込列『WCm』のカウントアップが必要となります。
漢字入力帳の最小行から最大行までのループ処理の中で、
書込列『WCm』は行が1行増加するたびに、L列から2列ずつカウントアップしていきます。
そのため、漢字入力帳の最小行から最大行までのループ処理の中に、WCm = WCm + WStpCmを追加します。
更に、書込列『WCm』の初期値はL列(12列目)なので、そのループ処理の前に、WCm = WMinCmを
追加します。
EMaxRw = Range("B65536").End(xlUp).Row
WCm = WMinCm
For ERw = EMinRw To EMaxRw
【ブロックA】
WCm = WCm + WStpCm
Next ERw
【『レンジからレンジ4』_ 処理部】
このマクロを実行します。
ExcelのL列からAD列にかけて、漢字の書きこみ問題が作成されました。
2023-03-19
2021-12-20
2021-12-12