本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[XL5] Q&A (VBA 紹介編)

文書番号: 401699

最終更新日: 2004/03/08


この資料は以下の製品について記述したものです。


概要

本文書は、Excel 5.0 の Microsoft(R) Visual Basic(R) Programming System Applications Edition (以下 VBA) に関する Q&A 集です。とくにこの「 VBA 紹介編」 では VBA の世界を知らない方のための情報を集めています。
Excel 5.0 のヘルプには多くの情報が記述されています。

まず [?] - [製品サポート] コマンドを選択してください。この中には、Excel をお使い頂く上でのご注意や Q&A 集など、オフィシャル ユーザー サポートからの情報が登録されています。 ここでは、その中に重複するものもありますが、書き漏れているもの、補足説明が必要なものを用意しました。新しい情報が入りしだい、更新していきます。

詳細

VBA の位置付け

質問

VBA は Microsoft(R) Windows(TM) (以下 Windows) の共通言語なのですか。また、 全ての Windows アプリケーションから利用できるのですか。

回答

VBA はマイクロソフトの Windows アプリケーションに共通の言語としてデザインされました。Excel 5.0 を第一弾として、順次ほかのマイクロソフトのアプリケーションに搭載されていく予定です。これはアプリケーションのレベルの話であり、 OS (オペレーション システム) である Windows の共通言語ではありません。そのた め、他社の Windows アプリケーションが採用する必要性はありません。ロータス社 やジャスト システム社などの何社かは独自のアプリケーション言語を用意されています。当面互換性はありませんが、将来的に OLE 2.0 の OLE オートメーション機能 を要として相互利用が可能になるかもしれません。

VBA 習得の必要性

質問

ニュースや雑誌では VBA のことがよく取り上げられています。Excel 5.0 を使いこなすには、VBA をどうしても勉強しなければならないのでしょうか。

回答

VBA はエンドユーザー言語として、C や Assembler とは異なった言語としてジャンル分けされます。一般の開発用の言語とは異なり、これらのエンドユーザー言語 は、実行速度や小回りといった点での制限がありますが、取り組みやすく、比較的短時間で十分な成果をあげることができます。

しかしすべての人が VBA をマスターする必要があるわけではありません。VBA で できることは、多少の手間さえかければ手作業でも行えます。VBA を使用するメリットは、これらの手間を避けることにあります。VBA は簡単だとは言っても「コン ピュータ言語」です。それ相応の学習は欠かせません。

企業内の社内開発部門のエンジニアの方々、サードパーティで Excel 5.0 の周辺 アドイン ソフトウェアを作られる方々、セミ オーダーでシステムを組まれる受託 開発およびコンサルティングを仕事とされる方々が、業務を運営される方のために システムを組んでいただけれるには最適な言語であると考えています。

「 Excel 4.0 マクロ」から VBA に移行する必要性

質問

Excel 5.0 で初めて採用された VBA ですが、Microsoft(R) Excel for Windows(TM) Version 4.0(以下 Excel 4.0) 以前に作成したマクロ (以下 Excel 4.0 マクロ) を移植してでも移行する価値はありますか。

回答

VBA は「 Excel 4.0 マクロ」の機能のほとんどを肩代わりし、さらにいくつもの大きなメリットがあります。今後作成されるマクロでは VBA を検討する価値は十分にあります。また、VBA は将来のマイクロソフト製アプリケーションの標準言語となりますので、これを学ぶことは他のアプリケーションを使うにも役にたちます。

しかし、これまでに完成した「 Excel 4.0 マクロ」の資産を VBA に移植する必要はないかもしれません。Excel 5.0 では「 Excel 4.0 マクロ」をほとんどそのままで利用することができます。「 Excel 4.0 マクロ」から部分的に VBA を利用するこ とも、その逆もできます。「 Excel 4.0 マクロ」で作成されたアプリケーションの機能アップをはかるときには、部分的に VBA で書き直すこともあるかもしれませんし、追加する機能は VBA で書き起こすことがあるかもしれません。緩やかに、できる範囲で移行すれば良いでしょう。

「 Excel 4.0 マクロ」を VBA に変換する機能

質問

