ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

エクセルVBAでできることと限界|業務自動化からピアノ演奏まで

プログラミング未経験でエクセルVBAに興味を持たれている方に向けて、エクセルVBAでできることを紹介します。自分が勉強しようとしているプログラミング言語がどこまでのポテンシャルを秘めているかを知り、作りたいもののイメージや目的意識を持つことはプログラミング習得にとても効果的です。

目次

エクセルVBAでできること

この記事ではエクセルVBAでできる事の様々な具体例を挙げていきますが、例がたくさんある為、大きく3つのカテゴリーに分けて順に説明していきます。

  • 自動化ツール
  • 業務システム
  • その他のプログラム

まず、ツールとシステムの違いについて切り分けを明確にしてから具体例の紹介に移っていきます。具体例の見知りたい場合は目次から直接飛ぶことができます。

エクセルVBAでできることの概要

エクセルVBAでできることは多岐にわたります。どのようなことができるか、と言うのはどのようなことを実現したいかの数だけあると言っても良いでしょう。それではどの範囲でできるかというと、

  • Officeの製品でできる事
  • Office以外のソフトで機能を提供しているものを利用すること

の範囲でできます。Officeの製品とはエクセルやOutlookと言ったものです。Office以外のソフトとは例えばGoogle Mapなどです。これが、エクセルVBAでできることです。あとはそれぞれのソフトの機能をどう組み合わせるかアイデア次第です。

ツールとシステムの違い

この記事ではエクセルVBAでできることをツール、システム、その他のプログラムの3つにわけて説明します。そのため、まずはこの記事における、ツールとシステムの言葉の使い分けについて明確にしておきます。

ツールとは何かの目的を達成するためのひとつの機能を提供するプログラムのことです。例えば、お客さんからの注文に対して請求書を作成したい場合、注文の品番と数量、単価の情報を元に請求書を自動で生成するという機能を持ったプログラムを作成すればそれは自動で作成するツールを作成したことになります。

システムとは、何かの目的を達成するための仕組みのことです。複数の機能やデータから成り立ちます。例えば、販売管理システムであれば、販売に関する様々な業務を行い、管理する事が目的です。そのために必要な機能やデータを持っています。

販売管理システムは過去の売上高を集計する機能や請求書を作成する機能、確定申告のデータをまとめる機能などいろいろな機能を備えています。また、それらの機能を利用する前提として過去の売上データを保持しています。このように複数の機能やデータが集まって仕組み、つまりシステムを構築することで販売を管理するという目的を達成する事ができます。これがシステムの意味です。

自動化ツール

それでは自動化ツールについて説明していきます。自動化ツールは何かの作業を自動で行うツールです。自動化できる作業は様々なものが考えられます。以下のようなものです。

  • 作成ツール
  • 抽出ツール
  • 加工ツール
  • チェックツール

それでは見ていきましょう。

請求書発行ツール

ツールとシステムの違いで例として挙げた請求書発行ツールです。売上データから請求書発行を行うツールです。Excel2016ではブックの新規作成時にテンプレートが選択できます。簡易請求書というテンプレートがあるのでこれを選択して請求書のフォーマットを選択しましょう。

エクセルには便利な請求書のテンプレートが用意されている
新規ブック作成時にテンプレートから選択した請求書のフォーマット

VBAを使わないのであればこの請求書に品目番号や数量と言った項目を手で入力していく事になります。しかし、同じエクセルブック内の別シートに受注一覧表を用意しておけば、たとえば、ある期間の請求書やある得意先向けの請求書を一括で作成すると言った様な事が可能となります。

なお、VBAでツールを作成する場合は、テンプレートにデフォルトで入っている計算式は不要ですので消しておきましょう。

Webスクレイピングツール

Webスクレイピングとはインターネット上の情報を取得する事です。例えば、毎朝8時にウェザーニュースのウェブサイトにアクセスして、きょうの天気予報を取得して共有フォルダに保存すると言った様なことができます。毎日チェックしているニュースサイトなど日常的な情報取得を自動化することができます。

ちなみにウェザーニュースのウェブサイトは下記です。
weathernews.jp

メール自動配信ツール

