自分で作るタブレット教材を半自動化するEXCELマクロ紹介

半自動化マクロさむね

わが家では契約していたスマイルゼミの学習用タブレットを利用し、自作のタブレット教材で学習をしています。

詳細は下の2つの記事で紹介しています。幅広く知りたい方は1つ目の記事を見てください。

ゲームアプリ用から勉強用へ!使ってないタブレットを有効活用する

【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用

この記事で紹介するのは、2つ目の記事で解説している『くもんのタブレット教材の作り方』を半自動化するEXCELマクロです。

記事のなかで使う『イメージ(ActiveXコントロール)』があるということは、マクロを使える環境のはず。この記事の内容をご自身のPC環境(ディスプレイサイズやインストールされているアプリ)に合わせて数字を変えるだけで再現できるので試してください。


広告


タブレット教材を自作:半自動化する作業について

【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用

上のリンク記事で紹介した手順は以下のとおりでした。

  • 『教材作成用Excel』での作業
    1. スキャンした教材をスクリーンショットする
    2. 一旦ペイントに貼り付ける(あとでくもん過去問題の答えを消すため)
    3. ペイントから教材作成用Excelに画像として貼り付ける
    4. Excelで次に画像を貼り付けるポイントに移動
    5. ペイントに戻り、答えを消す
    6. 答えを消したものをペイントからExcelに貼り付ける
    7. Excelで次に画像を貼り付けるポイントに移動
    8. 教材を閲覧しているビューワーにもどり、ページを送る
    9. ①~⑧を必要分繰り返す


  • 『解答用Excel』での作業
    • Excelで全ての画像を選択する
    • ペイントに貼り付けてJPEGで保存する
    • 解答用Excelを立ち上げ、開発タブのイメージ(ActiveXコントロール)を使って、固定される(触れない)画像として挿入
    • クラウドに解答用Excelをアップする
    • タブレットで解答用Excelをダウンロードする

という流れです。この方法のメリットは、ペイントのウィンドウが1つで済むことです。(なぜこれがメリットになるかは、あとで記載します)


このうち、『教材作成用Excel』の作業の負担が大きいので自動化していきます。とはいえ、⑤のペイント上で答えを消すというのが手作業になるので、①~⑨を全自動化はできず半自動になります。

VBAマクロは半自動です。2つに分かれます。

下がその工程です。変わっている部分は緑マーカーの部分です。

『教材作成用Excel』での半自動作業:その①
  1. スキャンした教材をスクリーンショットする
  2. 新規ペイントに貼り付ける ※貼り付ける画像分のペイントウィンドウがたちあがってしまう
    ウィンドウがごちゃごちゃして間違う可能性があるのがデメリットですね
  3. ペイントからExcelに画像として貼り付ける
  4. Excelで次に画像を貼り付けるポイントに移動
  5. 動教材を閲覧しているビューワーにもどり、ページを送る
  6. ①~⑤を必要分繰り返す
    ※これで、答えがある方の教材を先に全部貼っていきます。
  7. 答えを消した解答用画像を貼り付ける位置に移動

ここまでがマクロその①です。マクロその②の前に、ペイントにいき答えを消す→Ctrl+A→Ctrl+Cをした上で、Excelに戻ります。

『教材作成用Excel』での半自動作業:その②
  1. Excelに解答用画像を貼り付ける
  2. Excelで次に画像を貼り付けるポイントに移動

1つ目の解答用画像の貼り付けが終わったら、答えを消したペイントを消し、次の問題が貼り付けられたペイントウィンドウを最前面にします。そのあと、答えを消す→Ctrl+A→Ctrl+Cをした上で、Excelに戻ります。⇒そしてマクロその②を発動 を繰り返します。

やりたいことを整理し終わったので、実際にコードと共に解説していきます。

[ad02]


VBAコードと解説

コード解説の前に、下の予備知識を見ておいてください。

このテクニックが必要になります。

アプリ間を移動しての作業になるので、【1】~【4】が必要になります。


【1】指定アプリをアクティブ化(最前面に持ってくる)するコマンド『AppActivate “〇〇”』

【2】Excel含め、アプリ上でマウス操作をするコマンド『SetCursorPos (X) , (Y) 』『mouse_event 2 / 4 』※マウス操作には宣言文が必要です。

キーボード操作宣言文

【3】アプリ上でキーボード操作をするコマンド『SendKeys』

【4】待機を入れる方がコマンド処理が安定するので『Application.Wait Now + TimeSerial(0, 0, 1) 』

詳しく見る方はこちらのセクションにジャンプしてください。


貼り付け用のコードは下を展開して確認ください。

マウス操作の宣言文
'『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()の解説

半自動マクロその①解説1


test2()の前半部

半自動マクロその①解説2


test2()の後半部

半自動マクロその①解説3

[ad05]
[ad02]



マクロその②は単純明快

こちらは先ほどのコピーとセル移動のコマンドだけです。

半自動マクロその②解説1


マクロで使ったコマンドの補足解説

[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クリックしないと反応しない
  • スクリーンショットはマウスのドラッグで範囲を決める

ということがあり、マウス操作が必要になる場合があり、よく使うコマンドは SetCursorPosmouse_eventです。


SetCursorPos はカーソルの位置を指定するもので、座標を SetCursorPos 70, 280 の形で指定します。

mouse_event はあとに入力する引数(ひきすう)で操作が変わります。

マウスイベント
mouse_event の引数表。おもに左クリックとなる『2』と『4』を使うことになる。

下の構文は、座標(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=省略でよいです。

□□部に入れるものは

① アルファベットや数字はその文字を入れます。

②特殊キーは下の表を参照ください。

SendKeysリスト1
Microsoftの公式ページのリストをアレンジしたもの。
ソースはhttps://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/sendkeys-statement


③ショートカットでCtrl、Shift、Alt を合わせたい場合は、上表と組み合わせます。

SendKeysリスト2
  • Ctrl + A ⇒ “^(a)”
  • Shift + A ⇒ “+(a)”
  • Alt + A ⇒ “%(a)”
  • Alt → H → A と順に押す ⇒ “%ha”
  • Ctrl + Shift + A ⇒ “^(+(a))”  ※”^+a” でもいけそうでした。


[ad06]
[ad02]

[4] 操作を安定させる待機時間 Application.Wait

アプリ間を移動するので、待機時間を作る方が動作が安定します。待機時間を作るには下の構文を入れておきます。

  • Application.Wait Now + TimeSerial(0, 0, 1) か
  • Application.Wait Now + TimeValue(“00:00:01”)
    ⇒ともに1秒待機の意味
とりあえず

うまく動作しなかった部分に入れて様子を見ます。


記事内で紹介した関連リンク

ゲームアプリ用から勉強用へ!使ってないタブレットを有効活用する

【くもんのタブレット学習化】スマイルゼミのタブレットを有効活用

ExcelコマンドBOXでワンランク上のマクロ作成+他のソフトにコピーまでしてみる

マクロが発動している確認動画


最後まで見ていただき、ありがとうございます。


広告


広告

広告