ふんわりした生活

本を読んだり仕事でやってみたことなどの日常から、ふんわりと気づきなどを書いていきます

これなら小学生でもAndroidアプリを開発できる!App Inventor2をつかってkindle fire用アプリを申請した話

こども向けにプログラミング教室のようなことをはじめようと考えてCode Studioのカリキュラムを実際にやっていっていたところ、おもしろいものを見つけた。どうやら5年以上前から存在していたようなのだが、いまさら知ったというところ。それが、App Inventorだ。

App Inventor

どうやら調べてみたところ、最初はGoogleが行っていたプロジェクトのようで、数年前にオープンソース化されているようだ。現在はMIT(マサチューセッツ工科大学)の方がメンテナンスしているらしい。MITと聞くとやはりScratch・・・と思うのだが、まぁだいたい同じような感じ。ビジュアルプログラミング環境で、ブロックを組み合わせてアプリを開発することができる。しかもエディタはブラウザ内にある。

ところが、Scratchとまったく異なるところがある。それは、これ単独でAndroidアプリを開発することができるという点だ。Code Studioにもブロックを組み合わせてJavaScriptを記述してアプリをつくることができるエディタがある。これはアプリの表示もブラウザ内で行われるのだが、こいつは違う。ブラウザからビルドをしてapkファイルを作成することもできる。コンパニオンアプリをスマホやパソコンに導入すれば、そのままデバッグも行うことができる。恐ろしい。Javaなんか必要なかったんだ!!!

とはいえ

もちろん当たり前だが、良いことばかりではない。見た目はあらかじめ用意された部品から選択するようになるので、デザイン的なカスタマイズ性は低い。できることもかなり限られているので、込み入ったアプリをつくるのはかえって難しい。それでも、手元に実機のAndroidがあれば自分で開発したアプリを自分のスマホタブレットで動作させてみることが比較的かんたんにできるというのは夢があっていいな。

Androidアプリにビルドできるというので、いまこのエントリを書いているHTMLベースのsatoyama-editorをアプリにしてみようと考えた。実に浅はかな考えではある。だが、以前からモバイルのOperaでは音声の再生がうまくいかないという問題があったうえ、いくらElectronアプリにしてもタブレット内で動作するわけではない。そういうことで、このApp Inventorがどの程度つかえそうなものなのか遊んでみようと思い、実際にアプリにしてみた。 f:id:m0t0k1m0t0k1:20170405133158p:plain

アプリをつくる

App Inventorは現在バージョン2のようだ。ブラウザベースで動作する。最初はGoogleアカウントでログイン認証が発生するので、Googleアカウントを持っていないこどもには少々ハードルが高い。やってみるならお父さんお母さんのGoogleアカウントでログインするようになるだろう。

MIT App Inventor | Explore MIT App Inventor

このページの「Create apps!」というボタンらしきものをクリックするとエディタが登場する。なお、以下が今回つくった「Satonaka Editor」のプロジェクトである。 f:id:m0t0k1m0t0k1:20170405132843j:plain ご覧いただくとお分かりのように、画面左側に部品の一覧があり、中央がデザイナー、左がプロジェクトの内容をツリー上に見ることができるビューア、そして部品ごとのプロパティ画面というようになっている。古来より利用されているVisualBasicなどの開発環境に慣れた方なら「はいはい」というように部品をデザイナーへもっていっていろいろすることができる。

部品がそろったら、いよいよコードだ。コードは先ほども言ったようにビジュアルプログラミングすることができる。対象となる部品を一覧からクリックすると、それに関するイベント、プロパティやメソッドが配置されたブロック一覧が表示される。

f:id:m0t0k1m0t0k1:20170405133010j:plain あとはこれをエディタ部分へドラッグ&ドロップすればコードを書いていくことができる。なお、以下が今回のコード。ブロックがやたらたくさん見えるのでごちゃごちゃしているが、今回は関数定義などを試してみていないのでちらかっているということと、変数が面白いのでということがある。 f:id:m0t0k1m0t0k1:20170405132907j:plain 変数の何が面白いかというと、Scratchとは異なる考え方でつくられているということだ。Scratchでも現在のブラウザベースで動作するバージョン2からはスコープが明示できるようになった。しかし、どれがそうなのかといったことは見た目にわかりにくい。App Inventorでは見た目がごちゃごちゃしそうなところなのに、あえて変わったアプローチをとったようだ。

