Excel VBAチュートリアル– VisualBasicを使用してスプレッドシートにコードを記述する方法

前書き

これは、Visual Basic for Applications(VBA)を使用してExcelスプレッドシートにコードを記述する方法に関するチュートリアルです。

Excelは、Microsoftで最も人気のある製品の1つです。2016年、マイクロソフトのCEOは、「Excelのない世界について考えてみてください。それは私には不可能です」と述べました。ええと、世界はExcelなしでは考えられないかもしれません。

  • 1996年には、Microsoft Excel(ソース)のユーザーは3,000万人を超えました。
  • 今日、MicrosoftExcelの推定7億5000万人のユーザーがいます。これはヨーロッパの人口より少し多く、1996年の25倍のユーザーです。

私たちは1つの大きな幸せな家族です!

このチュートリアルでは、VBAと、VisualBasicを使用してExcelスプレッドシートにコードを記述する方法について学習します。

前提条件

このチュートリアルを理解するために、事前のプログラミング経験は必要ありません。ただし、次のものが必要になります。

  • MicrosoftExcelの基本から中級の知識
  • この記事のVBAの例をフォローしたい場合は、Microsoft Excel、できれば最新バージョン(2019)にアクセスする必要がありますが、Excel2016とExcel2013は問題なく動作します。
  • 新しいことに挑戦する意欲

学習目標

この記事の過程で、次のことを学びます。

  1. VBAとは
  2. VBAを使用する理由
  3. VBAを作成するためにExcelで設定する方法
  4. VBAで実際の問題を解決する方法

重要な概念

このチュートリアルを完全に理解するために知っておく必要のあるいくつかの重要な概念を次に示します。

オブジェクト:Excelはオブジェクト指向です。つまり、Excelウィンドウ、ブック、シート、グラフ、セルなど、すべてがオブジェクトです。VBAを使用すると、ユーザーはExcelのオブジェクトを操作してアクションを実行できます。

オブジェクト指向プログラミングの経験がなく、これがまったく新しい概念である場合は、少し時間を取ってそれを理解してください。

プロシージャ:プロシージャは、Visual Basic Editorで記述された、タスクを実行するVBAコードのチャンクです。これは、マクロと呼ばれることもあります(以下のマクロの詳細)。手順には2つのタイプがあります。

  • サブルーチン:1つ以上のアクションを実行するVBAステートメントのグループ
  • 関数:1つ以上のアクションを実行し、1つ以上の値を返すVBAステートメントのグループ

注:サブルーチン内で動作する関数を持つことができます。後でわかります。

マクロ:より高度なExcel機能の学習に時間を費やしたことがあれば、おそらく「マクロ」の概念に遭遇したことでしょう。Excelユーザーは、ユーザーコマンド/キーストローク/クリックで構成されるマクロを記録し、それらを超高速で再生して、反復的なタスクを実行できます。記録されたマクロはVBAコードを生成し、それを調べることができます。単純なマクロを記録してからVBAコードを確認するのは実際には非常に楽しいことです。

VBAプロシージャを手動でコーディングするよりも、マクロを記録する方が簡単で高速な場合があることに注意してください。

たとえば、プロジェクト管理で働いているかもしれません。週に1回、プロジェクト管理システムからエクスポートされた生のレポートを、リーダーシップのために美しくフォーマットされたクリーンなレポートに変換する必要があります。予算超過プロジェクトの名前を太字の赤いテキストでフォーマットする必要があります。フォーマットの変更をマクロとして記録し、変更が必要なときにいつでも実行できます。

VBAとは何ですか?

Visual Basic for Applicationsは、Microsoftによって開発されたプログラミング言語です。Microsoft Officeスイートの各ソフトウェアプログラムは、追加費用なしでVBA言語にバンドルされています。VBAを使用すると、Microsoft Officeユーザーは、MicrosoftOfficeソフトウェアプログラム内で動作する小さなプログラムを作成できます。

VBAは、レストラン内のピザオーブンのようなものだと考えてください。Excelはレストランです。キッチンには、大型冷蔵庫、ストーブ、通常のオーブンなどの標準的な業務用電化製品が付属しています。これらはすべてExcelの標準機能です。

