Excelで作るお手本付き漢字練習シート

Excelマクロ漢字練習シートを作りました。練習したい文字をテキストファイルにしておけば、それらの文字を使った練習シートができます。定数を変更すれば、文字の大きさも変えられます。

字を練習したくなった

先日、何の気なしYouTubeを見ていると、中国の人がボールペンで信じられないくらい綺麗な文字を書いていました。

ボールペンでは、均一の線しか書けないイメージがありましたが、その動画では、筆で書いたような「打ち込み」「とめ」「はね」「はらい」がなされていました。

しばらく時間を忘れて見入ってしまいました。

綺麗な文字を書く人は、何人もいました。ただ、そのような人の中にも、マス目に十字を引いた練習用紙を使っている人がいました。さらに、白紙に自由に文字を書くのではなく、お手本を忠実に見て真似をして書いている人もいました。

字がうまくなるのに終わりはなさそうです。
そこで、急に自分もボールペン字を練習したくなりました

Excelのマクロで漢字練習シートを自作することにした

毛筆の小筆であれば、写経が適切な字の練習になると思います。もしかすると、ボールペン字でもいいお手本として使えるかもしれません。でも、恐れ多いし、そもそも、同じ文字が多いんですよね。それに、練習用紙を買っても、途中で飽きてしまうともったいないし。

ということで、漢字練習シートをExcelのマクロで自作することにしました。
そうすれば、練習する文字を自由に選べるし、フォントを選べば、好きな字体で練習できます。サイズの調整も思いのままです。

漢字練習シートを作成するマクロ

早速、マクロを示します。

使い方の手順は次の通りです。Excelに「開発」タブが出てこない場合は、こちらの記事を参考に、「開発」タブを出してください。

  1. メモ帳などのテキストエディタで、練習したい文字からなるテキストファイル(例:練習用文字.txt)を作る
  2. Excelで、空白のブックを新規に作成する
  3. F12キーを押して、ファイル名の欄に「漢字練習シート」等の好きな名前を入力する
  4. ファイルの種類から「Excel マクロ有効ブック(*.xlsm)」を選び、保存する
  5. 「開発」タブ→「Visual Basic」をクリック
  6. プロジェクトエクスプローラ(無ければCtrl-R)で、手順3.で命名したファイル名を選び、右クリックして、「挿入」→「標準モジュール」
  7. 以下のコードを標準モジュールにコピー&ペーストする
  8. 「開発」タブ→「マクロ」→「MakeAPracticeSheet」をクリック→「実行」
Option Explicit
'-----------------------------------------------------------------------
' Summary: サイズ等を決めるための定数
'-----------------------------------------------------------------------
Private Const cstSquareSize         As Integer = 70         ' マス目サイズ[pixcel]
Private Const cstNumberOfColumns    As Long = 8             ' 行あたりの文字数
Private Const cstFont               As String = "MS 明朝" ' フォント
Private Const cstFontSize           As Integer = 24         ' フォントサイズ
Private Const cstUTF8               As Boolean = False      ' False → Shift-JIS

'-----------------------------------------------------------------------
' Summary: 列番号を列名に変換する
' Input  : 列番号
' Returns: 列名
'-----------------------------------------------------------------------
Public Function ColumnName(ByVal lng As Long) As String
    '
    ColumnName = ""
    On Error Resume Next
    ColumnName = Split(Cells(1, lng).Address, "$")(1)
End Function

