【お知らせ】カテゴリの見直しについて

VB6で開発をしています。
複数のEXEファイルを使用するシステムです。
各EXEファイルの共通のモジュールをライブラリ化しようと思っています。

これは [ActiveX DLL] 又は、[ActiveXコントロール] のどちらでも実現できると思うんですが、どちらで作成した方が良いのでしょうか?

それぞれのメリット、デミリットを教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

[共通点]


・どちらも単独のプロセスとして起動することはできない。

・どちらもCOMクライアントと同一のアドレス空間?(= インプロセス)で動作するので、ActiveX EXEより高速に動作する。
(DCOMを使えばアウトプロセスで動作させることも可能??)

[相違点]
・ActiveX DLLは任意のタイミングでインスタンスの生成/破棄が可能。

・ActiveX コントロールを使用するにはコンテナが必要。
コンテナがロードされている間は破棄出来ない。
(コンテナと寿命をともにするので、任意のタイミングで生成、破棄できない)



ロジックのみでUIを必要としないプログラムはActiveX DLLで、UIを必要とするプログラムはActiveX コントロール(OCX)として実装するのが一般的だと思います。

ちょっとあやふやですが、大体こんな感じでしょうか?(^^;
    • good
    • 1
この回答へのお礼

お返事ありがとうございます。
まだちょっと、わからないのですが。

例えば、ActiveX コントロール作成時に、プロジェクト内に簡単な計算をするクラスモジュールを追加します。(UIは用意しません。タイマーコントロールみたいな感じで実行時には非表示になります。)
アプリケーション側では、このクラスを使用するだけ。

この様な場合ですと、ActiveX DLLで作成したクラスを使用するのとどう違うのでしょうか?

お礼日時:2003/03/07 16:08

一意見ですが、上記の目的から行くと


>各EXEファイルの共通のモジュールをライブラリ化しようと思っています。
ActiveX.dll もしくは ActiveX.exe が
向いているように思えます。

ActiveXコントロールは
インターフェース(GUI)をもったコンポーネントです。
たとえば、ボタンや画像など、フォームごと、一緒にCOM化しちゃうものです。

ActiveX.dllは
コードコンポーネントとして利用しています。
処理を分割して、ライブラリのようにして利用するのに
向いていると思います。
これはインターフェースをもちません。
たとえば、外部のEXEから
独立したActiveX.dllの関数をコールして、処理をさせたり
戻り値を受け取ったりすることができます。
メリットは、DLLなので処理速度が速い。
デメリットは、インプロセスなので、
DLLでこけると、かなりのこけかたをする
(超アバウト・・・)

ちなみに、 ActiveX.exe も
コードコンポーネントとして利用できるのですが
これは、アウトプロセスで、
DLLに比べると処理は若干遅いけど
安全性が高いとのことです。

・・・でした
なんか、参考になれば幸いです
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
<No.1>nanashinogonbeiさんへのお礼文を入力している間にお返事をいただいたみたいで、同じ質問をさせていただきます。

例えば、ActiveX コントロール作成時に、プロジェクト内に簡単な計算をするクラスモジュールを追加します。(UIは用意しません。タイマーコントロールみたいな感じで実行時には非表示になります。)
アプリケーション側では、このクラスを使用するだけ。

この様な場合ですと、ActiveX DLLで作成したクラスを使用するのとどう違うのでしょうか?

また、
>メリットは、DLLなので処理速度が速い。
というのは、上記例の場合、ActiveXコントロールよりも処理が早いという事なのでしょうか?

お礼日時:2003/03/07 16:17

どうもです。


戻ってみてみたら続きがありました(汗)

えーーーっと
DLLの処理速度が速いというのは
あくまで、ActiveX.exeとの比較で言っていたので
ActiveXコントロールと比較しての答えではありませんのでしたのでした。
すんません。
書籍などを見ている限り
ActiveX.dllとActiveX.exeを比較して
メリット・デメリットなどを述べているもので
おまけで書いてみました。

でも、GUIもってるのと持ってないのと、DLLって考えたら
感覚的にで、なんも根拠ないんだけど
DLLの方がなんか早そう(おいおいっ)

COM化(ActiveX.dll)というのは
今制作しているプログラム(仕事上のプロジェクト)があるとして
また、まったく別のプログラム(プロジェクト)でも再利用したいというときに
共通ライブラリとして
使うのだと思います。
ということで、今の仕事のプロジェクト終了後、
またいずれ先に、違うプロジェクトなどで
同じ処理を利用したりするなど
そんなときにCOM化しておけばよいと思います。
とか、Webで処理速度・レスポンスを速くしたいとか。。。

が、時事的にも、
後々、開発ツールのバージョンアップやシステム環境の変化など
考慮すると、COM化しておいた方がよいような気がします。

あまり汎化されていないモジュールだったり
その仕事でしか使わないような共通の処理だったら
クラスモジュールの方が、よい気もしますが。

あんまし参考になってない気がしますが
・・・そんな感じです。
でわであ
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2003/03/07 17:28

ActiveXコントロールってOCX作るやつですよね?


これは、画面に貼り付けないと使えません。
ActiveXDLLの方は、参照設定などを使用して宣言します。

基本的にActiveXコントロールはインターフェースがあるもの向け、
ActiveXDLLの方は通常のクラスの使い方向けです。
ActiveXDLLでもフォームなどの画面は組み込めます。

両者とも外部ファイルになるので
使用するとEXEが小さくなります。
両者ともデメリットは、世代管理(継承)管理が必要になります。
失敗すると全EXEの再コンパイルが必要です。
また インターフェース部分(パブリックの引数、関数名)など変更すると
再コンパイルが必要です。関数の追加はOKです。

作ってしまうと内部的に見えないので、
しっかり作らないとエラーを追えません。

また、セットアップを作成する場合も、両者とも内部で使ってある
コントロールやオブジェクトを組み込まないと、EXEは動きません。

両者のメリットは、作成後の開発効率や、ソースの隠蔽性などですかね。
両者とも結構デメリットありますので覚悟して開発してください。
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2003/03/10 11:50

混乱させますw



私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定義)を
As Object
として、CreateObject("DLL定義")のように行うと、引数が一緒ならEXEはリコンパイルしないでもいいです。実例として、エクセルを参照設定して[as Excel]と宣言していたら、その参照設定に対応したExcelしか操作できませんが、[As Object]と[CreateObject("Excel.Application")]とすると、EXCEL95~XPまで扱えます。
不便なのは、タイプライブラリが未設定になるので、Excelの各プロパティ/メソッドを知らないといけないし、Excel固有の定数が宣言もされてないので、自分で定数値を調べなければいけません。でもバージョンの違いを気にしないでいけるのは、非常に便利です。