しかし、薪で焼いたピザを作りたい場合はどうでしょうか。標準的な市販のベーキングオーブンではそれを行うことはできません。VBAはピザオーブンです。

ヤム。

ExcelでVBAを使用する理由

薪焼きピザが最高だから!

しかし、真剣に。

多くの人が仕事の一環としてExcelで多くの時間を過ごします。Excelの時間も異なります。状況によっては、Excelでの10分間は、必要なことができない場合は永遠のように感じることがあります。すべてが順調に進んでいる場合は、10時間は非常に速く経過する可能性があります。それはあなたが、自分自身に問う必要がある場合で、なぜ地球上で私はExcelで10時間を過ごすのですか?

時々、それらの日は避けられません。しかし、Excelで毎日8〜10時間繰り返しタスクを実行したり、同じプロセスを何度も繰り返したり、ファイルの他のユーザーの後でクリーンアップを試みたり、Excelファイルに変更を加えた後に他のファイルを更新したりする場合は、 VBAプロシージャが解決策になるかもしれません。

次のことが必要な場合は、VBAの使用を検討する必要があります。

  • 反復的なタスクを自動化する
  • ユーザーがスプレッドシートを操作するための簡単な方法を作成する
  • 大量のデータを操作する

ExcelでVBAを作成するための準備

[開発者]タブ

VBAを作成するには、リボンに[開発者]タブを追加する必要があるため、このようなリボンが表示されます。

[開発者]タブをリボンに追加するには:

  1. [ファイル]タブで、[オプション]> [リボンのカスタマイズ]に移動します。
  2. [リボンのカスタマイズ]および[メインタブ]で、[開発者]チェックボックスをオンにします。

タブを表示した後、チェックボックスをオフにするか、Excelを再インストールする必要がない限り、[開発者]タブは表示されたままになります。詳細については、Microsoftのヘルプドキュメントを参照してください。

VBAエディター

[開発者]タブに移動し、[VisualBasic]ボタンをクリックします。新しいウィンドウがポップアップします-これはVisualBasicEditorです。このチュートリアルでは、プロジェクトエクスプローラーペインとプロパティプロパティペインに精通している必要があります。

ExcelVBAの例

まず、遊んでみるためのファイルを作成しましょう。

  1. 新しいExcelファイルを開く
  2. マクロ対応のブック(.xlsm)として保存します
  3. [開発者]タブを選択します
  4. VBAエディターを開きます

Visual Basicを使用してスプレッドシートにコードを記述できるように、簡単な例をいくつか紹介してみましょう。

例1:ユーザーがExcelブックを開いたときにメッセージを表示する

VBAエディターで、[挿入]-> [新しいモジュール]を選択します

モジュールウィンドウにこのコードを記述します(貼り付けないでください!):

サブAuto_Open()

MsgBox( "XYZワークブックへようこそ。")

エンドサブ

ブックを保存して閉じ、ブックを再度開きます。このダイアログが表示されます。

タダ!

どうですか?

プログラミングに精通していることによっては、いくつかの推測があるかもしれません。それは特に複雑ではありませんが、かなり多くのことが起こっています:

  • Sub(「サブルーチン」の略):最初から、「1つ以上のアクションを実行するVBAステートメントのグループ」を覚えておいてください。
  • Auto_Open:これは特定のサブルーチンです。Excelファイルが開くと、コードが自動的に実行されます。これは、プロシージャをトリガーするイベントです。Auto_Openは、ブックが手動で開かれた場合にのみ実行されます。ブックが別のブックのコードを介して開かれている場合は実行されません(Workbook_Openが実行します。2つの違いの詳細を確認してください)。
  • デフォルトでは、サブルーチンのアクセスはパブリックです。これは、他のモジュールがこのサブルーチンを使用できることを意味します。このチュートリアルのすべての例は、パブリックサブルーチンになります。必要に応じて、サブルーチンをプライベートとして宣言できます。これは、状況によっては必要になる場合があります。サブルーチンアクセス修飾子の詳細をご覧ください。
  • msgBox:これは関数です-1つ以上のアクションを実行して値を返すVBAステートメントのグループ。戻り値は、「XYZワークブックへようこそ」というメッセージです。