f:id:m0t0k1m0t0k1:20170405132924j:plain 何が違うのか?それはスコープ、変数の存在範囲がブロックの形状ではっきり視認できるというところだ。変数を宣言すると、そこから変数が作成される。そのとき、何をあらかじめセットしておくかを明示的にブロックで表現できるだけでなく、この変数がいつまで使えるのかということも囲まれている範囲で見てわかるというところが面白い。

最初は「は?どういうこと??」と感じたわけだが、わかれば「なるほど・・・」とうなずくばかり。こういう考え方もある。

便利な部品

アプリをつくってみると、ほんとうにちょっとした細かいことができない。クリップボードへテキストボックス内のテキストをコピーしたりはできない。テキスト内の部分を選択することもできない。このあたりの操作はユーザーにゆだねられている。キータイプしたイベントは発生しないため、タイマーで常時監視させるという方式を採用せざるを得ないなど、「そういう感じになるかー」といったところ。

ただ、便利なものもある。たとえば、TinyDBという部品。これは目に見えない部品なのだけど、利用することができる。satoyama-editorではブラウザのローカルストレージを利用してテキストを保存したり、アプリ起動時に保存されている内容を呼び出したりしていた。これとほぼ同様のことをデータベース操作なしで利用することができる。どうやっているのかまでは調査していないが、使い勝手はどう見てもローカルストレージと同じに見える。なお、TinyDBのWeb版もある。おそらくクラウドストレージという感じに変わるだけであろう。これはこれでデバイス間を同期するような場合には便利だろう。

このほか、センサーも利用することができる部品がたくさんある。タイマーはこのセンサーのグループに所属している。カメラ機能もメディアのグループ内に写真を撮るもの、ビデオを撮るものが用意されている。音声認識の部品もある。もちろんボイスレコーダーもつくることができる。

ちょっと恐ろしいがコンタクトやEメール、電話番号にもアクセスできる。Twitterには専用の部品も用意されている。さらに、レゴマインドストーム用の部品もあるので、androidバイスマインドストームに接続して操作するということもできるようになっている。

もちろんウェブへの接続やBluetooth接続も可能なようだ。実験的なものとしてFireBaseデータベースも利用できる。ここまできたら本格的な機能をもったアプリも開発しようと思えばできる。細かな操作は難しいとしてもだ。 f:id:m0t0k1m0t0k1:20170405133023j:plain

そして申請へ

はじめてモバイルデバイス用のアプリ申請をしたのだが、まさかそれがkindle用になるとは夢にも思わなかった。しかもそれはJavaで書いたものではなくて興味本位で手を出したApp Inventorをつかったものだったとは。申請は明日までかかるような見込みだと表示されているが、あんなになにもできないアプリにそんなに審査がかかるものなのか、よくわからないところではある。

便利なのはapkさえアップしてやればkindleでも動作するのか簡易チェックしてくれるというところ。アプリ内課金などGooglePlayに関するような操作は一切しないので、簡易チェックがOKになるのは当たり前といえば当たり前なのだが。

おススメはしないが、野良apkを動作するようにリスキーな設定をしておけば別にストアにアップしなくても大丈夫。USBなどなんらかの方法で送り込むことができれば動かしてみることはたやすい。しかしそれにしてもモバイルアプリはデスクトップアプリに比べてかなりの数になっているはずなのだが、あえてガンガンつくっていこうという気持ちにはあまりなれなかった。こんなに簡単なのに。

審査が通ったらまたここにエントリしようと思うが、落ちたら落ちたエントリでも書くかな。

小学生からはじめるわくわくプログラミング2

小学生からはじめるわくわくプログラミング2

親子で楽しく学ぶ! マインクラフトプログラミング (ぼうけんキッズ)

親子で楽しく学ぶ! マインクラフトプログラミング (ぼうけんキッズ)

子育てはおもしろすぎる

子育てなどと言ってもよいのかわからないが。

わが子もいよいよMBP(mac book pro)がほしくなるような年頃になったようだ。ふざけやがって<(^o^)> iMovieは以前からiOS版もmac版も使いこなしはじめていたが、とうとうGarageBandにも手を出した。ループを組み合わせてガンガンと動画のBGM用のトラックをつくりはじめている。しかも、つくり方がわたしのようなオヤジとは違う。MIDI世代は死んだほうがいいのかもしれない。

ひとつのプロジェクトファイルにいくつもそして同じテンポでしかもまったく異なる雰囲気のトラックをつくっているのだ。 各トラックの間には数小節ごと空けられていて、自分なりの区切りなんだろう。もはやわけがわからない。ひとつのファイルに画像やテキスト、スライドなどをいくつもつくったりすることはあるが、音楽でもそれをやってしまうのかと思ったら自分のアタマの固いこと・・・と悲しくなった。