'-----------------------------------------------------------------------
' Summary: お手本付き漢字練習シートを作成する
'-----------------------------------------------------------------------
Public Sub MakeAPracticeSheet()
    Dim strMsg As String    ' 表示用メッセージ
    ' ─── 漢字文字列の入ったテキストファイルのPathを選択する ───
    ' ファイル選択用のフィルタをセットする
    Dim fd As FileDialog    ' FileDialogオブジェクト
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    ' FileDialogでテキストファイルのPathを選択する
    Dim strFile As String   ' テキストファイルのPath
    With fd
        ' テキストファイル選択用のフィルタをセット
        .Filters.Add "テキストファイル", "*.txt"
        ' 単一ファイル選択
        .AllowMultiSelect = False
        ' ボタンが押された時の処理
        If .Show = True Then
            ' ファイルのPathを変数にセットする
            strFile = .SelectedItems(1)
        End If
    End With
    ' FileDialogオブジェクトの解放
    Set fd = Nothing
    ' エラーチェック
    If strFile = "" Then
        strMsg = "ファイルが選択されませんでした"
        Exit Sub
    End If
    
    ' ─── フラグに基づいてUTF-8又はShift-JISでテキストを読み込む ───
    Dim strCharacters As String ' ファイルから読み出した文字列
    ' ADODB.Streamオブジェクトを作成
    With CreateObject("ADODB.Stream")
        If cstUTF8 = True Then
            ' UTF-8で読み込む場合
            .Charset = "UTF-8"
        Else
            ' Shift-JISで読み込む場合
            .Charset = "shift_jis"
        End If
        ' ファイルを開く
        .Open
        ' 読み込み元のファイルのPathを指定する
        .LoadFromFile strFile
        ' 一括読み込み
        strCharacters = .ReadText
        ' ファイルを閉じる
        .Close
    End With

    ' ─── 漢字練習シートを作成する ───
    ' 新たにシートを作成する
    Sheets.Add Before:=ActiveSheet
    ' ページのセットアップ
    With ActiveSheet.PageSetup
        .Orientation = xlLandscape      ' 横向きで印刷
        .LeftMargin = 10 / 25.4 * 72    ' 左マージンを10mm
        .RightMargin = 10 / 25.4 * 72   ' 右マージンを10mm
        .TopMargin = 20 / 25.4 * 72     ' 上マージンを20mm
        .BottomMargin = 10 / 25.4 * 72  ' 下マージンを10mm
        .CenterHorizontally = True      ' 水平方向はページ中央揃え
    End With
    ' マス目を作るため、全セルを選択
    Cells.Select
    ' 列幅を調整
    Selection.ColumnWidth = (cstSquareSize / 2 - 7) / 10
    ' 行幅を調整
    Selection.RowHeight = cstSquareSize * 0.6 / 2
    ' 列方向に罫線を引く
    Dim j As Long   ' ループ変数
    ' 2列毎に処理
    For j = 1 To cstNumberOfColumns * 2
        ' 2列選択
        Columns(ColumnName(j * 2 - 1) & ":" & ColumnName(j * 2)).Select
        ' 左側にやや太線を引く
        Selection.Borders(xlEdgeLeft).Weight = xlThin
        ' 右側にやや太線を引く
        Selection.Borders(xlEdgeRight).Weight = xlThin
        ' 中の罫線は細線
        Selection.Borders(xlInsideVertical).Weight = xlHairline
    Next j
    
    ' お手本を当てはめていく
    Dim i As Long   ' 行方向の制御変数
    Dim k As Long   ' 文字選択用の制御変数
    i = 1   ' 1行目から開始する
    k = 0   ' 文字選択用の制御変数をリセットする
    ' 無限ループ
    Do
        ' 2行分のレンジを選択
        Range(ColumnName(1) & (i * 2 - 1) & ":" & _
                ColumnName(cstNumberOfColumns * 4) & (i * 2)).Select
        ' 上端にやや太線を引く
        Selection.Borders(xlEdgeTop).Weight = xlThin
        ' 下端にやや太線を引く
        Selection.Borders(xlEdgeBottom).Weight = xlThin
        ' 中の罫線は細線
        Selection.Borders(xlInsideHorizontal).Weight = xlHairline
        ' 列方向に2列ずつ移動しながら1文字ずつ処理する
        For j = 1 To cstNumberOfColumns * 2 - 1 Step 2
            ' 文字選択用の制御変数をインクリメント
            k = k + 1
            ' 文字を全て処理しているようであれば無限ループを出る
            If k > Len(strCharacters) Then Exit Do
            ' 田の字型の4マスをお手本用のマスとして選ぶ
            Dim rng As Range
            Set rng = Range(ColumnName(j * 2 - 1) & (i * 2 - 1))
            ' 4マスにぴったりはまるテキストボックスを作る
            ActiveSheet.Shapes.AddTextbox( _
                    msoTextOrientationHorizontal, rng.Left, rng.Top, _
                    cstSquareSize * 0.6, cstSquareSize * 0.6).Select
            ' テキストボックスの塗りつぶしを無くす
            Selection.ShapeRange.Fill.Visible = msoFalse
            ' テキストボックスの枠を消す
            Selection.ShapeRange.Line.Visible = msoFalse
            ' テキストボックスの文字に対する処理
            With Selection.ShapeRange.TextFrame2
                ' 1文字入力する
                .TextRange.Characters.Text = Mid(strCharacters, k, 1)
                ' 上下中央揃え
                .VerticalAnchor = msoAnchorMiddle
                ' 左右中央揃え
                .TextRange.ParagraphFormat.Alignment = msoAlignCenter
                ' フォントサイズをセット
                .TextRange.Font.Size = cstFontSize
            End With
            ' フォントをセット
            With Selection.ShapeRange.TextFrame2.TextRange.Font
                .NameComplexScript = cstFont
                .NameFarEast = cstFont
                .Name = cstFont
            End With
        Next j
        ' 行方向の制御変数のインクリメント
        i = i + 1
    Loop