要するに、これは関数を含む単純なサブルーチンです。

いつ使用できますか?

非常に重要なファイルが頻繁に(たとえば、四半期に1回)アクセスされるが、別のVBAプロシージャによって毎日自動的に更新される場合があります。アクセスされると、会社全体の複数の部門の多くの人々によってアクセスされます。

  • 問題:ユーザーがファイルにアクセスするとき、ほとんどの場合、このファイルの目的(ファイルが存在する理由)、ファイルが頻繁に更新される方法、ファイルを管理するユーザー、およびファイルを操作する方法について混乱します。新入社員には常にたくさんの質問があり、あなたはこれらの質問に何度も何度も答えなければなりません。
  • 解決策:これらの頻繁に回答される質問のそれぞれに対する簡潔な回答を含むユーザーメッセージを作成します。

実際の例

  • MsgBox関数を使用して、ユーザーがExcelブックを閉じる、ユーザーが印刷する、新しいシートがブックに追加されるなどのイベントが発生したときにメッセージを表示します。
  • ユーザーがExcelブックを閉じる前に条件を満たす必要がある場合は、MsgBox関数を使用してメッセージを表示します。
  • InputBox関数を使用して、ユーザーから情報を取得します

例2:ユーザーに別の手順の実行を許可する

VBAエディターで、[挿入]-> [新しいモジュール]を選択します

モジュールウィンドウにこのコードを記述します(貼り付けないでください!):

サブUserReportQuery()

UserInputを暗くする

整数としての薄暗い回答

UserInput = vbYesNo

Answer = MsgBox( "XYZレポートを処理しますか?"、UserInput)

Answer = vbYesの場合ProcessReport

エンドサブ

サブProcessReport()

MsgBox(「XYZレポートを処理していただきありがとうございます。」)

エンドサブ

保存してExcelの[開発者]タブに戻り、[ボタン]オプションを選択します。セルをクリックして、UserReportQueryマクロをボタンに割り当てます。

次に、ボタンをクリックします。このメッセージは次のように表示されます。

「はい」をクリックするか、Enterキーを押します。

もう一度、多田!

2番目のサブルーチンであるProcessReportは何でもかまいません。例3でさらに多くの可能性を示します。でもまず...

どうですか?

この例は前の例に基づいており、かなりの数の新しい要素があります。新しいものを見てみましょう:

  • Dim UserInput As Long:Dimは「dimension」の略で、変数名を宣言できます。この場合、UserInputは変数名であり、Longはデータ型です。平易な英語では、この行は「これが「UserInput」と呼ばれる変数であり、Long変数タイプです」という意味です。
  • Dim Answer As Integer:データ型がIntegerの「Answer」という別の変数を宣言します。データ型の詳細については、こちらをご覧ください。
  • UserInput = vbYesNo:変数に値を割り当てます。この場合、vbYesNoは、[はい]ボタンと[いいえ]ボタンを表示します。多くのボタンタイプがあります。詳細はこちらをご覧ください。
  • Answer = MsgBox( "Process the XYZ Report?"、UserInput):変数Answerの値をMsgBox関数とUserInput変数に割り当てます。はい、変数内の変数です。
  • If Answer = vbYes Then ProcessReport:これは「Ifステートメント」であり、xが真であるかどうかを判断できる条件ステートメントであり、yを実行します。この場合、ユーザーが「はい」を選択した場合は、ProcessReportサブルーチンを実行します。

いつ使用できますか?

これは、さまざまな方法で使用できます。この機能の価値と多様性は、2次サブルーチンの機能によってさらに明確になります。

たとえば、3つの異なる週次レポートを生成するために使用されるファイルがあるとします。これらのレポートは、劇的に異なる方法でフォーマットされています。

  • 問題:これらのレポートのいずれかを生成する必要があるたびに、ユーザーはファイルを開き、フォーマットとグラフを変更します。などなど。このファイルは、少なくとも週に3回広範囲に編集されており、編集されるたびに少なくとも30分かかります。
  • 解決策:レポートタイプごとに1つのボタンを作成します。これにより、レポートの必要なコンポーネントが自動的に再フォーマットされ、必要なチャートが生成されます。