上でウェザーニュースの天気予報を共有フォルダに取得する例を紹介しました。これをメールで自分宛に配信すると言ったようなことも可能です。

他のアイデアとしては、顧客情報データベースから誕生日の1週間前の人だけを抽出して、誕生日特別割引クーポンをダイレクトメール配信すると言った事が考えられます。お客さんが10人くらいならメールもコピーペーストで送ることができますが、何千、何万の顧客のお客さんにもれなく同じ内容のメールを送るのはムリです。しかも名前の○○様の部分はそのお客さんの名前にしなくてはなりません。これは是非とも自動化して間違いなく、モレなく実行したい業務です。

もちろん、季節セールのお知らせなど「○○様」の部分だけを変えて全員に個別メール配信することも可能です。

このツールを作成するにはまず、顧客一覧表を用意します。顧客の数が数千~数万程度であればエクセルのシートに作成しておいて問題ありません。イメージとしては下の図のような一覧表を作成します。

顧客一覧があればメール配信も自動でできる
メール自動配信ツールで利用する顧客一覧イメージ

この一覧表を上から順にチェックしていき、誕生日が本日から1週間以内の人を抽出してメールを作成します。メールを作成する部分のプログラムは別に用意しておいて呼び出すようにすると、いろいろなメールに対応しやすいプログラムにする事ができます。

パワーポイント会議資料更新ツール

会議の為にパワーポイントで資料を作成することがあります。あるいは記録として実績をパワーポイントで残しておく場合もあります。そのような資料で多く目にするのが実績のグラフをパワーポイントに貼り付ける作業です。

よくある手順としてはこのような感じです。

  1. エクセルでデータを更新する
  2. 折れ線グラフのデータ範囲を1セルだけズラす
  3. グラフを画像としてコピーしてパワーポイントに貼り付ける

そしてできあがったパワーポイントのグラフは位置が微妙にズレたり大きさが違って不細工なデキになってしまうという悲しい結果となります。

エクセルVBAを使うと、更新するデータの入力をフォームから入力すると、グラフの範囲を更新してグラフを画像としてコピーしてパワーポイントに貼り付けて保存して閉じるところまで全て自動で行う事ができます。

社員が実績を更新するフォーマットのイメージ図
販売実績更新フォーム

担当者に実績を入力させるときにグラフの元データを更新させると入力間違いが起きる可能性があります。自分の社員番号と実績数値のみを入力させて、昨日のデータを入力すべきセルの位置は本日の日付からプログラムで求めるようにしておきます。こうすることによって入力ミスを防ぐことができます。この入力フォームに会議資料作成担当者用のボタンを配置し、パワーポイントの資料を作成するようにしています。

受注集計ツール

一週間に一回、顧客からの受注の金額をとりまとめる必要がある、と言った場合やあるカテゴリの商品だけ集計して分析したい場合など、いちいちフィルターをかけてコピーペーストで必要なデータを抜き取るのは面倒な作業です。

毎回似たような抽出や集計を行うのであれば、元データから決まった条件でデータを抽出し後工程で利用する形に加工するところまでを自動で行ってしまえば良いのです。イメージとしては、ある日の売上実績の一覧から支店ごとの売上の表を作成する、と言った様な事が考えられます。

ある日の売上実績データのイメージ
売上実績データのサンプル

この売上データを集計して下のような表を出力するというものです。

VBAを利用すればこのような集計は非常に簡単
集計結果のイメージ

集計は分析の基本です。つまり、集計の方法やグラフのまとめ方が決まっていればデータ分析の前処理ができるということです。データ分析と言うとどうしてもPythonが連想されてしまいますが、エクセルは立派にデータ分析ツールとして利用することができます。ということはエクセルを操作するVBAもデータ分析の一翼を担うことができるということです。

また、これまで紹介したツールの機能を利用して、メール配信したり支店ごとの売上推移グラフを更新したりといった工夫でツールの価値を高めることもできます。

顧客データ入力チェックツール