どれもちょっとした操作を一度見せただけだが、自分の興味が強い分野ではガンガンに吸収していく。いつのまにかiMovieでもアフレコをしてみたり過激に動画をくっつけたり切り離したりして見せ場をつくろうという雰囲気が見て取れる。音楽でも関係のないジャンル、グループに分けられたループを混ぜる実験を繰り返しているので、すぐにさまざまなことができるようになるだろう。ほんとうに軽々とやってのけていくのは逆に清々しい。もっと無邪気に仕事もしたほうがいいんだろうな。

勉強はどうも不純な動機がないと気が進まないようだが、こうしたものは気が進みやすいのならもっと上手に活用したいところだ。

なお、わが子がやっているような状態でそのままmp3などへ書き出しをすると、おかしなことが起きるわけだが、きっとそこもiMovieで編集するときに都合のようように無理やり合わせるのだろう。結果が面白そうなので、もう少し様子を見てみることにする。

GarageBandマスターブック  OS X Mavericks&iOS 7対応 (Mac Fan Books)

GarageBandマスターブック OS X Mavericks&iOS 7対応 (Mac Fan Books)

いちばんやさしいiMovie入門

いちばんやさしいiMovie入門

UWSCが意外とおもしろい

予想外に書きやすいシンプルなつくりで、おもしろいなーと使ってみているUWSCですが、ほんとうにシンプルです。過去によくWindowsパソコン上で無人操作をやっていることがあったのですが(サーバーの情報を定期的にダウンロード、加工してメール納品するとか)、こういった内容ならWSHよりもずっと書きやすいかもしれないです。

PHPのように多数そろえられたビルトイン関数、ウィンドウ操作をかなり柔軟に利用できるうえに、コマンドプロンプトPowerShellとも連携できます。さらにCOMやDLLまで利用できるので、はっきり言ってVBAを使う必然性ってほとんどなくなります。もしあるとしたら、VBEを使いたい、というときくらいです。今回はしょうもないサンプルを提示しますが、WSHだけでこれを数分で書くのは相当難しいはずです。というか、無理かも。

dim voices[] = ""
recostate(true)
voice = dictate()
repeat
    resize(voices, length(voices))
    voices[length(voices) -1] = voice
    voice = dictate()
until voice = "終わり"
dim f = fopen("voice.txt", f_write)
fput(f, trim(join(voices,"<#cr>")))
fclose(f)
print "the end."

このサンプルは何かというと、音声認識で入力したテキストを「終わり」というまで蓄積してテキストファイルに保存するというものです。ちょっとしたメモをするときに実行しておけば声だけでメモが取れますよね。

個人的にもっとも気に入っているところはファイルの入出力だったりするかもしれません。込み入ったものでなければFOPEN関数などでサクッと開いて、FPUT関数で書き込みです。読み込みたいときはFGET関数です。WSHだとファイル入出力をするにはFileSystemObjectというオブジェクト経由でしか読み書きできません。設計が美しすぎて、かえって面倒というものです。もちろん、FileSystemObjectをつかうと結構いろんなことができるのですが、上記のようなしょうもないツールだとわざわざ使うのが面倒すぎるわけです。

特徴

特徴的なものとして、制御構文の条件分岐でしょうか。IFとIFBという2種類があります。VS Code用の拡張でキーワード登録していくときに「なんだこれ?」と思ったのですが、どうやら数値が条件に入るときはIFBで、そうでなければIFでよいようです。いまいち使い分けがわからないですが、サンプルを見ているとそういう使い分けのようです。

余談ですが、VS Code Extensionを0.0.2にしてスニペット追加と大文字小文字を無視してハイライトできるようにしてます。。 相変わらず全然機能が不足しているので、もっと便利にしたいところですが。

marketplace.visualstudio.com

ほかに、THREADというキーワードがあって、これで関数名を渡すとその関数を別スレッド実行してくれるというものです。自動化のためのツールということもあってか、便利に使えるようになっているようです。それから、連想配列をつくるにはHASHTBLキーワードをつけるだけというラクチンさ。Scripting.Dictionaryだったっけ、をつかってオブジェクトを利用する必要がありません。

例外処理がついているのも面白いのですが、TRY - ENDTRYです。ただ、これは例外が発生した時と何があっても最終的に実行されるブロックがあるものと別々の構文になっているようです。JavaC#VB.netのように混ぜて記述することができないようです。そのせいか、サンプルでも例外をキャッチするブロックをさらにFINALLYがあるTRYブロックで囲むという不思議な書き方にしてあります。さらに、このFINALLYはその前のTRYブロック内でEXITしたとしても必ず実行されるようです。本当に必ず実行してほしい(ファイルを閉じるとか)ものはここへ書いたほうがいいですね。