速さのことを言ったら、当然DLLが早いです。
OCXはプロパティにRight/Leftなどを持っています。変えて言うと実体を持っていると言うことです。非表示にしていても実体をもっています。DLLはインスタンスは生成されますが、OCXだって生成されるので、表示しないで使用するなら、OCXの意味があまりありません。


んで、私(個人)の考えとしては、、、
※オリジナルボタンなどの、画面上必要ならOCX
  理由:画面に必要だから
※画面に表示を行う必要がなくても、配布する気ならOCX
  理由:配布先のユーザが扱いやすい
※そうじゃなければDLL
  理由:OCXにする理由が見つからないから


余談です。
私はいつもCommonコントロールは使用しません。
  理由:簡単なAPIでも実現できるのに、機能が少ないCommonコントロールを追加して、EXEの容量を大きくしたくないから
    • good
    • 0
この回答へのお礼

ありがとうございました。
DLLにしようと思います。

あと、
>※画面に表示を行う必要がなくても、配布する気ならOCX
> 理由:配布先のユーザが扱いやすい

配布先ユーザというのは、開発者のことですか?また、開発したシステム(ソフト)を使用するエンドユーザのことです?

お礼日時:2003/03/10 11:56

このようなOCX


http://www.vector.co.jp/soft/win95/prog/se185666 …

このような機能は、本来はOCXでなくDLLで済むものです。

電源を管理する関数群の設定を、パラメータでなく、プロパティとして設定させることで、開発者だけでなく、そのOCXを使用する人が設定しやすくなります。

よほど汎用性が高い関数なら、OCX化して小銭稼ぎができます。

参考URL:http://www.vector.co.jp/soft/win95/prog/se185666 …
    • good
    • 0

