t-hom’s diary

主にVBAネタを扱っているブログです。

業務マニュアルを作る際に重要な3つのポイント

今回は業務マニュアルを作る際に重要な3つのポイントを紹介する。

私が重要だと思うポイントは、指示の明確さ、メンテナンス性、読みやすさの3点である。
以下にそれぞれ詳しく解説する。

指示の明確さ

業務マニュアルは作業者に対し、何をすればよいのか明確に伝える必要がある。
これまで見てきた指示文のスタイルはおおむね3パターンある。

行為名で終わるパターン

以下の例では「行為名」で終わっているためコンパクトにまとまるが、状況によって勘違いの元になる。

1) ○○の設定変更
2) ○○をクリック
3) サーバーの再起動

たとえば、手順2で○○をクリックしたことで自動的に再起動されるにも関わらず上記のような表記になっていると、作業者への指示が不明瞭ということになる。

動詞で終わるパターン

以下の例では「動詞」で終わっているためややコンパクトにまとまるが、こちらも状況によって勘違いの元になる。

1) ○○の設定を変更する
2) ○○をクリックする
3) サーバーを再起動する

上の例はシンプルなので間違えようがないと思うが、たとえば登場人物が複数になり、システムによって処理される項目も含まれてくると、作業者への指示と、そうでないものを混同してしまうこともあるかもしれない。

指示で終わるパターン

以下の例では「指示」で終わっているため文が長くなるが、作業者への指示であることが明確だ。

1) ○○の設定を変更してください。
2) ○○をクリックしてください。
3) サーバーを再起動してください。

これが一番確実に伝わると思うので、私が今後作るものは指示終わりで統一しようかと思っている。

メンテナンス性

マニュアルは業務の変化に合わせて常に最新に保たれなければならないが、メンテナンス性が悪いと更新が億劫になる。
特に普段自分ひとりで対応している業務はマニュアルを見なくてもできてしまうため、マニュアルの更新を後回しにしたり、更新するつもりで失念してしまうことだってある。
しかしいざ自分が休んだとき、引き継いだ方が古いマニュアルを参照してしまうとミスオペの元になるのでこれは大変危険。

更新が億劫にならないよう、メンテナンス性の高いマニュアル作りが重要だと思う。

最近気づいたのだが、メンテナンス性を高めるために一番重要なのは、「凝らない」ということだと思う。
基本的にはWordのスタイル機能を活用してテンプレートを作ってしまい、あとはテンプレート任せにしてしまうのが楽だ。

【参考】スタイル機能については以下のページで簡単に紹介した。
Wordの真価 - You.Activate

メンテナンス性についてはWordのテクニックなども関係してくるので後日別途記事を書くつもりである。

読みやすさ

読みやすさにも色々な観点があり、ここでは閲覧性・一覧性・本文の読みやすさについて紹介する。

閲覧性

欲しい情報にすばやく辿りつけること。
見出しを正しく設定することでナビゲーションバーからアクセスできたり、見出しを目だたせたり表現をわかりやすく工夫することで知りたい情報を見つけやすくする。

一覧性

見渡しの良さのこと。手順数に比べてページ数を使いすぎると、延々とページめくりさせられるようなマニュアルになり、一覧性が下がる。
一覧性を下げる大きな要因は、説明のための画像である。不要な箇所をトリミングしたり、全体の一部を拡大するような表現でコンパクトにすると一覧性があがる。

悪例) 縦幅が大きく、一覧性を下げるスクリーンショット
この例では全体を収めようとしているため必要部分が小さくて見づらいというデメリットもある。
f:id:t-hom:20170628032434p:plain

改善例 1) 不要部分をトリミング
トリミングは画像を選択した際に表示される「図ツール」タブから行える。
ついでに少し大きくリサイズして見やすくした。
f:id:t-hom:20170628032605p:plain

改善例 2) 全体を小さく見せつつ、必要部分だけズーム
ズーム画像はクイックスタイルで影をつけて前面に浮かせたような表現にする。
ズームの台形の作り方は、四角形を配置して右クリックし、頂点の編集を行い、枠線を消して塗りつぶしをグラデーションにする。
ズーム方向に色が薄くなるグラデーションにすると色の拡散でズームが表現できる。
f:id:t-hom:20170628032947p:plain

本文の読みやすさ

本文の読みやすさは、フォント、行間、行幅、書式で決まる。

フォントについて

印刷する場合、本文は明朝、見出しはゴシックにするのが基本。また強調したい単語もゴシックにする。
また、日本語の場合は等幅フォント、英語は文字によって幅が変わるプロポーショナルフォントが基本。
※ちなみにMS明朝は等幅、MS P 明朝はプロポーショナル。