また、MODULEというモジュール化の機構も備わっていますが、なぜかCLASSの別名でもあってオブジェクト指向的なクラスとは異なります。モジュールとしてまとめるので、どちらかというと名前空間という雰囲気です。そういうこともあってインスタンス化はできません。また継承やインターフェースもありません。モジュールは一階層のみ対応のようで、ネストした次のようなものはNGのようです。

MODULE aaa
    MODULE bbb
        FUNCTION ccc()
        FEND
    ENDMODULE
ENDMODULE

モジュール内に定義した変数は外側からはアクセスできないようになっているので、それっぽいことはできます。もちろんインスタンス化できないのでコンストラクタ、デストラクタもありません。またVBAであるようなプロパティもつくることはできません。

Windows特化型の強み

このUWSCというツールはWindowsでの動作のみサポートしています。WindowsAPIをふんだんに利用して開発されているのでしょう。おかげで現在のバージョンではSENSOR関数を利用してセンサーの情報を利用したスクリプトをつくることもできるようになっています。

http://www.uwsc.info/sample.html#N66

もちろん既存のWMIを利用したスクリプトや、PowerShellを経由した.Net Frameworkの利用、ネイティブDLLの利用も思いのままです。こんなにできて大丈夫なんだろうか?と思ってしまうところです。ある程度はWindowsUACが防いでくれるので、OFFにしていなければ大丈夫だと思いますが。WSHPowerShellのように標準インストールされていたら悪意のあるソフトウェアを量産し放題ですね。恐ろしい。

なお、有償のPro版になるとフォームを利用できるようになったりExcelLibreOfficeも含む)を操作する関数が利用できるようになるようですが、フォームだけなら.NetをPowerShellから使えば利用できます。ちょっと面倒ではありますが。それに、XAMLも用意すればフォームではないウィンドウアプリをつくることもできるので、可能性は結構あります。

UWSCに関する書籍は紙のものが1種類だけ存在しているようです。非常にマニアックだったということですね。興味のある方は使ってみてはいかがでしょうか。

Windows マクロテクニック

Windows マクロテクニック

古来より伝わるUWSCなる自動化ツールに驚いて構文ハイライト用のVSCode拡張もつくった

ずっとWindowsで作業の自動化なんかをやるとしたら、Officeスイートに付属しているVBAWSH、あるいはPowerShellくらいのものだと思い込んでいた。そこまで来たら、VB.netでもさらっと書いてvbcでコンパイルしたほうがいいやと思っていたところだった。

以前からクラウドワークスなんかの募集で見かけていた「UWSC」というのが気になって調べてみたところ、これがかなりのものだった。 勢いでご紹介したい。

UWSC

どうやらわたしが知らなかっただけで、かなり昔から存在している自動化ツールのようだ。 おもしろいのは、マクロのように操作を記録して(むかしVectorとか窓の杜にあったような気がしなくはないが)スクリプトにすることができるという点だ。有償バージョンだと実行形式にもすることができるらしい。

UWSC

無償版のほうはダウンロードしてきたら解凍して実行形式をダブルクリックするだけでつかうことができる。インストールが不要でWindows10でも動作するというのは素晴らしい。さらに、サンプルが公開されていて自動クリックなどの無人操作はもちろんFireFoxChromeといったブラウザの操作もすることができる。恐ろしいことに、COMやDLLについても利用できるということなので、そりゃこれでいろんなこと考える方もいるよね・・・と思った次第。

サンプル

見た感じはVBAに似ている。変数宣言は無理にする必要はなく、代入したら使うことができる。動画用に棒読みするスクリプトを書いてみたのだが、割と面白かった。

const speakerfile = "C:\Users\hoge\Desktop\speak.txt"
try
    fid = fopen(speakerfile)
    try
      for line = 1 to fget(fid, -1)
        comment = fget(fid, line)
        if length(trim(comment)) = 0 then
          sleep(2)
        else
          speak(comment)
        endif
      next
    except
      print try_errmsg
    endtry
finally
  fclose(fid)
endtry

なんとなくイメージがつきそうなものだ。一行目はデスクトップにある読み上げ用のテキストファイルパスを定数として宣言している。次からはファイル操作でエラーが発生したときのために必ずファイルを閉じるようにする「try - finally」ブロックだ。ここはVBAに比べてもかなりいい。VB.netになるまでtry - catch -finallyは使えなかったので。