ユーザーがデータを操作したときに、その操作が正しいかどうかチェックを行うことができます。部門内で各メンバーに情報を入力してもらう場合、入力を間違う場合があります。例えば、ハイフンなしで電話番号を書くべきところをハイフンを入れてしまったり、市外局番の両側に不要なカッコをつけてしまったりといった場合、ユーザーに再入力を促したり自動で値を修正したりすることができます。

このように実行ボタンを押したときのみ起動するのではなく、データが入力されたらそのデータが正しいか確認する、といったようにイベントをトリガーにプログラムを実行することもできます。

業務システム

ここまで、ツールについて見てきました。ここからはシステムについて見ていきます。システムとは何かの目的を達成するための仕組みのことで、複数の機能やデータから成り立つのでした。こう考えると、ツールを作ることができれば、それをうまく組み合わせることでシステムができることになります。

ツールの組み合わせによってできるシステムは膨大な種類となります。というか工夫次第で何でもできるといっても過言ではありません。ここでは例として販売管理システムを例として挙げます。

データベースへのアクセス機能を持つ販売管理システム

受注⇒出荷⇒入金という3つの作業の流れからなる業務があり、これを販売業務と呼ぶとします。販売管理システムはこの販売業務を管理するシステムなので、受注、出荷、入金に関するシステムだといえます。受注はさらに請求書発行や倉庫への出庫指示伝票発行、受注金額集計といった作業に分解できます。出荷、入金の業務もそれぞれ複数の業務からなります。つまり販売管理システムはツールの集まりである受注システム、出荷システム、入金システムを統合したものだといえます。

このようにシステムは階層的になる場合があります。むしろ、大抵の場合システムは階層的です。そして受注システム、出荷システム、入金システムというような上位のシステムを構成するシステムの事をサブシステムと呼びます。

一つのエクセルブックに複数のサブシステムを作成するのはあまりお勧めではありません。この場合は3つのサブシステムをまず作成します。そして販売管理システムというマクロブックを作成し、販売管理システムはそれぞれのサブシステムを呼び出す役割だけを持たせるようにします。

そしてVBAはACCESSやMySQLといったデータベースにアクセスすることができます。メール自動配信のところで数万レコード程度ならエクセルシートで間に合うと書きましたが、全社的に利用する販売実績データなどの管理にはデータベースを使うようにします。日々何千件という受注データがあれば、数万行レベルしか実務で耐えられないエクセルでは歯が立たないからです。

エクセル自体は数万行のデータにしか耐えられませんが、エクセルVBAはデータベースへのアクセスや操作が可能です。データベースにVBAを使ってアクセスし、ユーザーはインターフェースとして慣れたエクセルの画面でデータベースを操作できる、といったシステムを構築することができます。

なお、データベースに接続するVBAプログラムを書くためにはVBAだけでなく、データベースそのものとSQLというデータベースを操作する文を勉強する必要があります。また、エクセルの機能ではない機能を借りてきて使う必要があるため、エクセル内で完結するプログラムを作成するより、その分だけ難易度は上がります。

とはいえ、しっかり勉強すれば必ず理解できるので、恐れる必要は全くありません。

その他のプログラム

エクセルVBAは仕事以外の事に使うこともできます。普段エクセルを仕事に使っているため、エクセルVBAは業務改善、自動化の為のプログラミング言語だというイメージがあるかもしれません。しかし、動くプラットフォームがエクセルというだけです。ここでは業務以外のエクセルVBAプログラミングのアイデアを紹介します。

ゲーム

エクセルVBAはアクションゲームを作成することもできます。エクセルVBAの著書で有名な武藤玄さんのウェブサイトを紹介します。シミュレーションゲームやマージャンゲームなど本格的なゲームが提供されています。

home.att.ne.jp

ここまでの本格的なゲームを作成するのは難易度も高いですし、プログラムの量も大変多くなってしまいます。しかし、ピクロス程度のゲームであれば少し勉強すれば十分に開発できます。まずはじゃんけんやおみくじクイズといった簡単なゲームでプログラミングの文法を抑えてからキーボードからの入力を受け取る方法を学んでいけば、徐々に本格的なゲームが作成できるようになっていきます。迷路くらいまではできます。

ネット上でもエクセルによるゲームの動画があるので、そちらも参照してみるとよいと思います。