なんか文章を書いた後勘違いされそうな文章に思えたので、補足です。


参考URLのOCXの場合を例に挙げたのは、電源のON/OFFだけならDLLで十分だということです。ただこのOCXは他の機能により画面も要します。それらの機能のために画面が必要なので、必然的にOCXということになりますが、、、
しかし、画面がなくても配布という意味で、先ほど言った理由でOCXが望ましいということになります。
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAPI、OCX、DLLって何でしょう?

タイトルどおりの質問です。ど素人なのでわかりやすく説明していただけるとありがたいです。参考URLも教えていただけるとよりありがたいです。

Aベストアンサー

質問全てを盛り込んであるHPを探してみました。
そこそこわかりやすいとは思うのですけど、読んでみてください。

それと、私なりの簡単な説明です。
○DLL(Dynamic Link Library[ダイナミック・リンク・ライブラリ])
簡単に言えば、関数集ファイルです。
関数とは、VBのプログラミングでIf~Then,For~Next,Left,Lenなどいろいろ使った事あると思いますがこれがそうです。
このような一般的なものは、いわゆるVBランタイムDLLに定義されています。
その他いろいろと、用途別に*.DLLとあるわけです。

○OCX(OLE Custom Control[OLE・カスタム・コントロール])
簡単に言えば、部品です。
フォームやテキストボックス・ボタンなどなどがこれに当たります。
ようは、画面を構成する部品だと思ってもらっても構いません。

○API(Application Program Interface[アプリケーション・プログラム・インターフェイス])
これは、DLLで提供された関数を呼び出す仕組みのことです。
ですが、VB標準の関数使用時には必要ありません。
VB標準以外の外部DLL等の関数使用時に「これから使いますよ。」と言う定義です。

参考URL:http://www.ab.wakwak.com/~greenspace/dev-api/theapi/whatsapi.html

質問全てを盛り込んであるHPを探してみました。
そこそこわかりやすいとは思うのですけど、読んでみてください。

それと、私なりの簡単な説明です。
○DLL(Dynamic Link Library[ダイナミック・リンク・ライブラリ])
簡単に言えば、関数集ファイルです。
関数とは、VBのプログラミングでIf~Then,For~Next,Left,Lenなどいろいろ使った事あると思いますがこれがそうです。
このような一般的なものは、いわゆるVBランタイムDLLに定義されています。
その他いろいろと、用途別に*.DLLとあるわけです。

○O...続きを読む

QVB.NETでActiveX(OCXファイル)作成

VB6のプロジェクトファイルで作成したOCXファイルがございます。これをVB.NETに移行したいの
ですが、アップグレードウィザードを使用しても同様のOCXファイルは作成できますか?
また、プロジェクトを新規作成する方法を教えていただけませんか?

宜しくお願い致します。

Aベストアンサー

>> .Netは.NET Frameworkのバージョンごどにテストが必要になります。
>> なので、C++でActiveXコントロール(OCXファイル)を作成することを検討します。
>> C++はActiveXコントロールのサポートをしているのは何故ですか?

単純に殆どの言語を.NET上で動くように改変したため、
C++以外ではネイティブなプログラムを作成できなくなったから、
自然にそうなったのだと思います。

逆に言えば通常のC++が、現在のVSに実装されていることの方が異色で、
互換性のために残されている物だという認識です。

>> また、VB6→C++のコード変換ツールがございましたら、教えていただけませんか?
こちらについては分かりません。

仮に存在していたとしても、VBとVC++ではメモリの管理方法が全く異なりますので、
両方の言語を扱える人間が作業するべきだと思います。

QCOMコンポーネントって何?

よく、COMコンポーネントって聞くんですが、何のことかわかりません。VBやVBAのような言語名ではないことは、なんとなく分かるのですが・・・。できるだけわかりやすく教えてください。

Aベストアンサー

失礼ですが、クラスをご存知ないのであればCOMは多分
全く理解できないでしょうねぇ

クラスについても、ご自分で勉強が必要だとは思いますが
簡単に説明しておきます。
構造体(属性)に、関数(操作)を加え、カプセル化したものです。
従来のプログラミングでは、変数をばらばらに扱わず、
構造体と呼ばれる型に関係ある変数をまとめて、
プログラム中のデータ構造が明確になるようにしておきました。
そこで、この構造体に専属の関数を加えてしまえば、
その構造体は単独で自分の面倒をみることが出来るようになります。
それがクラスです。
その結果、プログラム中のデータや処理が、クラス単位で整理され、
それぞれ部品のように組み替えが可能になりました。