ファイルの操作もCっぽいというかrubyっぽいというか。上記のスクリプトでは空行があったら一呼吸ついてもらうために2秒のスリープを入れている。棒読みしてもらうのはSPEAK関数に文字列を渡すだけ。ものすごく便利。

これだと例外処理が面倒かつできることが限定されているVBSを使ったり、新たに文法を覚えなおす必要のあるPowerShellを利用することなく自動化を図ることができるということだ。素晴らしすぎる。ただ、どう考えても日本でしか使われていない。サクラエディタなど、日本でつかわれている有名どころのテキストエディタだと、構文ハイライトできるものを公開している方がいらっしゃるようだ。

覚えることも非常に少なそうなので、データベースをつかったり大量にデータをさばく必要がある、という用途でなければExcelを起動するよりこれを使ったほうがいいかもしれない。

VS Code Extensionをつくってみた

感動のあまり、いろいろ書いてみようと思ったのだけどVisual Studio Codeにはハイライトできるものがなさそうだった。それにどんな関数があるのかも調べたかったので、ヘルプを見ながらVS Code用の拡張をつくってみた。公式のヘルプだと関数などはすべて大文字で記述されているが、どうも大文字小文字の区別はないようなので小文字オンリーと手抜きになっている。

marketplace.visualstudio.com

以前にもマークダウン用に文字数をカウントする拡張を自作したことがあったが、構文ハイライトだけならJSONファイルを編集するだけという簡単さから自作のモチベーションは機能的なものよりずっと高まりやすいということもわかった。

また、Yeomanによるジェネレータのおかげで編集すべきファイルはたったの2ファイルしかなかったことも驚いた。簡単。公開も死ぬほど簡単だったので、もっときちんと作ればよかったと後悔している。

f:id:m0t0k1m0t0k1:20170328163006j:plain

かなり柔軟かつ高機能なUWSC

個人的にうれしい誤算だったのは、UWSC標準でPowerShell連携をサポートしているというところだ。TextBlockで複数行テキストを作成して、この中にPowerShellスクリプトを記述することができる。すると…恐ろしいことにPowerShellスクリプトを実行することができる。

実行ポリシーとかなにそれ?というところではある。ただ、どういう実行の仕方をしているのかわからないがプロファイルは読み込まれている。プロファイルが邪魔になるケースでは回避の方法がなさそうだ。以下はGet-ChildItemコマンドレットで現在のフォルダ内にあるアイテムの数を出力するサンプル。ps1というテキストブロック変数の文字列をPowerShell関数で実行しているものだ。

print powershell(ps1)

textblock ps1
$a = ls
$a.Count
endtextblock

なお、別のUWSCスクリプト(*.uws)を読み込んでつかうこともできるようなので機能で分割することもできる。プロシージャ、関数、クラス定義などにも対応している(クラスは実体化することはできないので、なでしこっぽい?)。

Pro版では実行形式ファイルにすることができたり、フォームの生成やExcelを関数から操作することができたりするようだ。当面は無償版でいろいろいじってみたい。

もしも3日間のうちにVBAでツールをつくれるようにしなければならないとしたら

何を教えるべきか、というお話です。イメージするとしたら、月曜日から教えはじめて木曜日、金曜日で最初のツールをひとつ完成させるという感じ。 もうこれ以上、メンテナンスできないクソマクロを増やさないで!!と強く願う方もいらっしゃると思いますが、ここはそういうことを置いておこうと思います。ごめんなさい。

実際のところ、勘の良い方であれば3日もかからないと思います。簡易的な電卓みたいなものならプログラミング初心者でも同じくらいでつくることができるのではないかと思います。ですが、正直言ってVBAは覚えることが多すぎると思っています。だから覚えるだけで一苦労、なんだよ構文エラーって・・・さらに配布後のメンテナンスも非常に面倒です。

WordやPowerPointだと、見た目を制御するためにはそこそこコードを書く必要があります。ExcelAccessはデータの塊を表現したソフトウェアなので、軽く数行のコードだけで動くものができてしまう、というところが長所であり短所でもあります。とかなんとかダラダラと書いていくのもアレですので、もしも3日間でつくれるようにしなければならないとしたらというお話に移ります。

初日

まずはどのOfficeソフトウェアを選択するか、というところから始まります。ですが、ここはもちろんExcel一択です。たいていの場合、WordやPowerPointを自動化したいと思うことは少ないでしょう。なんらかのデータが大量にあるいは高頻度で存在していて、「この山をどうにかさばきたい」というのがモチベーションであることが多いはずです。ですからExcelを使います。古いVistaくらいのPC(もうすぐサポート終了ですね)でも国内大手メーカーさんのものだとPersonal Edition(WordとExcelだけ入っている)というOfficeがプリインストールされていたと思います。