ただしMS明朝・MSゴシックはドットの粗が目立つので、主に画面で見る場合はメイリオが読みやすい。メイリオプロポーショナルフォントだが日本語でもそれほど字詰まりを感じない。

f:id:t-hom:20170628035952p:plain

Wordでメイリオを使う際の注意点は以下参照。
thom.hateblo.jp

本文のフォントサイズはユニバーサルデザインを考慮して12ポイントがおススメ。
※職場の年齢層によっては14ポイントくらいあっても良いかもしれない。

行間について

行間が詰まりすぎたり、広すぎたりすると読みづらくなる。文字サイズの0.5~0.8倍くらいが良いと思う。

【参考】
文章の作り方|伝わるデザイン

行幅について

行幅は1行あたりの文字数で決まる。
狭すぎるても広すぎても読みづらいので、35~40文字程度がおススメ。

書式について

赤字・太字・下線を多用するとゴテゴテするのでよろしくない。
thom.hateblo.jp

市販の書籍をイメージしてマニュアルを作る

私は業務マニュアルを作る際、市販の書籍をイメージする。
小説などはあまり参考にならないので、プログラミングの学習書やHow To本など、何かを解説している書籍を参考にすると良い。

市販の書籍はプロの編集者がフィルターになっている為、非常に読みやすい。
強調表現であるゴシック体や太字がどういう箇所にどのくらいの割合で使われているか、一行あたりの文字数はどれくらいか、文字サイズに比べて行間のサイズはどうか、見出しの階層はどれくらい深いかなど、読みやすい文書のスタイルは市販の出版物から学べる。

ただし、何を真似るかは適切に取捨選択すること。
市販の書籍は売るために手間をかけて工夫を凝らすが、業務マニュアルにおいてその手間がメンテナンス性の低下につながるようではいけない。
マニュアル作成は凝りだすとキリがないので、その工夫はオペレーションミスを減らすのか、それともただの自己満足なのかよく自問したい。

書籍紹介

業務システムのためのユーザーマニュアル作成ガイド

業務システムのためのユーザーマニュアル作成ガイド

こちらはマニュアル作成の指針から適切な文章の書き方、マニュアルの校正や保守までマニュアルにかんするあらゆるトピックを扱った貴重な本。ITエンジニア必携とあるが、まさにそのとおり。マニュアル作成に携わるすべての人に読んでほしい書籍だ。

根本から理解する Wordの「スタイル」活用読本 [Word2010/2007/2003/2002対応] (Wordで作ったWordの本)

根本から理解する Wordの「スタイル」活用読本 [Word2010/2007/2003/2002対応] (Wordで作ったWordの本)

こちらはWordでスタイルを使いこなすために必要な知識が得られる本。メンテナンス性の高いドキュメントを作るには、まずスタイルの理解から。知っているのと知らないのでは全く効率が変わってくる。

VBAとマクロの違い ~ マクロの語源はギリシャ語

今回はVBAとマクロがどう違うのか、雑学的なお話。

よくある勘違いが以下の2つ。

  • マクロの記録によって作られたものがマクロだ。
  • マクロとVBAは同じものだ。

どちらも間違っている。

巷で正確な解説を見かけないのはたぶん、厳密に話し出すと長くなるからだろう。あるいは説明を書いている本人もよくわかってないのかもしれない。

別にVBAとマクロの違いについて正確に説明できなかったからといって特段困ることは無いけれど、よくわからずにマクロだのVBAだのと言ってるのもちょっとモヤっとすると思うので、ちょっとここらで真剣に説明しようと思う。

マクロとは何か

マクロ…まずこの言葉が曲者だ。
これはもともとマクロ命令(macro instruction)と呼ばれていたが、いつしか略されるようになったものだ。

【参考】マクロ命令 - 意味・説明・解説 : ASCII.jpデジタル用語辞典

命令であることはわかった。
それで、「マクロ」とは?

実はこれ、もともとはギリシャ語で大きいという意味の言葉(μακρο)。

ウァクポ?いや、これでマクロと読む。
英語のuに見えるのはMに相当するミュー。pに見えるのはRに相当するローである。
f:id:t-hom:20170618172312p:plain

つまり英語のアルファベットに直すとmakro(マクロ)と書かれていることに。
英語に導入されたときkの綴りがcに置き換わって接頭辞「macro-(おおきな~)」になったと思われる。

マクロ経済学Excelマクロのマクロって実は語源は同じだったという話。
ちなみに小さいを意味するミクロもギリシャ語由来だ。

マクロ命令とは何か

前述の話から、マクロ命令とは「大きな命令」という意味になる。
ただ大きな命令と言われてもピンと来ないと思うので、全自動洗濯機に例えて説明する。

