VBA

非IT会社員がVBAを学んでできるようになったことを実例で紹介

記事内に商品プロモーションを含む場合があります

こんにちはhokkyokunです。

非IT企業の非IT部員が独学でVBAを学んだ感想を実例で紹介します。

  1. VBAを学んでよかったこと
  2. VBAを学んでできるようになったこと
  3. VBAを学ぶのは今からでも遅くはない点
  4. VBAの長所と短所を理解することが上達の近道
  5. VBAの短所を補うためには
  6. VBAの学習方法

この順番で紹介したいと思います。

ざっくり、要約すると
VBAは今からでも十分学ぶ価値のあるツールです。
しかし、短所もありますので、それをおぎないつつ
効率的な学習(おすすめはUdemy)で習得を目指しましょう。

学んでよかったこと:自分を消耗しなくなる

意味深な見出しですが(笑)

どういうことかというと
VBAを学ぶ前の私は生産性とは一生懸命に働くことだと思っていました。

例えば、いろんなファイルに散らばったデータをつなげて
意味のある資料を作成する業務を行う場合

  1. ファイルを開いてデータをコピーして
  2. (例外がある場合は)あるデータだけには特別な計算を処理し、
  3. 計算された表を別のファイルに貼り付けて
  4. それを所定のフォルダに格納して
  5. ファイルをある特定の人にメールして

という作業が必要です。

①何件も、②素早く、③ミスをせずに
頑張ることが正しいことと認識していました。

VBAを覚えるとこの程度の作業は(量にもよりますが)
1分とかからず終わります。
しかも自分は何もせずスマホを見ていても大丈夫です。

これは私の人生観を覆しました。
同じ生産性なら楽をするべきです。

こんな単純作業は卒業してます(笑)

もっとクリエイティブなことをやっているんだよ

例えば、部下の管理をする場合を考えてみましょう。
部下のスケジュールをアウトルックの予定表に書き込ませたとします。

  • 部下のスケジュールをいちいちアウトルックを開いて
    部下の人数分選択して見比べていますか?
  • まさかどこにどれくらい出張しているか
    キーボードで入力していませんよね?
  • 会議を開きたいとき、
    空きスケジュールはどうやって判断していますか?
  • やっと全員が空いてるスケジュールを見つけたけど
    その時間に会議室の空きはありますか?
  • これを5分以内に部下全員にコンセンサスをとることは可能ですか?

VBAで全部できますよ

以下には具体的にできるようになったことと
VBAの良いところを上げていき、
非IT会社員にはぜひVBAを学んでいただきたいと思います。

できるようになったこと 実例〇〇

アウトルックの自動操作

会社でメーラーがアウトルックの方いらっしゃると思いますが、
以下のことはすべて可能です。

  • メールの宛先を変えて自動送信
  • 取引先ごとに内容や添付ファイルを変える
  • 取得したメールの内容を取得して
    エクセルに転記
  • 取得メールの添付ファイルを所定のファイルに自動格納

メール操作はかなりコスパがいいです。

また、アウトルックで社員のスケジュール管理を
されている方も多いかと思います。

以下のようなことも可能です。

  • 社員のスケジュールを取得し、エクセルに転記
  • 複数の社員のスケジュールを同時に表示して一括管理
    (アウトルック画面だと何人も同時表示するとかなり見づらくなります)
  • 複数の特定の社員に同じスケジュールを加筆
    (会議などの予定を一括管理。
    アウトルックでもできるが毎月の会議をいっきに入れられる)

覚えることは実はそんなに多くなく、
でも結構業務は大きく改善されたりします。

請求書作成

当社は一回の注文ごとに請求書を作る文化があり、
かつ、古いシステムを使っていたので、伝票番号順にしか作成できませんでした。

想像してみてほしいのですが、
一か月で何百枚、何千枚も発生する請求書の束を名前順に変える作業を…

これをVBAで自動生成することで
大幅に作業時間を圧縮しました。

実はこれ、私がVBAを学習すると決めたきっかけでもあります。

VBAはオワコン?今からでもVBAを学ぶべき理由

VBAは舐められることがほんとに多い(笑)

いまさらVBA(笑)
AIもあるし、業務効率化ならAIで十分

プログラミングを学ぶなら
PythonとかGASとか
のほうがいいんじゃない?

こういう意見ほんとに多い(笑)
ただ、間違っているとも思いません。

ですが、会社・組織の現状を考えるとVBAはまだまだ現役です
そしてVBAで効率化しつくしてから、次の一手として他の手段を考えましょう。

VBAを今からでも学ぶべき理由は以下です。

VBAはシステムの中継を行うには最適のツール

SAAS(Software as a Service)ってご存じでしょうか?

