わが家では契約していたスマイルゼミの学習用タブレットを利用し、自作のタブレット教材で学習をしています。
詳細は下の2つの記事で紹介しています。幅広く知りたい方は1つ目の記事を見てください。
ゲームアプリ用から勉強用へ!使ってないタブレットを有効活用する
【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用
この記事で紹介するのは、2つ目の記事で解説している『くもんのタブレット教材の作り方』を半自動化するEXCELマクロです。
記事のなかで使う『イメージ(ActiveXコントロール)』があるということは、マクロを使える環境のはず。この記事の内容をご自身のPC環境(ディスプレイサイズやインストールされているアプリ)に合わせて数字を変えるだけで再現できるので試してください。
タブレット教材を自作:半自動化する作業について
【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用
上のリンク記事で紹介した手順は以下のとおりでした。
- 『教材作成用Excel』での作業
- スキャンした教材をスクリーンショットする
- 一旦ペイントに貼り付ける(あとでくもん過去問題の答えを消すため)
- ペイントから教材作成用Excelに画像として貼り付ける
- Excelで次に画像を貼り付けるポイントに移動
- ペイントに戻り、答えを消す
- 答えを消したものをペイントからExcelに貼り付ける
- Excelで次に画像を貼り付けるポイントに移動
- 教材を閲覧しているビューワーにもどり、ページを送る
- ①~⑧を必要分繰り返す
- 『解答用Excel』での作業
- Excelで全ての画像を選択する
- ペイントに貼り付けてJPEGで保存する
- 解答用Excelを立ち上げ、開発タブのイメージ(ActiveXコントロール)を使って、固定される(触れない)画像として挿入
- クラウドに解答用Excelをアップする
- タブレットで解答用Excelをダウンロードする
という流れです。この方法のメリットは、ペイントのウィンドウが1つで済むことです。(なぜこれがメリットになるかは、あとで記載します)
このうち、『教材作成用Excel』の作業の負担が大きいので自動化していきます。とはいえ、⑤のペイント上で答えを消すというのが手作業になるので、①~⑨を全自動化はできず半自動になります。
VBAマクロは半自動です。2つに分かれます。
下がその工程です。変わっている部分は緑マーカーの部分です。
- スキャンした教材をスクリーンショットする
- 新規ペイントに貼り付ける ※貼り付ける画像分のペイントウィンドウがたちあがってしまう
ウィンドウがごちゃごちゃして間違う可能性があるのがデメリットですね - ペイントからExcelに画像として貼り付ける
- Excelで次に画像を貼り付けるポイントに移動
- 動教材を閲覧しているビューワーにもどり、ページを送る
- ①~⑤を必要分繰り返す
※これで、答えがある方の教材を先に全部貼っていきます。 - 答えを消した解答用画像を貼り付ける位置に移動
ここまでがマクロその①です。マクロその②の前に、ペイントにいき答えを消す→Ctrl+A→Ctrl+Cをした上で、Excelに戻ります。
- Excelに解答用画像を貼り付ける
- Excelで次に画像を貼り付けるポイントに移動
1つ目の解答用画像の貼り付けが終わったら、答えを消したペイントを消し、次の問題が貼り付けられたペイントウィンドウを最前面にします。そのあと、答えを消す→Ctrl+A→Ctrl+Cをした上で、Excelに戻ります。⇒そしてマクロその②を発動 を繰り返します。
やりたいことを整理し終わったので、実際にコードと共に解説していきます。
VBAコードと解説
コード解説の前に、下の予備知識を見ておいてください。
貼り付け用のコードは下を展開して確認ください。
'『mouse event』コマンドを簡略がする為の宣言
' 先頭に入れておく
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Declare PtrSafe Sub mouse_event Lib "user32" ( _ ByVal dwFlags As Long, _ Optional ByVal dx As Long = 0, _ Optional ByVal dy As Long = 0, _ Optional ByVal dwDate As Long = 0, _ Optional ByVal dwExtraInfo As Long = 0 _
)
Sub test()
Application.Caption = "Kyozai"
'他ソフトを操作する '===①Edgeの操作=== AppActivate "Edge" Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 SetCursorPos 70, 280 '開始座標を設定。 mouse_event 2 '左クリックの動作(2で押し込み) mouse_event 4 '左クリックの動作(4で離す) Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機
'test2()呼び出し Dim num As String '繰り返し回数用の変数設置 num = 5 test2 num 'numの数字が[test2()]の()中に入る数字になる
'最後に解答用画像貼り付け位置に移動 Dim num2 As String num2 = num * -16 ActiveCell.Offset(-41, num2).Activate
End Sub
Sub test2(num) For counter = 1 To num 'この場合num=5になる '===②Snipping Toolの操作=== AppActivate "Snipping Tool" 'Snipping toolを最前面に Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 SendKeys "^(n)" 'Ctrl+Nで新規作成 '===③Edgeの操作=== Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 SetCursorPos 320, 150 '開始座標を設定。 mouse_event 2 '左クリックの動作(2で押し込み) SetCursorPos 1570, 1030 '終了座標を設定。 mouse_event 4 '左クリックの動作(4で離す) Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 '===④ペイントの操作=== Dim lngTaskID As Long lngTaskID = Shell("mspaint.exe", vbNormalFocus) '新規ペイント起動 Application.Wait Now + TimeValue("00:00:01") AppActivate lngTaskID 'ペイントを最前面に Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 SendKeys "^(v)", Wait 'Ctrl+Vで貼り付け SendKeys "^(+(x))", Wait 'Ctrl+Shitf+xで切り取り SendKeys "^(a)", Wait 'Ctrl+aで全て選択 SendKeys "^(c)", Wait 'Ctrl+cでコピー Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 '===Excelの操作=== AppActivate "Kyozai" Application.Wait Now + TimeSerial(0, 0, 1) ActiveSheet.Paste 'Ctrl+vと同じ Selection.Cut 'Ctrl+xと同じ ActiveSheet.Paste 'Ctrl+vと同じ ActiveCell.Offset(0, 16).Activate '次の貼り付け位置に移動 Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 '===①Edgeの操作=== AppActivate "Edge" Application.Wait Now + TimeSerial(0, 0, 1) '1秒待機 SetCursorPos 70, 280 '開始座標を設定。350はX軸 mouse_event 2 '左クリックの動作(2で押し込み) mouse_event 4 '左クリックの動作(4で離す) SendKeys "{RIGHT}" '次のページへ Application.Wait Now + TimeSerial(0, 0, 1) Next counter
End Sub
Sub tugi() ActiveSheet.Paste Selection.Cut ActiveSheet.Paste ActiveCell.Offset(0, 16).Activate
End Sub
この下以降は、コードと解説を併記します(画像が見にくい場合は、新しいタブで画像を開くなどしてください)
マクロその①はtest()と test2()に分けた方がやりやすい
test()で前準備+繰り返しマクロ(= test2())呼び出し+後処理という流れをつくり、test2()で繰り返すコマンドを作ることになります。
まずはtest()の解説