楽器

エクセルVBAはWindows APIと言うWindowsの機能を借りて利用する技術を使うことができます。これを利用して、Windowsの音を鳴らすことができます。音を鳴らすことができるということは、音の高さや長さも指定することによって変更が可能ということです。というわけで、ピアノが作れます。

エクセルシートでセルを鍵盤にみたててピアノを作ることができる
エクセルで作ったピアノの鍵盤

上の図はセルの幅と高さを調節し、黒く塗りつぶすことでエクセルシートでピアノの鍵盤を表現したものです。このシートを操作するプログラムとして、セルがクリックされたら音を鳴らすというコードを記述します。クリックされたセルの位置がここならこのヘルツ数の音を鳴らす、という具合にプログラムを記述すればエクセルピアノの出来上がりです。

無料で作曲できるソフトも入手できる昨今、エクセルでピアノが再現できたからって…と否定的にとらえる必要はありません。こういうこともできますよ、ということです。業務システムがツールを組み合わせてできていたように、音を鳴らす方法もエクセルシートにピアノの絵を描くことでピアノを再現できました。何かと何かを組み合わせて何かを作る、そのアイデアが新しいアイデアを生むのだと考えるようにしましょう。

エクセルVBAでできる事の限界

ここまで、エクセルVBAでできることについて述べてきました。この項ではエクセルVBAの限界について説明します。限界を知ることで過度な期待を防ぐことができますし、将来落胆せずに済みます。それに、限界を知るということは、逆を言えばそこまではできるということです。

クロスプラットフォームではない

エクセルVBAはエクセル上で動きます。つまり、エクセルがインストールされているパソコンでないと動きません。よって、組込みソフトウェアはエクセルVBAで作成することはできません。基本的にWindowsを利用しているユーザーの為のツールやシステムしかできません。

高速処理は苦手

「VBAは遅い」と言っている人がいます。しかし、多くの場合それは工夫されていないプログラムの為です。多くの場合はプログラムの内容を工夫することで処理時間を大幅に短縮することができます。しかし、一方で言語仕様的にどうしても高速処理が苦手だと言わざるを得ない場面があります。それは、コンパイルが不要な言語ということとエクセルそのものが重たいということがあります。

パソコンは考える時に0と1の2つの数字の組み合わせを使っています。しかし、プログラミングは0や1を打ち込んで行うわけではありません。For、Next、If、Elseなど英単語を組み合わせでプログラミングをします。英語がもとになっています。このおかげで、プログラミング言語は覚えやすく書きやすくなっています。

そこで、英単語で書いたプログラムを0や1に変換する作業が必要*1となります。その作業をあらかじめやっておく必要がある言語の場合、純粋にプログラムを実行するだけなので、素早く処理ができます。

一方、エクセルVBAは一行ずつ0や1に変換しながら実行しています。つまり、日本語訳された洋書を読むのと、英語を日本語に訳して、訳した日本語を読むのとの違いです。これは繰り返し構文に如実に表れます。なので、なるべく無駄な繰り返しはしないように工夫する必要があるのですが、仕様的にやむを得ない部分があります。

また、言語の仕様ではなくエクセルの仕様という面があります。エクセルVBAは場面的に、エクセルブックを開くことが多いです。何かのエクセルブックを開いて、加工して、保存して閉じる、という処理です。この開くところと保存するところと閉じるところが壊滅的に遅いです。これはエクセルVBAの仕様ではなく、エクセルというアプリケーションソフトの仕様です。

エクセルは誰でも簡単に取り扱うことができるとても便利なアプリケーションです。そして様々な機能を持っています。この誰でも簡単に取り扱えるということと様々な機能を持っているということを同時に実現しようとすると、大変たくさんのプログラムをエクセル自体が持っていることになります。そしてエクセルのブック自体も初期状態で重たいです。

その証拠に空のエクセルを開くだけでも時間がかかります。プログラム言語と関係なくエクセル自体が重いのは仕方がありません。テキストファイルとしてデータを保持し内部的に開いて処理するなどの工夫が必要となります。

エクセルVBAの短所