f:id:t-hom:20170618173200p:plain

洗濯機は選択物を入れてスタートボタンを押すだけで全部やってくれるが、内部では注水したりドラムを回したりと小さな命令が飛び交っている。これらをひとまとめにして「洗う」という大きな命令にしたのがマクロ命令。

Excelなら、値を入れて、色を塗って、別のセルを選択してという風にいくつかの小さな命令を組み合わせて作る大きな命令がマクロ命令である。

ただ現在は「マクロ」が「マクロ命令」の略だという話はほとんど知られていないので。マクロ命令と言っても通じないだろう。

「大きい」だけ残して肝心の「命令」を略すの?って思うけど、それ言ったら「ケータイ」もそうだ。「持ち歩き」だけ残して肝心の「電話」が消えてる。

VBAとは何か

VBAはマクロ記述するときに使う言語のことだ。

たとえばこんな風に日本語で書いても動かない。

 A1セルを黄色に塗ってください。

だからこういう風にVBA言語で書く。

 Range("A1").Interior.Color = vbYellow

Microsoft Officeのマクロ機能で使用できる言語はVBAだけなので、VBA=マクロと勘違いされやすいけれど、マクロは複数の命令を組み合わせた大きな命令のことで、VBAはそれを書くための手段なので、視点が違う。

Open Officeマクロなんかは標準のOpenOffice Basic言語のほかに、Python、BeanShell、JavaScriptなどのマクロ記述言語を選択できるのでマクロと言語の違いを説明するときに引き合いに出すと分かりやすいかもしれない。
f:id:t-hom:20170618175331p:plain

複数プロシージャで構成されたマクロ

たとえば以下のようにプロシージャからプロシージャを呼ぶケースがある。

Sub ごあいさつ()
    Call コンチハ
    Call サイナラ
End Sub

Sub コンチハ()
    MsgBox "Hello"
End Sub

Sub サイナラ()
    MsgBox "GoodBye"
End Sub

このとき、「ごあいさつ」プロシージャは、コンチハ・サイナラの2つのプロシージャを呼び出しているので、これらをひっくるめて一つのマクロであるといえる。
一方で、コンチハ・サイナラはそれぞれ単体で実行できるので、それぞれが独立したマクロであるとも言える。
※MsgBox一つしか命令がないのでマクロ命令の説明と矛盾するけど、慣例的にこれもマクロと呼ぶ。

このように複数命令が存在するときは、「ごあいさつマクロ」と「ごあいさつプロシージャ」では指す範囲が変わってくるので注意。

ひとつのマクロはひとつ、あるいはそれ以上のプロシージャから構成される。
マクロは目的を持った完成品、プロシージャは部品、VBAは記述言語といったイメージ。

Excel VBAExcel マクロ

Excel VBAという呼び方があるけれど、実際にExcel専用のVBA言語があるわけではない。VBA言語自体は他のOfficeアプリでも共通のものである。
f:id:t-hom:20170618180818p:plain

VBA言語を用いてExcelを操作する行為やそのノウハウなどを指して便宜的にExcel VBAと呼んでいるだけ。言語名はあくまでVBA

一方、完成したものをExcel マクロと呼ぶのは自然である。

まとめ

最後に冒頭の勘違いに対して訂正をいれてまとめにしよう。

「マクロの記録によって作られたものがマクロだ。」
→No!

マクロの記録はマクロを作る手段の一つであり、実際にはVBAコードが記録される。
そしてVBAを手で書いても、マクロの記録で作成しても、完成したものはマクロと呼ぶ。

「マクロとVBAは同じものだ。」
→No!

マクロは完成した「大きな命令」を指し、それを記述する言語がVBAである。
同じコードに対し、「これはVBAである。これはマクロでもある。」という説明が成り立つことがあるが、2つの用語は切り口が違うので間違えて知ったかぶらないようにしたい。

Javaでテキストファイルから特定文字列を含む行を除いてファイル出力

今回はJavaでテキストファイルから特定文字列を含む行を除外してファイル出力するコードを作ったので紹介。
コマンドライン引数で複数のキーワードを指定して除外できるようにした。

作成の経緯

このブログのアクセスログを分析する際、いつもダウンロードしたcsvをそのままExcelで開いているが、ひと月あたり数万件のデータがあるので私の非力なマシンではちょっと厳しくなってきた。
特に、検索エンジンからの流入を除いた被リンクからのアクセスだけを分析したい場合、google、yahoo、bing、searchといったキーワードをあらかじめ除外しておくとデータ件数が三分の一くらいまで減るのでExcelで扱うのが楽になる。