test2()の前半部

test2()の後半部

マクロその②は単純明快
こちらは先ほどのコピーとセル移動のコマンドだけです。

マクロで使ったコマンドの補足解説
[1] AppActivate “〇〇” について
AppActivate “〇〇” は〇〇で指定したアプリ・ソフトをActive化(最前面化)するコマンドで、他のアプリを操作する時には必須です。最前面にないとマウス操作やキーボード操作のコマンドが適用されないからです。
ExcelコマンドBOXでワンランク上のマクロ作成+他のソフトにコピーまでしてみる
上のリンク記事では『メモ帳アプリ』にデータを貼り付ける方法を紹介しました。
〇〇に当たる部分はCaptionと呼ばれ、『メモ帳アプリ』は”メモ帳”でOK。
本記事の例なら『Microsoft Edge』は”Edge”、『Snipping Tool』は”Snipping Tool”がCaptionです。
この様に分かりやすいCaptionなら良いのですが、Excelは”Excel”などの単純なCaptionでは反応しません。
Excelのファイルパスまで入れるとうまく動作することもありますが、わたしはCaptionを自分で名付けるという方法を取りました。それが Application.Caption コマンドです。
Application.Caption = “Kyozai” でCaptionを名付けしている
これで、このExcelファイルをActive化するには、Caption名 “kyozai” を指定すればOKになります。
もう1つ、
ペイントは教材の枚数分立ち上げる為、下の構文になっています。
Dim lngTaskID As Long
lngTaskID = Shell(“mspaint.exe”, vbNormalFocus) ‘新規ペイント起動
Application.Wait Now + TimeValue(“00:00:01”)
AppActivate lngTaskID ‘ペイントを最前面に
[2] マウス操作をするコマンド『SetCursorPos』 と『mouse_event』
ソフトによっては、
- キーボード操作が割り当てられないことがある(マウスやタッチパッドで操作するしかない)
- Active化してもマウスで1クリックしないと反応しない
- スクリーンショットはマウスのドラッグで範囲を決める
ということがあり、マウス操作が必要になる場合があり、よく使うコマンドは SetCursorPos とmouse_eventです。
SetCursorPos はカーソルの位置を指定するもので、座標を SetCursorPos 70, 280 の形で指定します。
mouse_event はあとに入力する引数(ひきすう)で操作が変わります。