「SaaS」(Software as a Service:「サース」または「サーズ」)とは、ソフトウェアを利用者(クライアント)側に導入するのではなく、提供者(サーバー)側で稼働しているソフトウェアを、インターネット等のネットワーク経由で、利用者がサービスとして利用する状況を指します。

IDCFrontier

SAASを導入することでエクセルは不要になると言われていますが、
現実的にはそんなことなく、
むしろVBAの価値が上がったんじゃないかと思っています。

私の会社でもSAASを導入していて
システムが乱立しています。

そうすると、以下のような悲惨な状況が発生します。

  1. それぞれのシステムでID管理をしなければいけない
    ⇒変更があればシステムのマスタをそれぞれ変更
  2. データの連携業務が必要
    ⇒データの加工が必要になる

①についてピックアップしてみます。

例えば、株式会社野島ファイナンスの管理に
複数のシステムを利用していたと仮定します。

①売上処理でシステムA(ID:1000)
②顧客管理でシステムB(ID:AB1400)
③売上を加工するためのシステムC(要はSQLのノーコードツール、ID:SS500)

もし野島ファイナンスが野島金融に名前変更したら
全てのシステムを変更しなければいけません。

もしこれらのシステムがデータの取り込みと吐き出しができるシステムであれば
以下のようなエクセルとVBA管理をすれば管理を一元化できます。

Sub replace_name()
    Dim ID As Long
    Dim rename As String
    ''''''''''''''''''''''''''''''''''''''''''''''''''
    '''IDに登録変更したい案件のID番号を入れておく
    '''renameに変更したい名前を入れておく
    ''''''''''''''''''''''''''''''''''''''''''''''''''
    ID = 1
    rename = "野島金融(仮)"
    
    'マスターから情報を取得
    Dim table As ListObject
    Dim r As Range
    Dim row As Long
    
    'テーブルからIDの行番号を取得
    Set table = ThisWorkbook.Worksheets("マスター").ListObjects(1)
    For Each r In table.ListColumns("ID").DataBodyRange
        If r.Value = ID Then
            row = r.row
            Exit For
        End If
    Next
    
    'それぞれのシステムの名前を変更
    Dim i As Long
    Dim maxRow As Long
    Dim arr As Variant
    
    For Each arr In Array("A", "B", "C")
        With Workbooks(arr & ".xlsx").Worksheets(1)
            maxRow = .Cells(Rows.Count, 1).End(xlUp).row
            For i = 2 To maxRow
                If .Cells(i, 1).Value = table.ListColumns(arr).Range(row).Value Then
                    .Cells(i, 2).Value = rename
                    Exit For
                End If
            Next
        End With
    Next
End Sub
IDのマスターシートはこんな感じに作っておきます。
こんな感じで名前を変えることができます。
他のシステムも一元的に変更できています。

ぶっちゃけこのコードは突っ込みどころ満載です(笑)
列を数字で指定しているので列の位置が変わるとエラー起こしますし、
コードもわかりにくいのでもっと関数で小分けするべきです。

ただ、こういったコードがさらっとかけることによって
SAASなど会社で導入されているツールをうまく業務効率化につなげることができます。

VBAは非ITエンジニアでも学びやすい

VBAは比較的学びやすいプログラミング言語です。

これはそのままVBAの長所となりますので、
詳細は後述します(こちらからジャンプします)が、

ざっくりいうと以下の通りです。

  • 学習範囲が狭い
  • コーディングとフィードバックが直感的
  • 環境構築不要
  • エディターがシンプル

詳しくは当ページの長所段落をご確認ください

VBAは比較的導入しやすい

エクセルを使用している会社は多いと思います。
基本的にはエクセルが使える環境であればVBAはなんの準備もせずすぐに使えます。

また、VBAはエクセルの延長であるため、
上司の理解も他のプログラミング言語より得られやすい傾向にあります。

これがPythonであれば、
PCの環境構築を行分ければならず、社内への許可が必須となります。

VBAを禁止しているところもあると思いますが
少なくとも個人業務の範囲であり、かつ、適切なプログラムが書けるのであれば
手動でやっているのと社内リスクは変わりません。

※これは私の意見です。
社内での導入は必ず自己責任でお願いいたします。

長所と短所を理解しよう【長所】

VBAを効率的に学ぶにはまずは
VBAの特徴(長所【メリット】とVBAの短所【デメリット】)を理解する必要があります。

まずはVBAの長所を整理してみましょう。

  • 学習範囲が絞られている
  • コーディングとフィードバックが直感的
  • 環境構築不要

学習範囲が絞られる

VBAは基本的にエクセルやアウトルックなど
Office製品の自動処理を目的とします。

したがって、操作の範囲が限定的(感覚的には9割がエクセル)なので
必要な知識の範囲が絞られます。

例えばネットワークやサーバーへアクセスする知識が不要です。