PostHandler:
    If strMsg <> "" Then
        ' メッセージがあれば、エラーとして表示
        Call MsgBox(strMsg, vbOKOnly + vbCritical, "MakeAPracticeSheet")
    Else
        ' メッセージがなければ正常終了表示
        Call MsgBox("正常終了しました", vbOKOnly + vbInformation, "MakeAPracticeSheet")
    End If
End Sub

微調整

マクロ中にある、以下5項目を変更することにより、自分好みのシートに変更できます。

Private Const cstSquareSize As Integer = 70 ‘ マス目サイズ[pixcel]
Private Const cstNumberOfColumns As Long = 8 ‘ 行あたりの文字数
Private Const cstFont As String = “MS 明朝” ‘ フォント
Private Const cstFontSize As Integer = 24 ‘ フォントサイズ
Private Const cstUTF8 As Boolean = False ‘ False → Shift-JIS

cstSquareSizeは、マス目のサイズをピクセル単位で設定します。70ピクセルだと、1文字分のマス目のサイズが15mm×15mmくらいになります。

cstNumberOfColumnsは、1行あたりの文字数を指定します。例示してある8だと、お手本が8文字、自分の練習分が8文字の計16文字で一行となります。
印刷プレビュー等を用いて、横幅が印刷の範囲を超えないようにしてください。

cstFontは、フォントを指定します。Excelのブックを改めて開いて任意の文字を打ち、フォントをいろいろに変え、気に入ったフォントが見つかったら、そのフォント名をコピー&ペーストしてください。

cstFontSizeは、フォントのサイズを指定します。マス目の中でバランスが良く、自分の練習しやすいサイズを入力してください。

cstUTF8テキストファイルの文字コードを指定します。普通にメモ帳で作成すると、Shift-JIS(メモ帳ではANSI)で保存されます。しかし、「塡」「剝」「頰」は、常用漢字にありながら、Shift-JISでは表現できません。これらの文字を扱うには、テキストファイルをUTF-8で保存し、マクロのcstUTF8をTrueとすることで取り扱うことができるようになります。なお、常用漢字の「」は、この方法で扱うことができませんでした。どなたか、扱い方をご存じの方は教えてください。

実際に使ってみた

お手本付き漢字練習シート使用例

お手本付き漢字練習シート使用例

常用漢字から成るテキストファイルを作成してプリンタでA4のコピー用紙に印刷し、数文字書いてみました。

赤い字は、今はもう売られていない、PILOT V CORN C<耐水性 顔料>(ボールペン)で書きました。その下の字は、あかしや新毛筆(筆ペン)、最後は、三菱Uniの4B(鉛筆)で書きました。なぜか、緊張して手が震え、「扱」は、3度書きくらいしてしまいました(笑)

V CORNは僕の技術では、打ち込みがきれいに作れませんでした。
どんな種類のボールペンなら「打ち込み」「とめ」「はね」「はらい」がうまくできるのでしょうか?今度、文房具店に行く機会があったら、書き比べてみたいと思います。

漢字練習シートの使い勝手は悪くはありませんでした。ただ、文字をもう少し大きく印刷しても良かったかもしれません。

まとめ

Excelのマクロで漢字練習シートを作りました。
サイズやフォントなどを好みに合わせてお使いください。

コメント

タイトルとURLをコピーしました