過去に作成したたくさんの 「 Excel 4.0 マクロ」の資産があります。VBA の良い
ところはわかったので、是非とも移行したいと考えています。「 Excel 4.0 マクロ」 を VBA に変換するような機能、またはツールはありますか。

回答

残念ながらそのような機能やツールはありません。技術的に言えば、「 Excel 4.0 マクロ」を VBA のコードに 1 対 1 に変換することは可能でしょう。しかしそれに意味 があるかは別の問題です。

まず第一に、「 Excel 4.0 マクロ」 の大部分 はそのままで Excel 5.0 で利用が可能です。Excel 5.0 で Excel 4.0 のマクロシートをオープンすれば Excel 5.0 で使用することのできるマクロとしてある程度自動的に変換してくれます。また、そのマクロを VBA からコールすることもできますので、二つの言語を共用することができます。第二に、「 Excel 4.0 マクロ」と VBA は、コーディングの構造が異な ります。そのまま 1 対 1 に変換することはできても VBA らしくないもの (VBA のメリ ットを享受できないもの) となるでしょう。

VBA に移行することを考えていらっしゃるのであれば、新規に追加するものは VBA で、既存のものはそのままお使いになられるのが良いでしょう。

なお、「 Excel 4.0 マクロ」のマクロ関数に対応する VBA のステートメントを調
べるときはオンラインヘルプを利用してください。[?] - [目次] コマンドを実行し、 目次から「 Microsoft Excel オンライン リファレンス」-「マクロ関数リファレンス」-「 Excel 4.0 マクロ → Visual Basic 対応表」を選択します。

「 Excel 4.0 マクロ」の今後

質問

これまでの「 Excel 4.0 マクロ」は将来無くなってしまうのでしょうか。

回答

マイクロソフトとしては、今後 VBA を積極的にすすめていきます。しかし Excel 5.0 で従来の「 Excel4.0 マクロ」に加え Excel 5.0 のコマンドに対応した関数を含めた、いわば「 Excel 5.0 マクロ」を残したことからもわかるとおり、世の中に多 くの「 Excel4.0 マクロ」の資産があることも、これらは簡単には移行できないことも 承知しています。おそらく次のバージョンではマクロの機能の拡張は行なわれなくと も「 Excel 5.0 (4.0) マクロ」が姿を消すことはないでしょう。十分に時間をかけて 調査をし、本当に不要になった時には VBA 一本になるでしょう。

VBA で Excel の関数を作れますか

質問

VBA はプログラミング言語だと聞きました。「 Excel 4.0 マクロ」でいう「関数マクロ」を作成し、 Excel 5.0 の機能を拡張するなどということもできるのでしょうか。

回答

Excel 4.0 マクロでいう「関数マクロ」と同じ意味では作れます。同じブック内のシートであれば、特にモジュールのシート名は指定する必要はありません。

[挿入] - [マクロ] - [モジュール] コマンドで新規にモジュールを用意し、
              Function Test(arg as Integer)
           Test = arg * 2
              End Function
とコーディングすれば、Sheet1 でも Sheet2 でも任意のセルに
              =Test(10)
と入力しますと、 20 という値が返されます。名前定義の必要はありません。つまりブック内でグローバルな名前として自動的に登録されるのです。もちろんアドインとして登録も可能です。

VBA と Access や Word の BASIC との違い

質問

VBA と Microsoft Access(R) (以下 Access) や Microsoft(R) Word for Windows(TM) (以下 Word) の Basic とは違うものなのですか。

回答

VBA 以前のマイクロソフトの日本語版アプリケーションに組み込まれた言語には、次のようなものがあります。
          Excel 4.0 ... Excel マクロ
          Access Version 1.1... Access マクロ
          Access Version 1.1... Access Basic
          Word Version 5.0... Word Basic
前者二つのマクロと後者二つの Basic はまるで違うものです。それぞれのマクロと Basic はかなり似てはいますが、同一とは言えません。これはそれぞれのアプリケーションの特徴を生かすために独自に作られたものですので仕方のないところです。 VBA は後者二つの Basic と似てはいますが、大きく拡張されています。しかも、今後登場する VBA をサポートするであろうアプリケーションすべてのことも考えて作られたものです。

VBA と VBW の違い

質問