VBAはWeb操作なども原理的には行えますが、
基本的にはこれらをおすすめはしません。

そういった操作はPythonなどを使うとはるかに簡単に書け、
かつ、メンテナンスもかなり楽になるからです。

家を作るのに大工さんはたくさんの道具を使い分けると思います。
簡単な犬小屋であればのこぎりとトンカチだけで何とかなるかもしれませんが、
家を作るのはかなり難しいと思います。

Office製品以外を操作したくなったらVBAの卒業時期と思うべきです。
Pythonの検討を考えましょう。

会社への導入説明が障壁となりますが、
おそらくここまで効率化できているのなら、
理解してもらえる可能性も低くないはずです。

コーディングとフィードバックが直感的

例えばシート「Sheet1」のA1に「テスト」と入力したいとします。
コードは以下のように書けます。

Sub test()

ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "テスト"

End Sub

コード自体もかなり直感的だと思います。

また、このプログラムを実行した場合の結果ですが、
以下のようになります。

結果の確認もかなり直感的に進めることができます。

VBAだけやっているとなかなか気づかないですが、

私がPythonを学習しているとき、
サーバーへのアクセス(HTTP通信)が直感的には理解しづらく、苦労しました。

普段、HTTP通信を意識しながらインターネットを活用している人は少ないと思います。
そういう意味ではVBAはかなりなじみ易い言語といえます。

環境構築不要

もしVBAを始めたいと思い、かつ、エクセルを操作できる環境にあるなら
することはあと一つ!

エクセルを開いてAlt + F11 を押すだけ!!

これだけでもうプログラムを書く準備はできました。
おめでとうございます。

ちなみにPythonは
英語で書かれたサイトに行って
めちゃくちゃたくさんあるリンクの中からたった一つ正解のリンクをクリックして
必要なファイルをダウンロードして、インストールして
必要なライブラリをインストールして、
エディタをインストールして…

たぶん、初心者には高いハードルが何重にも存在します。。。。

エディターがシンプル

エディターとはプログラムを書くための
編集画面のことを指します。

VBAって実はかなり古いプログラミング言語で
アップデートもほとんどされていないそうです。

一見デメリットのようですが、
その分機能もかなりシンプルです。

私の実体験としては
エディターはシンプルな方が最初は迷わなくていいので
むしろありがたかったです。

長所と短所を理解しよう 【短所】

長所があれば短所が必ずあります。

VBAの短所もきちんと把握しておきましょう。

  • 言語としての更新が止まっている
  • オンライン化に対応していない(定期実行が難しい)
  • 配列、辞書、クラスなど基本的な機能が不親切

配列、辞書、クラスなどの機能が不親切

例としてVBAの配列の不親切さを説明します。

配列とは、数値や文字列をグループにして処理するための概念です。

例えば部署のメンバに佐藤さん、鈴木さん、田中さんがいる場合
[“佐藤”,”鈴木”,”田中”]となります。

これに加藤さんを追加する場合、
Pythonであれば一行で終わります。

VBAの場合は以下のことを考え、記述しなければいけません。

  • 配列は空?それとももう何か入ってる?
  • 配列の要素数(入っている数、[佐藤、鈴木、田中]であれば3つ)の変更
  • 配列の追加コード

配列はプログラミングの基本なのに
こんな面倒なことをやらなければいけません。

この不便さを補うために関数をバンバン作って補っています。
こちらをクリックするとページ内の該当段落にジャンプします。

言語としての更新が止まっている

VBAは言語としてのアップデートがありません。
それにより機能がかなり古くなっています。

例えば、長所でも挙げたエディターについてですが、
私が普段から不満に思っている点の一部です。

  • コード内の検索が不親切
    (いちいちCtrl+Fで検索ボックスを呼び出さないといけない)
  • 同一の変数名を変えるのが面倒
    (これも検索と同じ。Ctrl+Hで呼び出して処理)
  • 変数名のインテリセンスがない
    (変数の最初の文字を打っても予測変換されない)

エディターを使ったことがあれば理解してもらえると思いますが、
別になくてもいいが、ないとコーディングが遅くなる。

痒い所に手が届かないもどかしさがあります。

オンライン化に対応していない(定期実行が難しい)

VBAは基本的には定期実行には向きません。
基本的にはローカル(自分のPC内)で動かすことが前提となり、
実行するための条件(=トリガー)を設定するという概念もありません。

例えば、GASであればクラウド上で定期実行可能ですし、
Pythonなども環境を整えることで定期実行可能です。

VBAはこの定期実行を行うための構築がかなり難しい…
定期実行させるためにはPCを常時稼働させる必要があります。

例えば、メールを受信して即座に作動させるためには
PCを一台24時間稼働させる必要があります。

VBAの短所を補うためには

VBAを学習するためには

VBAを学習するためにはUdemyがおすすめです。