1時間目

ということでExcelを起動してもらうことになるのですが、次にやるのはVBEの起動です。Visual Basic Editorですね。AltキーとファンクションキーF11を同時に押すことで起動してきます。そうしたらざっくりと画面の説明をします。画面左上のプロジェクトエクスプローラ、その下のプロパティダイアログ、画面中央のエディタ領域、その下のイミディエイトウィンドウです。それぞれの役割を簡単に説明したら、次は動かしてみるためにサブプロシージャの大枠だけ書いてもらいます。こんな感じに。

Sub macro()

End Sub

ここはサブプロシージャの名前以外ほとんど自動で書いてくれることを体感してもらって、なんだ、大したことねぇな、ビビらせやがってと思ってもらうのが第一です。そうしたら次はMsgBox関数をつかってメッセージダイアログを表示させてもらいます。ここで苦手意識が発生しないように注意します。そうしないと、このあとの説明が大いに時間を要することになるうえ、理解も進まなくなるためです。

MsgBox関数で何かを表示させることができたら、続いてDebug.Printメソッドでイミディエイトウィンドウに何かを表示させます。マクロが動作しているときにどんなことが起きているか、を知ろうとすることになるので軽く説明しておきます。いわゆるHello World的なものですね。

2時間目

たいていの企業では、この2時間目を初日に確保するのは非常に困難だと思われます。というのも、ただでさえ時間外労働を強いられるのにこんな時間を確保できるとは考えにくいからです。ですが、ここでは確保できたとして話を進めます。そうしないと話が進まないので…

この時間では、構文そのものを学んでもらうのではなくあらかじめ用意した形をコピペしてもらうようにします。たとえば、データをいったんどこかへ置いておきたい!となったら変数の出番です。しかしどのように宣言すべきか?という説明をしていたのでは時間が足りません。そこで、これをコピペして名前だけ変えようというようにします。ひどいですね。

Dim 変数名

データ型はどうした!?と驚く方もいらっしゃるかと思いますが、最初はあまり厳密にせずに完成できるようになるところまでを説明して身に着けてもらいます。そのため、そうしたこともこの時点では省略していきます。JavaScriptPHPrubyでもデータ型は明示してない(もしくはできない)ことが多いですよね。

これらコピペを駆使してなんとか1から10までをイミディエイトウィンドウに出力したり、3の倍数のときだけ別のものをイミディエイトウィンドウに出力したりするところまでいきます。パーツを組み合わせるイメージです。

3時間目

もはやここまでくると、かなり教育熱心な企業でしか耐えられないかもしれません。大手企業の新入社員教育とかでなければ確保できないかな?3時間目では2時間目までの「コピペ駆使」を使って、演習をします。2時間目にやったものと同じサブプロシージャを名前を変更して自分で写経して実行するとか、コード中に「10」とか数値を直接書いてあるところをほかの数値に変えてみるとかです。

正直言うと、この演習の時間が取れるかどうかでつくれるようになるかどうかが決まるでしょう。コピペでも一度以上、その組み合わせに出会っていなければすぐにその組み合わせをして問題を解決しようということになりません。結果として時間ばかりが過ぎていくことになります。そこで、この演習では組み合わせを変えてみたり条件を変えてみて何度も繰り返し実行することがポイントになります。

Sub macro()
  Dim count
  For count = 1 To 10
      Debug.Print count
  Next
End Sub

こういう断片でも動くものを形を変えて何度もやると、「条件をわけるときはこう」「くり返すときはこう」というのが見えてきます。

二日目

二日目になると、2つのことをできるようになる必要があります。それは、

  1. シートからデータを取り出す、セットする
  2. ブックを開く、保存する

ここもコピペでパーツを組み合わせる練習を繰り返します。これらを行うために避けて通れないことが、オブジェクトを変数に格納することです。

Dim sheet
Set sheet = ThisWorkbook.Worksheets(1)

このあたりでどれがオブジェクトの変数なのかわからなくなってくると思うので、データ型についてよく使うものを中心に説明します。最低でも次のものだけ練習しておくといいでしょう。

  • Integer
  • Long
  • String
  • Double
  • Workbook
  • Worksheet
  • Range

そのほか、Withをつかってオブジェクトを操作することにも慣れておくといいでしょう。あまり高速でないイメージが勝手にありますが、オブジェクトをひとまとめに操作できるので便利かつわかりやすいですね。