現在 Microsoft(R) Visual Basic(R) Programming System for Windows(TM)
Version 2.0 (以下 VBW) を使用しています。Excel 5.0 の VBA は VBW とどう違う
のですか。

回答

VBA は VBW より、よりオブジェクト志向化された言語です。変数や制御構造、ス
テートメントには大きな違いはありませんが、Excel 5.0 の要素 (ブック、ワーク
シート、メニュー、ツールバーなど) がすべてオブジェクト化されています。そし
て、これらオブジェクトの関係はコンテナの概念を使い、より明確にされています。 このためオブジェクトの指定方法は、やや異なったものとなります。また文法的に拡張された部分、OLE 2.0 の OLE オートメーションのサポートなど追加された機能もあります。

VBW は現在日本では 2.0、米国では 3.0 が最新のバージョンですが、次期バージョンでは VBA が採用される予定です。この点では Excel 5.0 が VBW に一歩先んじていると言えます。しかし、Excel 5.0 の VBA が VBW の肩代わりができるというこ とではありません。VBW は独立した実行ファイルを作成するものですし、作成するア プリケーションの種類は特定できません。これに対し (Excel 5.0 の) VBA は Excel 5.0 という枠の中にあるものですので、Excel 5.0 とは直接結び付かない機能は含ま れていないケースがあります。現在のところ VBA があるからといって、VBW が必要なくなるというものではありません。

VBW に対する具体的な拡張点

質問

VBW と比較して VBA はどんな点が拡張されているのですか。

回答

可能な限りのオブジェクト化

VBA の中ではほとんどあらゆるものがオブジェクト化されています。そしてこれが、VBW ユーザーにとって最も大きな障害となるかもしれません。オブジェクトのコレクション、コンテナの新しい概念、プロパティとメソッドの意味合いも多少変わった感じを受けるでしょう。

例えば、Cells はメソッドですが、その使用例を見ると、
                  Application.Cells(5, 3).Font.Size = 14
というように、更に「.」で「 Font.Size 」が続いています。VBW では考えにくい記述ですが、Cells は、対象のオブジェクトが Application であるときには、ワークシート上のセルのコレクションを返すメソッドであると解釈できます。そしてそのコレクションの Font オブジェクトのプロパティが Size であるために、このような記述が成り立つのです。

OLE オートメーション

OLE 2.0 の機能を利用した外部アプリケーションへのプログラミング インター フェイスです。具体的な例では、Excel 5.0 の VBA のプロシージャの中に Word のマクロなどを直接記述し、実行することができます。アプリケーション間でのデータの共有を行う際やプログラム間で同期をとるような作業を行う際には非常に重要な機能となります。

ただし OLE オートメーションを利用して定型業務アプリケーションなどを作成する際には、マクロやコマンドを提供するアプリケーションとそれを操作するアプリケーション双方で OLE オートメーションをサポートしていなければなりません。

現在、OLE オートメーションをサポートしている日本語アプリケーションは Excel 5.0 のみですが、今秋に発売されます Microsoft(R) Word for Windows (TM) Version 6.0 では OLE オートメーションをサポート (マクロインターフェ
イスのみ) しています。Excel 5.0 の VBA から Word Basic を呼び出すことができるように作成されています。

名前付き引数

オブジェクト志向型の言語の機能のひとつです。これまでの言語処理系は、プ
ロシージャに与える引数は、順番がとても重要な要素であり、引数の省略などは
行えませんでした (BASIC に組み込みのステートメントは別) 。
名前付き引数は、これらを意識することなく、コードを簡潔に読みやすくする
ことができます。

組み込み済み定数

VBW では True とか False といった一部の定数しか定義されていませんでした。
このため、良く使われる定数はテキスト ファイルとして読込んで使っていました
が、VBA ではそのステートメント、メソッド、プロパティで使われる値の多くが
あらかじめ組み込みの定数として定義されています。

With ~ End With ステートメント

例えばあるオブジェクトに対して複数のプロパティを一度に変えるには、プロ
パティと右辺だけを変更した同じステートメントを記述しなければなりません。
これに対し、VBA では以下のように記述することができます。
                    With MyLabel
                    .Height = 2000
                    .Width = 2000
                    .Caption = "ラベル 1"
                    End With