sedawkでやれば早いけど、インストールしてないうえ、使い方を忘れたので面倒くさい。そこは日曜プログラマーなので、たまにはJavaのリハビリがてら自分で作ってみることに。(もっと面倒くさいだろうというツッコミはナシで)

できたコード

import java.io.*;

class Filter
{
    public static void main(String[] args)
    {
        if(args.length < 1){
            System.out.println("使用例:java Filter [fileName] [Exclude Text1] [Exclude Text2] ...");
            System.exit(1);
        }
        try {
            BufferedReader br =
                new BufferedReader
                    (new FileReader(args[0]));

            PrintWriter pw = new PrintWriter
                (new BufferedWriter(new FileWriter("out.txt")));

            String str;
            boolean flag;
            while((str = br.readLine()) != null){
                flag = true;
                for(int i=1;i<args.length;i++){
                    flag = flag && str.indexOf(args[i]) == -1;
                }

                if(flag) {
                    pw.println(str);
                }
            }
            br.close();
            pw.close();
        }
        catch(IOException e){
            System.out.println("Error:ファイルの読み書きに失敗しました。");
        }
    }
}

コンパイル

javac Filter.java

Eclipseを使うほどのコードでもないので。。

使い方

java Filter [入力ファイル名] [除外テキスト1] [除外テキスト2] ...

例) java Filter 101-2017-05.csv google yahoo bing search

このように除外テキストはいくつでも指定できる。

所感

例外のケアが雑だけど、まぁ自分ひとりで特定の目的に限った利用なのでこれで十分。
しばらくVBAばかりやってたので、等価比較を「=」で書いてしまう癖が出てハマった。
Javaの等価比較は「==」

工夫した点としては複数キーワードの除外判定ループ内で「flag = flag && 条件」としているところ。
これは普段VBAでもよく使ってるパターンで、複数条件を束ねるのに便利。
論理積の性質で、ループ内で1度でもfalseが出ると以降flagはtrueが代入される次の周回までfalseに固定される。

地味に基本情報などのコンピューターサイエンス系の知識が活きるので、にわかプログラマーとの差別化ができてうれしい。

使ってみた感想としては、やはりJavaは動作の速さが印象的。一瞬で処理が終わるので気持ちいい。※初回実行はJava VM起動があるのでほんの少し待たされるけれど。
VBAが遅いんじゃない。あなたのコードが遅いんだ。」なんて巷で良く言われてるけれど、あれは半分本当で半分嘘。正しくは「あなたのコードも遅いけど、VBAそもそも遅い。」だ。
ただしデータ量が少ない場合はVBAでも十分速いのでたかだか数万件ならVBAでも問題なかったかもしれない。

ちなみにVBAで書くと

こうなる。

Sub FilterText()
    '※サンプルなのでダイアログ等使わずに定数で代用
    Const BASE_PATH = "C:\Users\thom\java\", _
        INPUT_FILE_NAME = "101-2017-05.csv", _
        OUTPUT_FILE_NAME = "out2.txt", _
        EXCLUDE_WORDS = "google yahoo bing search"
        
    Dim reader As TextStream
    Dim writer As TextStream
    
    With New FileSystemObject
        Set reader = .OpenTextFile(BASE_PATH & INPUT_FILE_NAME, ForReading)
        Set writer = .OpenTextFile(BASE_PATH & OUTPUT_FILE_NAME, ForWriting, True)
    End With
    Dim str As String, flag As Boolean, ex As String
    Do Until reader.AtEndOfLine
        str = reader.ReadLine
        flag = True
        For Each ex In Split(EXCLUDE_WORDS)
            flag = flag And InStr(str, ex) = 0
        Next
        If flag Then writer.WriteLine str
    Loop
    reader.Close
    writer.Close
End Sub

私のマシンだと約7万行に対して5秒くらい。Java版は一瞬で完了したので、数十万件になってくるとだいぶ差が出てきそう。

参考書籍

こちらは私が初めてJavaを学んだ書籍の第六版。

今回はリファレンスがわりに使ったけど、基本的にLesson1から順に進めていくタイプの本なので、別途リファレンスが欲しくなった。

VBA 名前付き引数の正体はプロシージャの仮引数の変数名

今回は名前付き引数についてその概念と仕組みを紹介する。
名前付き引数はVBAにおいて基本的な機能であり、マクロの記録で作ったコードでよく使われているが、正確に理解している方は少ないように見受けられる。

かくいう私も初めて名前付き引数が何かを理解した時は目から鱗が落ちた気分だった。しかしすでに自分の中である意味常識化していてこれまで記事にするということを思いつかなかったのだ。

名前付き引数とは

名前付き引数とは、プロシージャに引数を渡す際順番ではなく名前で指定する方法をいう。「ナマエツキヒキスウ」と読む。