エクセルVBAの短所は上の【エクセルVBAでできる事の限界】に記した内容があることです。逆に言うとそれだけです。しかし、短所は調書の裏側と言うように、これは仕様の問題と言えます。Microsoftが誰でも気軽に便利に使えるスプレッドシートを作ったのです。エクセルVBAの短所は織り込み済みで便利さと引き換えに遅い、重いという短所もある、という前提の上で、なるべく遅くならないように余計な処理はさせないようにプログラムを工夫するという姿勢が大事です。

あとは、言語仕様ですが、クラスの概念が限定的です。専門的になってしまいますがオブジェクト指向と言われるプログラミング言語はクラスという概念があります。このクラスというのがうまく使うととても便利なのですが、エクセルVBAの場合クラスの機能が隠蔽化のみとなっています。これは言語仕様です。実際これ以外のクラスの概念はエクセルの操作にはほぼ不要です。よって短所と言うより言語仕様的にできないことを選択している、と言ったほうが正確かもしれません。

エクセルVBAの長所

エクセルVBAの調書についてまとめていきます。短所の裏側ですが、身に着けやすさ、実用性が最高に素晴らしいです。

開発環境の構築が不要もしくはめちゃくちゃ簡単

プログラミングをしようと思うと開発環境を整える必要があります。開発環境とは何かというと、プログラムを書くためのエディタであったり、コンパイルをするためのソフトをインストールするということです。インストールするだけではなく、環境設定が必要となります。この環境設定が難しく、プログラムを始める前に挫折してしまうこともあります。

しかし、エクセルVBAの場合は環境設定は必要ありません。なぜならエクセルがインストールされていれば、そのエクセルに開発環境が付属しているからです。あえて言えば、エクセルが入っていないのであればエクセルをインストールすることがエクセルVBAの開発環境を構築する事と同義になります。

文法の取得が比較的容易

別にエクセルVBAの文法が簡単だ、と言うつもりはありません。しかし、エクセルVBAを身に着けるのは他言語に比較して簡単だといえるでしょう。それは勉強するための環境にとても恵まれているからです。理由は下記の通りです。

  • すでに使いなれたエクセルの機能を使うことから始められる
  • 日本語の文献やWebサイトの解説が充実している
  • エクセルがある程度使えれば、PCそのものにそれほど詳しくなくても習得できる

このブログでもたくさんVBAの文法や使い方について解説しています。参考にしてもらえればと思います。

すぐに実務で活用できるものの開発に着手できる

ほかのプログラミング言語だと、ある程度文法を身に着けるところまではいくものの、そこから実際に使えるものが作れるようになるまでの壁があります。文法を勉強しただけでは実務的には役に立たないということです。

その点エクセルは文法を勉強すればすぐに実務で役立つツールを作ることができます。これはなぜかというと、目の前にエクセルブックやエクセルシートといった目に見える操作できるモノがあるからです。勉強した文法もこれらの操作をたくさん扱っています。

そのため、文法を勉強する中で身についたブックを開いたり、保存して閉じるといった操作がそのままツールの一部になっていくわけです。

エクセルVBAでできることまとめ

この記事ではたくさんのエクセルVBAでできることを紹介してきました。そのうえで限界と調書、短所について解説しました。その内容を簡潔にまとめます。

  • ツールは単一の機能を持ったプログラム
  • システムはツールやデータベースなど複数の要素が組み合わさった仕組み
  • エクセルVBAはツールだけでなくシステムを作成することもできる
  • Webスクレイピングやパワーポイント操作、Windows APIといったエクセル外のアプリケーションを利用することもできる
  • 限界はクロスプラットフォームでないことと、言語仕様的な遅さとエクセルそのものの重さにある
  • 速さに関することは工夫次第で相当改善できるが、エクセルそのものの重さの為ブックを開いたり閉じたるする遅さは避けようがない
  • エクセルVBAの長所は身に着けやすいところとすぐに実務に生かせるところ

さあ、エクセルVBAでできることと限界がわかったところで、安心してVBAの勉強を始めましょう!

質問、お気づきの点あればコメント欄にお願いします。

*1:本当は中間言語というのを経て0と1にする2段階のステップです