この例では、MyLabel というオブジェクトの高さ、幅およびキャプションをまとめて変更できます。このようにひとつのオブジェクトに対する操作をまとめて記述することはソースをすっきりと読みやすくするだけではなく、オブジェクトの参照が 1 回で済むことから、処理の高速化にも効果があります。

For Each ... Next 制御構造

配列やコレクションに対して、全ての要素にループを繰り返す制御構造で、コ
ードを短く完結に記述することができます。

可変長引数のサポート

ユーザーが定義したプロシージャの引数を可変長として設計できます。これは
内部的には配列として扱っています。

オブジェクト型変数のサポート

あらゆるオブジェクトを含めるオブジェクト型の変数をサポートしています。

日付型と日付リテラル

データ型としてあらたに日付型が加わりました。これは日付だけではなく、時
間も含めて扱うことができます。また、この型のために日付と時間専用のリテラル文字の記述がサポートされました。#94/03/18# というように、「#」で日付や時間データとして認識できる文字を囲みます。

プロパティ プロシージャ

モジュールに対して、プロパティを追加できます。

VBX の利用

質問

現在 VBW を使用しています。市販の VBX(Visual Basic eXtention) コントロー
ルを購入したのですが、とても便利なのでこれを VBA の中から利用したいと考えています。どうすれば良いでしょうか?

回答

VBX は、VBW 用の拡張コントロールで、DLL の一種として提供されています。これらの一部は Microsoft(R) Visual C++(TM) for Windows(TM) でも使用可能になっていますが、現在のところ、VBW 用と考えて良いでしょう。残念ながら VBW で使用される VBX は VBA 上では利用できません。

「 Excel 4.0 マクロ」から VBA プロシージャを呼ぶ方法

質問

すでに作成してある 全ての Excel 4.0 マクロを一度に VBA に移行することができませんので、サブルーチン単位で徐々に移行してゆきたいと思います。「 Excel 4.0 マクロ」から VBA モジュールをサブルーチンとして実行する方法を教えてください。

回答

「 Excel 4.0 マクロシート」から直接 VBA モジュール内のサブルーチンを呼び出すことが可能です。例えば以下のようなファイルが入っているブックファイルがあったとします。
                 Macro1        Excel 4.0 マクロシート
                 Module1Excel 5.0 VBA モジュール
Macro1 内のマクロから Module1 内の Test というサブルーチンを呼び出したい場合には次のようにマクロシートに記述します。マクロ「 CallTestMacro 」を実行すると、サブルーチン「 Test 」が呼び出され、メッセージボックスを表示します。
                  MacroCallTest
                  =Test()
                  =RETURN()
Module1 内の Test サブルーチンは以下のように記述されています。
                  Sub Test()
              MsgBox "Test Program !!"
                  End Sub

VBA プロシージャから「 EXCEL 4.0 マクロ」を呼び出す方法

質問

既に作成済みの「 Excel 4.0 マクロ」で書かれたサブルーチンがあります。一度
にすべて VBA に書き換えるのは大変ですので、これらを VBA のプロシージャから利用したいのですが、どのようにすればよいですか。

回答

関連する VBA メソッドには ExecuteExcel4Macro と Run の二つがあります。これは共に Excel 4.0 のマクロを実行するものです。ExecuteExcel4Macro メソッド は、Excel 4.0 のマクロ関数を実行するもので、ユーザーがローカルに定義したマクロは実行できません (もっとも、Excel 4.0 の RUN マクロ関数を実行させることで、間接的には呼び出すことができます) 。これに対し、Run メソッドは、直接ユーザー関数を呼び出すことができます。

以下にもっとも簡単な例を示します。例えば、Test という名前でユーザー定義の関数があったとし、これを VBA から呼び出すには、
                        Run "Test"
とするだけです。Run はメソッドですので、オブジェクトに付随するものです。この場合、オブジェクトは Application ですが、これは省略できます。また、呼び出したマクロが返す値を返すこともできますし、引数を持たせることもできます。これらを省略せずに記述するとすれば、
                        ret = Application.Run("Test",arg1,arg2)
というようになります。この例では、arg1 と arg2 という引数を二つつをもち、 ret に値を返しています。

Keywords: KBINFO KB401699
Technology: kbExcel500 kbExcelSearch kbExcelWinSearch

inserted by FC2 system