With ThisWorkbook.Worksheets(1)
    .Name = "nalulabo"
    .Range("A1").Value = "1234"
End With

さらに、オブジェクト変数の「Empty」と「Nothing」「Null」についても理解が難しいので軽く押さえておくと後が楽になります。違いとしてはざっくり説明すると次のとおりです。

説明
Empty オブジェクト変数になにも詰め込まれていない状態
Nothing 「何もない」を表す特殊なオブジェクト
Null データのある場所がゼロ番地

Setステートメントを使っていない、宣言しただけのものはEmptyの状態になります。状態をチェックするには「IsEmpty」関数を使います。Nothingが詰め込まれているかどうかは変数がNothingかどうかを「Is」ステートメントで確認します。Nullかどうかは「IsNull」関数を使います。それぞれ値なのか、状態なのか、変数データのある場所なのかということで違っているので混乱しやすいですね。

Public Sub macro()
    Dim aaa
    Set aaa = Nothing
    If IsEmpty(aaa) Then
        Debug.Print "empty"
    ElseIf IsNull(aaa) Then
        Debug.Print "null"
    ElseIf aaa Is Nothing Then
        Debug.Print "nothing"
    End If        
End Sub

なお、オブジェクト変数にNullが詰め込まれるにはSetステートメントを使わずにVariant型の変数へ代入するしかないので、EmptyかNothingかをチェックすると十分でしょう。

1時間目

シートの操作を簡単に説明する時間にあてます。シートの特定の仕方を4種類説明することから始めます。シートは(1)Worksheetsコレクション(Excelを見ながらタブを示して)を順番に探す方法、(2)アクティブになっているシートを使う方法、(3)シートオブジェクトを利用して特定する方法、(4)Worksheetsコレクションからシート名で特定する方法です。

それぞれ一長一短ありますのでざっくりとだけ説明します。

No. 方法 メリット デメリット
1 Worksheetsコレクションから順番で 操作対象が左から何番目かわかれば簡単 シートの並びが変わると対象が変わってしまう
2 アクティブになっているシートで ActiveSheetオブジェクトでサクッと利用できる 選択されたシートが変わると対象が変わってしまう
3 シートオブジェクトで 狙ったシートを直接利用できる 新規追加したものはオブジェクト名がわからない
4 Worksheetsコレクションからシート名で シート名がわかれば直感的 シート名が変更されると見つけることができない

どのように操作したいかで方法を選択するとよいでしょう。

また、セルの参照方法としてはRangeオブジェクトのみになります。Cellsコレクションなどを使っても結果的にRangeオブジェクトが返されるのでRangeオブジェクトをつかうと間違いないです。また、省略できる標準プロパティというのがあって「.Value」を省略していることがありますが、ややこしいので省略しないほうがクソマクロになりにくいでしょう。

2時間目

2時間目はブック操作です。別のブックを開く、新規でブックを作成する、ブックの変更を破棄して閉じる、ブックを保存するといったところです。ブックは開いたり新規に追加するとWorkbookオブジェクトが返されるので、オブジェクト変数へ詰め込むかWithステートメントブロックで操作するようになります。Withのほうが便利ですが、どうしてもほかのブックも同時に操作する必要があることもケースとしてはあります。そのため、ブックもオブジェクト変数へ詰めておいたほうがわかりやすくなります。混乱するとブックもコードもぐちゃぐちゃになりますので。

ブックの変更を破棄して閉じるには、ブックのCloseメソッドにFalseを渡すと実現できます。つけない場合はファイル保存ダイアログが表示されるので、逆に確認してほしい場合はFalseを渡さないようにします。

ブックの保存はブックのSaveメソッドを使います。ほかにもCSVなど形式を指定して保存するSaveAsメソッドもありますので、PDFをつくって遊んでみるとよいでしょう。また、すでに同じ名前のブックがファイルとして存在するかどうかなどについても、ここでさらりと説明しておくといいですね。

3時間目

ここまで学習した内容をつかっていろいろ遊んでみるという演習をするとよいでしょう。質問を受け付けてセルの背景色を塗ったりフォントサイズを変えたり枠線をつけたりといったこともやってみると、より複雑な操作をすることができるようになります。また、複数のセルをもつある範囲から一気にデータだけを取り出す方法として配列を紹介してもいいですね。表の形にデータを整形してやることでワークシートとマクロの間で高速にデータのやりとりができるということも体験するといいでしょう。

このほか、セルやセルの範囲に名前を定義する(Excelのほうの)説明をすると、Rangeが非常に便利になることも説明できるとなおよいですね。行や列を頻繁に追加削除しても名前をつけておくと(名前を付けた範囲が削除されなければ、ですが)セル位置ではなく名前で参照できるようになります。