このように、クラス単位にプログラムを分割することで
巨大なプログラムを明瞭にする言語をオブジェクト指向言語といいます。

また、クラスには親と子があり、「継承」という考えを用いて
どんどんバージョンアップや特化を行うことが容易です。

VBで説明すると、
Dim value as A
として変数を宣言した場合、クラスは「A」です。
valueはオブジェクトや、インスタンスと呼ばれます。
valueを使って、Aに含まれる関数を呼び出して、valueを
操作することが出来ます。
value.Init()
等。

ざっくり説明するとこんな感じです。
詳細については、各言語の書籍を参照してください。

このようにして作ったクラスを、
・他の言語から使いたい
・ネットワーク経由で使いたい
などと言った機能を実現する、Microsoft提供の方法の一つが、
COMやDCOMと呼ばれるものです。
COMは、他のプログラムからの使いまわしに強いので、
一度作っておけば、VB、Delphiは勿論、VBScript、JavaScrips、WSHなどから
呼び出しが可能です。
また、COM自体のバージョンが上がっても、それを呼び出してる
プログラム自体には変更の必要がありません。

失礼ですが、クラスをご存知ないのであればCOMは多分
全く理解できないでしょうねぇ

クラスについても、ご自分で勉強が必要だとは思いますが
簡単に説明しておきます。
構造体(属性)に、関数(操作)を加え、カプセル化したものです。
従来のプログラミングでは、変数をばらばらに扱わず、
構造体と呼ばれる型に関係ある変数をまとめて、
プログラム中のデータ構造が明確になるようにしておきました。
そこで、この構造体に専属の関数を加えてしまえば、
その構造体は単独で自分の面倒をみることが出...続きを読む

Q.NETでActiveXコントロールを使う

開発系初心者です。

ある事情にて.NETの環境でActiveXコントロールの使用を行うことになりました。
そこで、下記アドレスの方の方法を参考にさせていただいたのですが、
ラッパークラスライブラリの生成が行えません。

.NET環境でActiveXコントロールの実装を行うことに参考にさせていただいたサイト
http://blogs.wankuma.com/ganfield/archive/2007/03/13/66556.aspx

サイトに記載されているActiveXの登録には、下記のアドレスの方のを参考に、
regsvr32で登録済みとなっています。

ActiveX登録に参考にさせていただいたサイト
http://www3.ocn.ne.jp/~tonko/HP13_02.htm

二つのラッパーライブラリが生成できないというのは、コマンドプロンプトの作業時、
AxImp c:\WINDOWS\system32\msdxm.ocx
と、入力しても
AxImp エラー: タイプ ライブラリ/DLL の読み込みエラーです。(HRESULTからの例外:0x80029C4A (TYPE_E_CANTLOADLIBRARY))
と出てしまい、ラッパーライブラリが生成できません。上記サイト以外に、何か準備する必要があるのでしょうか?
なお、開発環境は、
OS     :Windows 7
開発環境 :Visual Studio 2010
です。プログラミング言語ではC#の使用を予定しています。

どなたかご回答をお願い致します。

開発系初心者です。

ある事情にて.NETの環境でActiveXコントロールの使用を行うことになりました。
そこで、下記アドレスの方の方法を参考にさせていただいたのですが、
ラッパークラスライブラリの生成が行えません。

.NET環境でActiveXコントロールの実装を行うことに参考にさせていただいたサイト
http://blogs.wankuma.com/ganfield/archive/2007/03/13/66556.aspx

サイトに記載されているActiveXの登録には、下記のアドレスの方のを参考に、
regsvr32で登録済みとなっています。

ActiveX登録に参考にさせ...続きを読む

Aベストアンサー

http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/a2a04bb7-8523-4b39-b3bc-a1e2b02b7aca/
で解決しているっぽい

Qオブジェクト(dll)のレジストリ登録について

いつもお世話になっております。

dllの使い方について教えてください。

vb5.0で開発を進めているのですが、
dllを呼び出す際に、レジストリ登録を
しなければいけないのでしょうか?

