VBかエクセルを判別するには?

解決


My  2005-05-12 12:01:29  No: 89774

VBのソースをコピーしてそのままエクセルで使いたいのですが、
両方で使えないオブジェクトがあったりします。
そこでディレクティブで切り替えたいのですが、
プログラムがVBかエクセルか判別する方法をご存知でしたら教えてください。


魔界の仮面弁士  2005-05-12 19:51:13  No: 89775

> VBのソースをコピーしてそのままエクセルで使いたいのですが、
> 両方で使えないオブジェクトがあったりします。

「VB→VB6」「エクセル→Excel 2003 VBA」という前提で言えば、
『オブジェクトブラウザ』を開いたときに、「VBAライブラリ」に
含まれるオブジェクトは、ExcelでもVBでも概ね利用可能です。

たとえば、Collectionオブジェクト、IMEStatus関数などは、
VBAの機能なので、VB/Excel VBAの両方で利用可能です。

# 厳密に言うと、VBAが使うVBAライブラリはVBE6.DLL、
# VB6が使うVBAライブラリはMSVBVM60.dllなので、
# 両者は完全には同一ではないのですけれども。

一方、「VBライブラリ」「VBRunライブラリ」に含まれるものは、
VBでは利用できますが、VBAでは利用できません。

また、「Excelライブラリ」「Officeライブラリ」に含まれるものは、
Excel VBAでは利用できますが、VBでは(参照設定しないと)利用できません。

> プログラムがVBかエクセルか判別する方法をご存知でしたら教えてください。
これって、実行時に判定したいと言う事でしょうか?
ディレクティブで切り替えるのなら、実行時に判定する必要は無さそうですが……。


My  2005-05-13 05:57:37  No: 89776

魔界の仮面弁士さま、返答ありがとうございます。

>これって、実行時に判定したいと言う事でしょうか?
そうです。

>ディレクティブで切り替えるのなら、実行時に判定する必要は無さそうですが……。

うーん・・・App.pathはエクセルで使えないので、エクセルではApplication.pathにきりかえるとか、
絵を描画するのにVBではPictureBoxに書いているんですが、エクセルではシェイプオブジェクトをつかいたいなぁって思ったんです。
モジュールに渡すオブジェクトを、PictureBoxかワークシートか判定して切り替えれば両方で使えるモジュールにできるので便利ですよね。
(余分なコードがあるとエラーがでてしまう)

書き換えればいいだけの話ですが、
やっぱり、都合よく判定できるものってないんでしょうか?


oku  URL  2005-05-13 07:01:11  No: 89777

条件付きコンパイル引数で逃げる?
プロジェクトのプロパティの
条件付きコンパイル引数に例えば
エクセルなら
excelmode = 1
VB6なら
excelmode = 0

Private Sub Command1_Click()
#If excelmode = 1 Then
    MsgBox "エクセル"
#Else
    MsgBox "VB6"
#End If
End Sub


魔界の仮面弁士  2005-05-13 07:54:48  No: 89778

> そこでディレクティブで切り替えたいのですが、
これって、下記の事ですよね?
http://www.microsoft.com/japan/developer/library/vbenlr98/vadirif.htm

条件付きコンパイラ定数は、実行時に切り替える事ができず、
あらかじめ #Const で指定しておくか、あるいはプロジェクトの
プロパティで指定しておかないといけないものですから、
いずれにしても「実行時に判定する」余地は無いと思いますけど……。

> うーん・・・App.pathはエクセルで使えないので、エクセルではApplication.pathにきりかえるとか、
(中略)
> やっぱり、都合よく判定できるものってないんでしょうか?

もしも「実行時に判定できる機能」があったとしても、実行コードが、

  IsVB6  = VB6上ならTrueでExcel上ならFalseを返す関数()
  If IsVB6 Then
     S = App.Path
  Else
     S = Application.Path
  End If

のようになっていたとすれば、それを Excel上で実行しても、
結局はコンパイルエラーになってしまい、意味がありませんよね。

ですから、
> 書き換えればいいだけの話ですが、
結局、(条件付きコンパイラ定数を)書き換えて対応する事になると思いますよ。
ソースを共有したいのであれば……。


My  2005-05-13 08:26:29  No: 89779

okuさま

おしえていただいた通りやったらできました。
こんな機能があるなんてしらなかったです、大変ありがとうございました。

でも、ややこしいのでやっぱり書き直すのがいちばんですね。


My  2005-05-13 08:34:36  No: 89780

魔界の仮面弁士さま

>条件付きコンパイラ定数は、実行時に切り替える事ができず、
>あらかじめ #Const で指定しておくか、あるいはプロジェクトの
>プロパティで指定しておかないといけないものですから、
>いずれにしても「実行時に判定する」余地は無いと思いますけど……。

やっぱり無理なんだ・・・
わがままな質問なのに、ていねいに答えてくださいまして
大変ありがとうございました。

プログラムは書き直すことにします・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加