メッセージボックスを表示させるコードを例に名前付き引数の機能をみてみよう。
まずは名前付きではない引数から。

Sub hoge()
    MsgBox "続行しますか", vbYesNo, "確認"
End Sub

このようにMsgBox関数に引き渡す値は、1番目がメッセージ、2番目がボタンの種類やアイコン、3番目がタイトル表記というふうに、順番が決まっている。
たとえば、ボタンの種類を指定せずにタイトルを指定したければ、以下のように2番目の値を空白にする。これが通常の引数の渡し方である。

Sub hoge()
    MsgBox "こんにちは", , "挨拶"
End Sub

次に名前付き引数の場合を見てみよう。
名前付き引数では、引数名:=値と書くことで、順番に関係なく狙った場所に値を渡すことができる。

コードを書いていると関数呼び出しの際に以下のようなクイックヒントが出てくる。
f:id:t-hom:20170608210304p:plain
Prompt、Buttons、Title…などと書かれているのが名前付き引数の名前だ。

名前付き引数を使うと先ほどのコードはこのように2番目を飛ばしても問題ないし、

Sub hoge()
    MsgBox Prompt:="こんにちは", Title:="挨拶"
End Sub

このように逆にしても問題なく動作する。

Sub hoge()
    MsgBox Title:="挨拶", Prompt:="こんにちは"
End Sub

これが名前付き引数だ。
どんな時に便利かというと、たとえばWorkbooks.Openのような大量のオプション仮引数が存在するケース。

Sub hoge()
    Workbooks.Open "C:\work\Sample.xlsx", , , , "abc!xy123"
End Sub

"abc!xy123"が何なのかパッと見ても分かりにくい。

このように名前付き引数であればファイル名とパスワードを指定していることが一目瞭然。

Sub hoge()
    Workbooks.Open Filename:="C:\work\Sample.xlsx", Password:="abc!xy123"
End Sub

以下のように途中までふつうの引数で、一部だけ名前付き引数という指定もできる。

Sub hoge()
    Workbooks.Open "C:\work\Sample.xlsx", Password:="abc!xy123"
End Sub

逆に名前付き引数の後に順番によるふつうの引数は使えないので注意。

名前付き引数の正体

名前付き引数というのは、実は単にプロシージャの仮引数の変数名でしかない。

たとえば以下のように引き算を行うFunctionプロシージャを作ってみる。

Function 引き算(元の数, 引く数) As Long
    引き算 = 元の数 - 引く数
End Function

呼び出す際、同じようにクイックヒントが出るはずだ。
f:id:t-hom:20170608211725p:plain

一般的には単に値だけを書いて呼び出すが、

Sub hoge()
    MsgBox 引き算(30, 10)
End Sub

名前付き引数を使用すると以下のように項目を逆に書くこともできる。

Sub hoge()
    MsgBox 引き算(引く数:=10, 元の数:=30)
End Sub

※あくまで機能紹介のためのサンプルなので特に逆に書くメリットはありません。

名前付き引数の利点

  • Optional指定を多用したプロシージャを呼び出す際には名前付き引数で中間の引数を飛ばせる。
  • 渡している値が何なのかパッと見てわかるので、うまく使うと。コードの可読性が増す。

仮引数名なんてどうせ値を運ぶ役割しかないし、スコープも小さいから適当でいいやと思われがちだけれど、このようにプロシージャの仮引数名は、名前付き引数としてコードの可読性を助けるものなので、適当に名前をつけるべきではない。

VBA テキストボックスで複数行表示させる場合の最適なHeightは連立方程式で求まる

前回、テキストボックスの最適なフォントサイズについて書いた。
thom.hateblo.jp

そこでテキストボックスのHeightプロパティを21に設定したが、今回はその根拠と複数行書ける場合の最適なHeight値の求め方を紹介する。

Meiryo UI 12ポイントのときのテキストボックスの最適な高さ

まず以下のようにさまざまなサイズで実験を行った。
f:id:t-hom:20170521010150p:plain

このとき、高さ18では文字入力中に謎の下線が現れるというバグが、19と22ではなぜかアルファベットが太く見えるというバグが出現した。
つまりこれらは適切なサイズとは言えない。

次に余白のバランスを見るためにPowerPointで縞模様のシェイプをあてがってみた。
f:id:t-hom:20170521111647p:plain

高さ23、24は明らかに下が空きすぎているのでアウト。
ただしこれはフォントによるので注意。

メイリオなどは更に下余白が大きい。
thom.hateblo.jp

さて、あとは高さ20と21のどちらかが候補であるが、さらにズームし、余白部分を半透明化してみたところ、余白20ではパイプ文字が余白に差し掛かってしまうことが判明。
f:id:t-hom:20170521112106p:plain

ということで、Meiryo UI 12ポイントの最適なテキストボックスのHeightは21とした。
ただし、BorderStyleがfmBorderStyleSingleに設定されていることが前提。ほかのスタイルでは余白値が変わってしまうので、スタイル設定後に高さを合わせよう。

複数行のテキストボックスの高さを求める

テキストボックスのMultiLineプロパティをTrueに設定すると、複数行の表示が可能になる。さらにEnterKeyBehaviorをTrueに設定すると、Enterキーで改行できるようになる。
さて、このときHeightプロパティをいくつに設定すれば綺麗に見えるだろうか。
もちろん、グリッドに合わせて適当にマウスで設定したのでは綺麗にならない。
f:id:t-hom:20170521112935p:plain

そこで地道な作業であるが、Heightをプロパティで調節しながら、画像をペイントに張り付け、1行のときと2行のときで下の余白がぴったり一致するHeight値を探る。
f:id:t-hom:20170521113745p:plain

Meiryo UI 12ポイントで2行の場合、最適なHeight値は36だった。

じゃあ3行以上なら、この作業を延々と繰り返すのかというと、そんなことをする必要はない。

1行の場合のHeightが21、2行の場合のHeightが36という2つの値があれば、あとは計算で求まるのである。

つまりこういう連立方程式になる。

文字高さ × 1行 + 余白高さ = 21
文字高さ × 2行 + 余白高さ = 36

このままでは計算しにくいので文字高さをx、余白高さをyとしよう。
x + y = 21
2x + y = 36

一応、計算過程は以下のとおり。
f:id:t-hom:20170521115421p:plain

ということで、文字高さは15、余白高さは6と求まった。

では5行表示させる場合の最適な高さは?

15 × 5行 + 6 = 81

実際に81に設定してみた。

余白はバッチリ!
f:id:t-hom:20170521115736p:plain

以上。

VBA テキストボックスの最適なフォントサイズは12ポイント

VBAでユーザーフォームをデザインする際、フォントサイズに気を配っているだろうか。

まず、ふつうにテキストボックスを配置するとこのような外観になる。
f:id:t-hom:20170521010506p:plain

フォントはMS UI Gothicの9ポイント。

これ、ブログの画像だと読みにくくないけれど、実際にフォームを実行してみるとかなり小さい。

私の視力ではちょっと読みづらい。
いや、視力だけではなくて、環境のせいもあるだろう。
私は自宅ではモニターと70センチほど離れて作業しているので、標準的なユーザーよりもモニターが遠いと思う。

ユニバーサルデザインの考え方

視力とか環境なんて言い出したら、それぞれ最適なサイズは人によってバラバラになってしまう。
じゃあ誰に合わせて設計したらいいんだ?

このような疑問に答えてくれるのが、ユニバーサルデザインという考え方。

Wikipediaでは以下のように定義されている。

ユニバーサルデザイン(Universal Design、UD)とは、文化・言語・国籍の違い、老若男女といった差異、障害・能力の如何を問わずに利用することができる施設・製品・情報の設計(デザイン)をいう。

ユニバーサルデザインガイドライン

ユニバーサルデザインは特に老若男女さまざまな人を想定しないといけない行政の分野で積極的に取り入れられている。
画面デザインではなくあくまで紙面デザインの話になるが、紙面において本文の文字サイズで12ポイントを推奨しているものがいくつか見つかったので紹介する。

■わかりやすい印刷物のつくり方(横浜市)
http://www.city.yokohama.lg.jp/kenko/chifuku/fukumachi/publication/image/insatupdf.pdf

9ページ(PDF11枚目)より引用

大きさはできるだけ12 ポイント以上にしましょう。

■印刷物のユニバーサルデザイン(広島県)
https://www.pref.hiroshima.lg.jp/uploaded/attachment/6225.pdf

4ページ(PDF6枚目)より引用

● 「A4」サイズの用紙の場合,最も文字数の多い本文を12~14ポイントで作成すると読みやすい人の幅が広がります。

■だれもが見やすい印刷物の手引き(滋賀県)
http://www.pref.shiga.lg.jp/ud/02-torikumi/files/insatsunotebiki.pdf

3ページ(PDF5枚目)より引用

○ 本文の大きさは12ポイントを基本にします。

画面デザインでも12ポイントを採用

今回残念ながら画面デザインについてはガイドラインのようなものを見つけることができなかった。
おそらく紙面とちがって解像度やディスプレイサイズ・輝度などの設定値・デバイス(PCかスマホタブレットか)・使用環境などが異なるため、一概に何ポイントが最適だと言い切れないのだろう。

タイトルで12ポイントが最適と言い切ったのは、その方が釣れると判断したから(てへ)。

まぁ全くデタラメに12ポイントと言っているわけではなく、一応印刷物のガイドラインに合わせて12ポイントに設定してみて、自宅や会社など異なる環境で使用してみたところ私は非常に見やすいと感じたので12ポイントを採用することにした。

ちなみにフォント種類は「Meiryo UI」、BorderStyleはfmBorderStyleSingle、SpecialEffectはfmSpecialEffectFlat、Heightは21に設定している。
f:id:t-hom:20170521022037p:plain

単体で見るとノッペリして野暮ったく感じるかもしれないけれど、Windows 8 あたりからフラットデザインが主流になりつつあるので慣れだと思う。

以下の記事でフラットデザインを取り入れたデザインを紹介しているので参考までに。
thom.hateblo.jp
※上の記事ではテキストボックスにはMeiryo UIではなく、メイリオを使用した。メイリオ12ポイントの場合はまた最適なHeightが変わってくるので注意

テキストボックス以外のフォントサイズ

画面デザインでも12ポイントを採用していると書いたけれど、私はテキストボックス以外ではこれより小さなサイズもふつうに採用している。
なぜかというと、ラベル・ボタンなどは慣れてしまえば、それほど読まなくなるから。
配置場所や文字数からざっくりとそれが何であるかが判別できれば十分なのでそれほど不自由は感じない。

重要なのは、毎回内容が変わるテキストボックスにおいて読みやすいフォントサイズを採用すること。
特に電話番号・日付・商品コードや管理番号など、読み間違えると致命的なものについて、目を凝らさないと読めないというのでは辛い。
逆に長文は、読み疲れはするものの意外に小さめの文字でも読める。多少こまかい漢字が混ざっても文脈から判断できるからだ。

結論

この記事で私が言いたいのは何が何でも12ポイントということではなく、色々考慮してサイズを決めてねという話。

もちろんすべてを読みやすいサイズにしたうえでレイアウト上も収まりが良いのであればそれが一番だけれど、デザインを優先して切り捨てる部分も出てくるだろう。
そのときに、何を妥協して良いか、逆にここだけは死守すべき点は何かということをよくよく考えないと、使いにくい画面になる。

これまで格好いいけど使い勝手の悪い画面は、嫌というほど見てきた。
商品としてはそのほうが売れるし、意思決定者も気に入るからだ。

でも、もうたくさんだ。

システムの役割は仕事を効率化することである。使い勝手を犠牲にした格好よさなんてのは意味がない。

本当に使う立場に立って、どういったデザインがベストか考えてみよう。

VBAからVBScriptへマクロを移植する方法

今回はVBScriptをやってみたいVBA使いの方へ、VBAで書いたコードをVBSに移植する方法を説明しようと思う。
特にあまり知られていないであろう最初から移植性を意識したコードを書く方法について紹介する。

執筆のきっかけになったのはこちらの記事。
blog.powerpointvba.club

VBScriptの作り方

テキストエディタでコードを書いて、拡張子をvbsとして保存するだけ。
実行するにはダブルクリックする。
ドラッグ&ドロップしたファイルを処理するようなスクリプトも作れる。

VBAとの違い

エントリーポイント(プログラムの開始点)がファイルの先頭

VBAの場合、Subプロシージャを複数作ってそれぞれがエントリーポイントになるけれど、VBSの場合はファイルの先頭がエントリーポイントになる。
つまりSubプロシージャなどを書かずに、いきなりMsgBox "Hello"と書けば動くのだ。

意外に知られていないのは、普通にSubプロシージャも書けるということ。
エントリーポイントからCallしてやれば動作する。

Call Main
Sub Main()
    MsgBox "Hello"
End Sub

VBAと同じようにプロシージャの集まりとして作っておいてCallするという方法をとれば、VBAプログラムとの高い互換性を保ちつつスクリプト化できるのでおすすめ。

変数宣言に型を持たせられない

VBAならDim a As Integerなどと書けるところ、VBSではDim aとしか書けない。
私はよく、Dim a 'As Integerという風にAs以降をコメント化している。

イミディエイトウインドウが使えない

つまりVBAから移植するためにはDebug.Printは別の方法で書き直さないといけない。
Debug.Printはそもそもデバッグ機能なので本番マクロで使うのもどうなのって思うけど、個人用マクロで重宝するのは確か。

無いなら作ってしまおう。

'下で定義するDebugPrintクラスをもとに変数Debugを準備
Dim Debug: Set Debug = New DebugPrint

Call Main
 
Sub Main()
    Debug.Print "こんにちは"
    Debug.Print "さようなら"
    Debug.Flush 'FlushしてはじめてPrintした内容がMsgBoxで表示される。
End Sub

'以下にDebugPrintクラスを定義
Class DebugPrint
    Private message

    Public Sub Print(msg)
        message = message & msg & vbNewLine
    End Sub

    Public Sub Flush()
        MsgBox message
        Call Clear
    End Sub

    Public Sub Clear()
        message = ""
    End Sub
End Class

こうするとVBAからの移植性はアップする。
メインコードをわざわざ書き直さなくても、Flushを呼ぶという変更だけで済む。

参照設定できないので遅延バインディングになる

参照設定が使えないため、外部オブジェクトの作成はCreateObjectで行うことになる。
VBAで参照設定をやっている場合、以下を参考にCreateObject方式に書き換える。

参照設定とCreateObjectの対応リスト - You.Activate

その他の特徴

  • Rnd関数を使用する場合、その前の任意の行に「Call Randomize()」を挿入しないとランダムにならない。
  • 配列の宣言にDim a(1 to 3)といった指定ができず、3つの要素がほしい場合はDim a(2)と書いて0,1,2の3つを作るしかない。
  • Select文がVBAより低機能で基本的な書き方しかできない。
  • 日本語変数が利用できない。

追記

Twitterで、有益なリンクが流れてきたので追記(id:imihitoさんありがとう)
VBA の機能で VBScript に含まれていない機能

VBSではCollectionが使えないようなので、代替手段として以下の記事もどうぞ。
imihito.hatenablog.jp

VBAからVBScriptへマクロを移植する方法

  1. マクロをそのまま貼り付ける。
  2. 変数宣言から型の宣言を取り除く(あるいはコメントアウト)。
  3. エントリーポイントから実行したいマクロをCallする。
  4. 参照設定からCreateObject形式に切り替える。

上記で大体動くが、Debug.Printを使っていたり、Select文の高度な機能(Is比較、n To n表記など)を利用している場合は修正が必要になる。

VBScriptからVBAへマクロを移植する方法

上位互換とは言わないが、基本的に、Sub~End Subでくくってやれば大体のスクリプトはそのまま動く。
VBAも型宣言なしで動作するし、CreateObjectにも対応しているのでVBSからVBAへは極めて移植性が高い。
ただしWScript.Echoを使っている場合はMsgBoxかDebug.Printへ変更が必要である。

長いスクリプトをそのまま貼り付けると、長いプロシージャが出来上がるのであまり良くない。
VBScriptにおいても最初からプロシージャにコードを書くようにし、適切にプロシージャを分割しておくとVBAに移植してもスッキリと見通しの良いコードになる。

VBScriptにオススメのエディタ

やはりVBAで使用するVBエディタが一番楽である。

VBAで最初からVBSへの移植性を意識したプログラムを書く場合、外部オブジェクトの利用は以下のように参照設定とCreateObjectのハイブリッドにしておくと良い。

Dim fso As FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")

そうすると、VBエディタで書くときはオブジェクトメンバーの入力候補が出るし、VBSに直すときはこのようにAs以降をコメントアウトするだけで済む

Dim fso 'As FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")

VBScript関連書籍

まずVBAができる人にお勧めするのは以下の1冊。

WSHクイックリファレンス 第2版

WSHクイックリファレンス 第2版

これはFileSystemObjectやDictionaryなどのWSHのオブジェクトについて使い方がわからないときにリファレンスとして重宝する。
また、VBAでもこれらのオブジェクトは多用するが、VBAの書籍よりも詳しく書かれている。
VBScriptJScriptに両対応しているのでJavaScript派の方にもおススメ。

以下はあまり良く知らないけど、実質VBScriptの関連書籍って現行品はこれくらいしか無いので一応ひととおり掲載だけしておく。

Windows自動処理のための WSHプログラミングガイド 増補改訂版

Windows自動処理のための WSHプログラミングガイド 増補改訂版

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応

最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応

VBScript逆引き大全500の極意

VBScript逆引き大全500の極意

ただ私の場合はほぼVBAって感じのVBScriptを書くのであまり書籍を参考にした覚えはないな。
ただドラッグ&ドロップ操作などのVBSに特有の機能もあるので一冊くらい専門の本を持っておいても良いかなとは思う。

VBSでクラスを使う方法

以下の記事がおススメだけれど、まずクラスって何って方にはちょっとザックリしすぎてるかなとは思う。
http://tuka.s12.xrea.com/index.xcg?p=VBS%A4%CE%A5%AF%A5%E9%A5%B9%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8

クラスについてよく分からない方はまずVBAでクラスを使うこちらの記事と
ateitexe.com

手前味噌だけど、以下の記事がオススメ。
thom.hateblo.jp

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。