いくつかのサイトでは、参照設定際すれば、
実行できているようです。。

実行環境では、レジストリ登録しないと
動かない場合があるということでしょうか?

ご教授、よろしくお願いします。

Aベストアンサー

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「Successful」と出ればActiveX DLLだ。エントリポイントが見つかりません云々と言われたらそれはWin32ネイティブDLLという事。登録に失敗して環境を壊すという事はないのでとりあえず登録を試みてみれば良いのではないかな。

現在では大きく分けてDLLは3つある。
・Win32ネイティブDLL:レジストリ登録不要。パスの通った所に配置する。
・ActiveX DLL:レジストリ情報によって呼び出すDLL。レジストリに登録する。インプロセスCOMサーバと言っても差し支えないかもしれないがあるかもしれない。
・Microsoft .Net アセンブリ:レジストリの登録は不要。単純に実行ファイルと同じパスに配置するか、.Netにおけるレジストリといえるグローバルアセンブリキャッシュに登録する。

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「S...続きを読む

QVB6.0でのOCX・DLLの作り方

VB6.0でのOCX・DLLの作り方を
詳しくご存知の方
もしくは
HP等ご存知の方
教えてくださいませんか?
よろしくお願いいたします。

Aベストアンサー

↓ こちらのサイト等はいかがかな !? ↓(^o^)丿

参考URL:http://hp.vector.co.jp/authors/VA014162/hitch/ActiveX/activex.htm

QActiveXが有効になりません(IE11使用)

Yahooなどを閲覧しているとFlash Playerがインストールされていないというメッセージが出るので、何度もインストールをしているのですが、結局、フラッシュコンテンツを再生できません。
ActiveXが有効になっていない、のエラーが出ているので、Webで検索できる対策を講じてみたのですが、やはり同じエラーが出ます。なぜでしょうか。

Aベストアンサー

IE11を起動 ⇒「Alt」キーを押下し、一時的にメニューバーを表示します。

「ツール」をクリックし「ActiveX フィルター(X)」にチェックが入っていれば外してください。
通常はこれで再生できるはずです。


それでも再生できない場合は、Flash Player のアドオンが無効になっているのかもしれません。

「ツール」⇒「アドオンの管理」⇒「ツールバーと拡張機能」⇒下の「表示」では「すべてのアドオン」を選択。
「Shockwave Flash Object」が無効になっていたら「有効」にしてください。

Qregsvr32でActiveX登録を行ったocx

regsvr32 で ActiveX登録を行った ocx がリソースエデイタ「のActiveX コントロールの挿入」で使用できなくて困ってます。

開発環境は VisualStudio2005 の VC++ で、Version は 8.0.50727.867 になります。

レジストリエディタで確認すると以下のレジストリキーで登録されていることを確認できるのですが。

HKEY_CLASSES_ROOT\CLSID\{9BD4A8F2-56BA-11D3-915D-00C04F797034}

『ActiveX コントロール テスト コンテナ』の「コントロールの登録」ダイアログで表示される一覧中には含まれていません。
また、「コントロールの登録」ダイアログで「登録」ボタンを押しても一覧に追加も行われません

なんとなくセキュリティっぽい事までは分かるのですが、どなたかヒントをお持ちでしょうか?

Aベストアンサー

OSはWindows7でしょうか?
もしかしたらUAC(ユーザーアカウント制御)の設定が原因かもしれません。
ユーザーアカウント制御の設定を通知しないに設定後、パソコンを再起動して
再度レジストリ登録しても同じ現象でしょうか?

Q実行時エラー429

あるプログラムを起動させようとすると
以下のメッセージが出てきてしまい起動できません。

実行時エラー429
ActiveXコンポーネントは、オブジェクトを作成できません。

対応策は、ございますか?
VB6の最新版は、ダウンロード済みです。
http://www.vector.co.jp/soft/win95/util/se188840.html

Windows98
Office97

諸事情でこちらの環境を替える事は、
出来ないんです・・・

Aベストアンサー

こんばんは。

よくわからないのですが、dao360.dllが入っていないから出るメッセージならば
下記参考URLからダウンロードしてみてはいかがでしょうか。

参考URL:http://www.vector.co.jp/soft/win95/util/se257084.html?site=n

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング