読者です 読者をやめる 読者になる 読者になる

ふんわりした生活

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

子育てはおもしろすぎる

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

わが子もいよいよ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

satoyama-editorをマテリアルデザインにしたけど素朴すぎる

これがマテリアルデザインか

最近、数年ぶりにGoogleフォームをつかってみたのだが、マテリアルデザインになっていた。そこで、どんなものかGoogle謹製のCSSフレームワークを利用してみた。すると、ものすごくandroidっぽすぎる状態になった。なるほど、これがandroidのUIにも使われているからああいうデザインなのか、とうなずいた。

androidアプリを学んでみて、デザインのことが気になっていたものがある。以前作っていたsatoyama-editorだ。牧歌的な洗練されていないものを目指してつくっていたこともあるが、かなりのものになっていることは心のどこかで気になっていたところではあった。そこで、マテリアルデザインをあててみてはどうか?ということを今朝唐突に思いついたのでやってみることにしたのだった。

マテリアルデザイン

フラットデザインのさらに先、というか物理法則にしたがったデザインらしい。わたしはデザイナーでもないので「へー、そうなんだー」としか感じられなかったわけだが、見た目にすっきりしそうなので採用!ということにした。

軽く調べてみたところ、Googleの提供しているMaterial Design LiteというフレームワークのほかにMaterialize.cssというのもあるようで、数種類が存在しているようだった。今回はどうせそういったものに依存するならこだわりなし、ということで公式サイトをパッとみた感じでMaterialize.cssを採用してみた。 かなり修正が必要かな、と思いつつもざっくり直しにかかったところ、30分程度であらかた修正が完了した。もともとが込み入った構造をしていないものだからというのもある。

なお、MaterializeはjQueryに依存している。でも今回はjs部分にjQueryの必要性を全く感じなかったので読み込むのみにしてある。しかもソースコード内に入れておく必要もないだろーと思いすべてCDNからの読み込みとしている。

ついでに

フッター、ほんとうに必要かな?と考えてフッターも削除してやった。コピーライトとか書いておいたけど、いらない。全然いらなかった。なくなったらすげーすっきりしたし、気にせずガンガン書いていけるようになった。

こんな感じになった。 f:id:m0t0k1m0t0k1:20170327102639j:plain まだElectronアプリにはしていない。コードが散らかっているのでガンガン不要なものを削除してからコンパイルするつもり。