実際の例

  • ユーザーが複数のシートに特定の情報を自動的に入力するためのダイアログボックスを作成する
  • InputBox関数を使用してユーザーから情報を取得し、それを複数のシートに入力します

例3:For-Nextループを使用して範囲に数値を追加する

forループは、特定の範囲の値(配列またはセル範囲)で繰り返しタスクを実行する必要がある場合に非常に役立ちます。平易な英語では、ループは「xごとにyを実行する」と言います。

VBAエディターで、[挿入]-> [新しいモジュール]を選択します

モジュールウィンドウにこのコードを記述します(貼り付けないでください!):

サブLoopExample()

Dim X As Integer

X = 1から100の場合

Range( "A"&X).Value = X

次のX

エンドサブ

保存してExcelの[開発者]タブに戻り、[マクロ]ボタンを選択します。LoopExampleマクロを実行します。

これは起こるはずです:

など、100行目まで。

どうですか?

  • Dim X As Integer:変数Xを整数のデータ型として宣言します。
  • X = 1から100の場合:これはForループの開始です。簡単に言えば、X = 100になるまで繰り返し続けるようにループに指示します。Xはカウンターです。ループはX = 100まで実行を続け、最後にもう一度実行してから停止します。
  • Range( "A"&X).Value = X:これは、ループの範囲とその範囲に何を入れるかを宣言します。最初はX = 1なので、最初のセルはA1になり、その時点でループはXをそのセルに配置します。
  • 次のX:これはループに再度実行するように指示します

いつ使用できますか?

For-Nextループは、VBAの最も強力な機能の1つです。多くの潜在的なユースケースがあります。これは、ロジックの複数のレイヤーを必要とするより複雑な例ですが、For-Nextループの可能性の世界を伝えます。

たぶん、A列にパン屋で販売されているすべての製品のリスト、B列に製品の種類(ケーキ、ドーナツ、またはマフィン)、C列に材料のコスト、および各製品タイプの市場平均コストが別のシート。

各製品の小売価格を把握する必要があります。あなたはそれが材料のコストに20%を加えたものであるべきだと考えていますが、可能であれば市場平均よりも1.2%下回っています。For-Nextループを使用すると、このタイプの計算を実行できます。

実際の例

  • ネストされたifステートメントを含むループを使用して、特定の条件を満たす場合にのみ特定の値を別の配列に追加します
  • 範囲内の各値に対して数学的な計算を実行します。たとえば、追加料金を計算して値に追加します。
  • 文字列内の各文字をループして、すべての数値を抽出します
  • 配列からいくつかの値をランダムに選択します

結論

ピザとマフィンについて説明したので、ExcelスプレッドシートでVBAコードを作成する方法について説明しました。次に、学習チェックを行います。これらの質問に答えられるかどうかを確認してください。

  • VBAとは何ですか?
  • ExcelでVBAの使用を開始するように設定するにはどうすればよいですか?
  • なぜ、いつVBAを使用しますか?
  • VBAで解決できる問題は何ですか?

これらの質問にどのように答えることができるかについて公正な考えを持っているなら、これは成功しました。

たまに使用するユーザーでもパワーユーザーでも、このチュートリアルで、Excelスプレッドシートのほんの少しのコードで何ができるかについての役立つ情報が提供されたことを願っています。

ハッピーコーディング!

学習リソース

  • ダミーのためのExcelVBAプログラミング、ジョン・ヴァルケンバッハ
  • VBA、Microsoftドキュメントの使用を開始する
  • LyndaのExcelでVBAを学ぶ

私について少し

オレゴン州ポートランドのアーティスト兼開発者であるクロエ・タッカーです。元教育者として、私は学習と教育、またはテクノロジーとアートの交差点を絶えず探しています。Twitter @_chloetuckerで私に連絡し、chloe.devで私のウェブサイトをチェックしてください。