\r\n\r\n
Excelマクロは、頻繁に使用するExcelの処理を自動化することで、多くの時間を節約することができます。しかし、マクロは実は非常に限定的なものなのです。録音ツールはエラーが出やすく、録音作業もぎこちない。
VBAを使ってマクロを作成すると、さらに高機能になります。Excelに何をどのように行うかを正確に指示することができます。また、さらに多くの機能と性能を利用することができます。Excel を定期的に使用するのであれば、VBA マクロの作成方法を学ぶ価値があります。
まずは基本から。
VBAはvisualbasicforapplicati***で、多くのMicrosoftアプリケーションで使用できるプログラミング言語です。visualbasicはプログラミング言語で、VBAはそのアプリケーション特化型バージョンです。(マイクロソフトは2008年にvisualbasicを廃止しましたが、VBAは今でも非常に強力です)。
幸いなことに、プログラマーではない人にとってVBAは非常にシンプルで、編集に使用するインターフェースも多くのヘルプを提供してくれます。ポップアップのサジェストや多くのコマンドのオートコンプリートを使って、スクリプトを素早く実行することができます。
しかし、VBAは慣れるまで時間がかかる。
マクロを記録するよりも難しいのに、なぜVBAを使うのか?一言で言えば、VBAのマクロの方が強力です。
クリックし、そのクリックをスプレッドシートに記録する代わりに、Excelのすべての機能と特徴を利用することができます。使いこなせればいいんです。
VBAに慣れてくれば、通常のマクロでやりたいと思うようなことはすべて短時間でできるようになります。また、Excelに何をすべきかを指示するため、結果をより予測しやすくなります。曖昧さがまったくないんです。
一度作成したVBAマクロを保存し、他の人が利用できるように共有することも簡単です。特に、多くの人がExcelで同じ操作をする必要がある場合に有効です。
簡単なVBAマクロで、その仕組みを見てみましょう。
簡単なマクロを見てみましょう。スプレッドシートには、従業員の名前、勤務先の店舗番号、四半期ごとの売上高が含まれています。
このマクロは、各ショップの四半期ごとの売上を加算し、その合計をスプレッドシートのセルに書き込みます(VBAダイアログボックスへのアクセス方法が分からない場合は、こちらのVBAウォークスルーをご覧ください)。
Sub StoreSales()Dim Sum1 As CurrencyDim Sum2 As CurrencyDim Sum3 As CurrencyDim Sum4 As CurrencyFor Each Cell In Range("C2:C51") Cell.Activate If IsEmpty(Cell) Then Exit For If ActiveCell.Offset(0, -1) = 1 Then Sum1 = Sum1 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 2 Then Sum2 = Sum2 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 3 Then Sum3 = Sum3 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 4 Then Sum4 = Sum4 + Cell.ValueEnd IfNext Cell Range("F2").Value = Sum1Range("F3").Value = Sum2Range("F4").Value = Sum3Range("F5").Value = Sum4 End Sub長く複雑に見えるかもしれませんが、個々の要素を確認し、VBAの基本をある程度理解できるように分解して説明します。
モジュールの冒頭には「Sub StoreSales()」があります。これは、StoreSalesという新しいサブクラスを定義しています。
関数も定義できますが、関数は値を返すのに対し、subは返せないという違いがあります(他のプログラミング言語に詳しい方なら、subはメソッドと同じ意味です)。この場合、値を返す必要はないので、subを使います。
モジュールの最後には、VBAマクロの完成をExcelに伝える "end Sub "があります。
スクリプトの最初の行はすべて、変数を宣言するためのVBAコマンドである「Dim」で始まっています。
そこで、"Dim Sum1 "は "Sum1 "という新しい変数を作成します。しかし、これがどのような種類の変数であるかをExcelに伝える必要があります。データ型を選択する必要があります。VBAにはさまざまなデータ型があり、Microsoftのヘルプドキュメントに一覧が掲載されています。
今回のVBAマクロは通貨を扱うので、通貨データ型を使用します。
Dim Sum1 As Currency "というステートメントは、ExcelにSum1という新しい通貨変数を作成するように指示します。宣言する各変数は、Excelにその型を伝えるための "As "ステートメントを持つ必要があります。
ループは、どんなプログラミング言語でも作ることができる最も強力なものの一つです。ループに馴染みのない方は、Do Whileループの解説をご覧ください。この例では、この記事でも取り上げているForループを使用しています。
そのサイクルは以下の通りです。
For Each Cell in Range("C2:C51")[a bunch of stuff]Next Cellこれは、指定された範囲のセルを繰り返し処理するようにExcelに指示します。VBAの特殊なオブジェクトであるRangeオブジェクトを使用します。このように、Range("C2:C51")という使い方をすると、Excelに「この50個のセルに興味がある」ということが伝わります。
「For each cell" は、範囲内の各セルに対して何らかの処理を行うことをエクセルに指示します。 Next cell" は、やりたいことをすべて行い、ループを最初から始める(次のセルから始める)ことをエクセルに指示します。
また、"If IsEmpty (Cell), then Exit For "というフレーズもあります。
何に使うかわかりますか?
注:厳密にはWhileループを使った方が良いのでしょうが、教育的な観点から、exit付きのforループを使うことにしました。
このマクロの核となるのが、If-Then-Else文です。
If ActiveCell.Offset(0, -1) = 1 Then Sum1 = Sum1 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 2 Then Sum2 = Sum2 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 3 Then Sum3 = Sum3 + Cell.Value ElseIf ActiveCell.Offset(0, -1) = 4 Then Sum4 = Sum4 + Cell.ValueEnd Ifこれらの文言が何を意味するかは、ある程度想像がつくでしょう。アクティブセルオフセット」というのは聞き慣れないかもしれませんが。"アクティブセルオフセット (0, -1)" は、アクティブセルの左側の列のセルを参照するようExcelに指示します。
この例では、storenumber列に問い合わせをするようにExcelに指示しています。Excel が列に 1 を見つけると、アクティブセルの内容を取得し、Sum1 に追加します。2 が見つかった場合、アクティブなセルの内容が Sum2 に追加されます。といった具合に。
Excelは、これらすべてのステートメントを順番に繰り返し実行します。条件文が満たされれば、Then文が完成する。最後まで行って条件を満たさない場合は、何もしない。
マクロは、ループと条件の組み合わせで駆動します。ループは、選択されたコンテンツの各セルを繰り返し処理するようExcelに指示し、条件はそのセルに対して何を行うかをExcelに指示します。
最後に、計算結果をセルに書き込む。これを行うために使用した行は以下の通り。
Range("F2").Value = Sum1Range("F3").Value = Sum2Range("F4").Value = Sum3Range("F5").Value = Sum4.Value "と等号を使って、これらのセルにそれぞれ変数の値を設定する。
これで完了です!「end sub」を使ってExcelにサブを書いたことを伝え、VBAマクロが完成したことを知らせます。
開発者」タブの「マクロ」ボタンでマクロを実行すると、次のような結果が得られます。
上のVBAマクロを最初に見たとき、かなり複雑に見える。しかし、それを構成要素に分解してみると、その理屈は明らかになる。他のスクリプト言語と同様、VBAの構文に慣れるには時間がかかります。
しかし、練習すれば、VBAの語彙が増え、より速く、より正確にマクロを書けるようになり、記録するよりもずっと上手になるのです。
VBAで困ったときは、Googleで検索するのが手っ取り早いです。もし、技術的な回答を得るために掘り下げるのであれば、マイクロソフトのexcelvbaのリファレンスが参考になるかもしれません。
基本的な使い方に慣れたら、Excelからのメール送信、Outlookのタスクのエクスポート、PC情報の表示など、VBAを使い始めることができます。