下の構文は、座標(X:320~1570、Y:150~1030)の位置を左クリックしながらドラッグして離すことと同じです。
SetCursorPos 320, 150 ‘開始座標を設定。
mouse_event 2 ‘左クリックの動作(2で押し込み)
SetCursorPos 1570, 1030 ‘終了座標を設定。
mouse_event 4 ‘左クリックの動作(4で離す)
マウス操作には宣言文が必要
これをマクロの標準Moduleの先頭に書きます。
'『mouse event』コマンドを簡略がする為の宣言
' 先頭に入れておく
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Declare PtrSafe Sub mouse_event Lib "user32" ( _ ByVal dwFlags As Long, _ Optional ByVal dx As Long = 0, _ Optional ByVal dy As Long = 0, _ Optional ByVal dwDate As Long = 0, _ Optional ByVal dwExtraInfo As Long = 0 _
)
[3] キーボード操作 SendKeys
アプリ上で割り当てられているキーボード操作(例えば、右矢印で次のページなど)を指示するために SendKeys コマンドを使います。
SendKeys “□□”, [Wait指示] で表し、□□ にはキー操作、[Wait指示]にはFalse or True が入りますが、省略可能です。(勝手にFalseになる)基本はFalse=省略でよいです。
□□部に入れるものは
① アルファベットや数字はその文字を入れます。
②特殊キーは下の表を参照ください。

ソースはhttps://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/sendkeys-statement
③ショートカットでCtrl、Shift、Alt を合わせたい場合は、上表と組み合わせます。

- Ctrl + A ⇒ “^(a)”
- Shift + A ⇒ “+(a)”
- Alt + A ⇒ “%(a)”
- Alt → H → A と順に押す ⇒ “%ha”
- Ctrl + Shift + A ⇒ “^(+(a))” ※”^+a” でもいけそうでした。
[4] 操作を安定させる待機時間 Application.Wait
アプリ間を移動するので、待機時間を作る方が動作が安定します。待機時間を作るには下の構文を入れておきます。
- Application.Wait Now + TimeSerial(0, 0, 1) か
- Application.Wait Now + TimeValue(“00:00:01”)
⇒ともに1秒待機の意味
記事内で紹介した関連リンク
ゲームアプリ用から勉強用へ!使ってないタブレットを有効活用する
【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用
ExcelコマンドBOXでワンランク上のマクロ作成+他のソフトにコピーまでしてみる
最後まで見ていただき、ありがとうございます。