三日目

いよいよ最終日です。てんこ盛りに詰め込んだので完全に消化不良だと思いますが、ここからは応用というかツールとして完成させることができるようになるための仕上げの話です。

マクロの実行をユーザーにどのように開始してもらうか、これを決める必要があります。方法はいろいろあるのですが、よくあるのはExcelの図形オブジェクトをペタッと貼ってマクロを登録するとかでしょう。こうした内容を簡単に説明して演習を行っていきます。 もしもアプリのようなフォームが必要である場合はフォームの説明をすることになりますが、ちょっとした操作にそこまでの準備が必要かどうかで後日の学習にするかを考えるとよいです。

だいたい、このあたりまで来ると書籍やウェブの情報を元に自分で学習していくことができるようになっているはずです。ここからは独学でもよいでしょう。

これは教えないのか、教えなくていいのか

3日間で3時間ずつしか確保できないとして、最低限だけを説明していくと上記のような感じになるのですが、それじゃあクソマクロ量産体制に入るだけだろうということはあるでしょう。たとえばスクリプトの分割です。1つのサブプロシージャで長々と書いていくと、自分でも読みづらくなります。他人はさらに読めない状況になります。そうしたときに分割が必要になります。しかし、最初から分割を意識させてしまうとプログラマでもない方には混乱のもとですので、そこは考えずに走り抜けてもらうことにするということです。ひととおり動くようになったあと、コードを読み返してもらい、意味のあるまとまりとしてコメントを入れていくと分割の仕方がわかりやすいのではないでしょうか。

このほか、関数もそうですね。サブプロシージャは値を返すことができませんが、関数は値を返すことができます。これまた使い方というか用途が理解できなければ混乱のもとなので避けました。クラス定義もそうです。

さらにテキストファイルの読み書きも普通のプログラミングでは学習しますが、Officeスイートを利用するという時点で対象もOfficeのことが多いです。そこでテキストファイルは独学の範囲にすることにしました。プログラマの方は3日間のどこかで学んだほうがいいですよ!もうひとつ、COMの利用もあります。プログラマの方は学習必須になると思いますが、こちらも同じ理由で除外しました。

もっと基本的なこととして、定数はどうした、というのもあるでしょう。あとから値を変更することができないものなので、コード中に直接書いてしまっている数値などはこれにするべきですよね。これはある程度の演習をしてからのほうが、定数という機能の効果をより理解できてよいと考えるます。もしどこかへ入れるとしたら三日目の演習時がよいでしょう。

おススメの書籍とかないのか

私自身もExcelマクロの入門書を電子書籍で出版しているのですが、正直申し上げておススメしたい書籍はありません。というのも、どれを買ってもらっても書いてあることはおおよそ同じだからです。よってもし購入を考えているのであれば、次のことを念頭に置いていただくと選びやすいと思います。

  1. 簡単なところから順番にやりたいか
  2. 辞書のように逆引きして「やりたいこと」から学びたいか
  3. 特定のある機能だけ学びたいか

もし上記1であれば、ブルーバックスだったかで出版されている入門書がよいでしょう。ほんとうに簡単なところから説明されているので、少しずつ時間をかけて学ぶにはとてもよいはずです。逆に上記2のように「何かしらつくりたいもの」があって、それをつくるために必要な事柄から、どうやって書いていけばよいかを学ぶのであれば逆引き辞典のような書籍を選ぶとよいです。また上記3のように、すでに何かつくったことがあって、その経験を補足・補強する目的であればVBAでは書籍を選ぶ必要はありません。MSDNなどMicrosoft社が公開しているドキュメントをお読みになるべきです。

最後に

思いのほか長文になってしまったことを深く反省しております。VBAは非常に便利でパワフルなツールです。おかげでPowerShellがイマイチ伸び悩んでいるような気がしなくはありません。

もしVBAのようにドキュメントと一緒になってしまって管理しにくいのが嫌だ!ということであればPowerShellはおススメです。 いろんなもの(プログラミング言語やツール)のキメラっぽいものですが、VBAを覚えてからであれば使い勝手の良いツールになると思います。

わたしはマクロよりもテキストファイルで動作するVBScriptのほうが好みで、10年以上前からそっちでばかりツールを書いていました。あまり画面があることにこだわっていなかったからかもしれません。VBScriptも昔はマルウェア用のツールというイメージもあったと思いますが、いまはPowerShellがその担当をしてくれています。VBSネタもまたエントリしてみようかな。

こんなのもあります。

note.mu