VBのソースをコピーしてそのままエクセルで使いたいのですが、
両方で使えないオブジェクトがあったりします。
そこでディレクティブで切り替えたいのですが、
プログラムがVBかエクセルか判別する方法をご存知でしたら教えてください。
> 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かエクセルか判別する方法をご存知でしたら教えてください。
これって、実行時に判定したいと言う事でしょうか?
ディレクティブで切り替えるのなら、実行時に判定する必要は無さそうですが……。
魔界の仮面弁士さま、返答ありがとうございます。
>これって、実行時に判定したいと言う事でしょうか?
そうです。
>ディレクティブで切り替えるのなら、実行時に判定する必要は無さそうですが……。
うーん・・・App.pathはエクセルで使えないので、エクセルではApplication.pathにきりかえるとか、
絵を描画するのにVBではPictureBoxに書いているんですが、エクセルではシェイプオブジェクトをつかいたいなぁって思ったんです。
モジュールに渡すオブジェクトを、PictureBoxかワークシートか判定して切り替えれば両方で使えるモジュールにできるので便利ですよね。
(余分なコードがあるとエラーがでてしまう)
書き換えればいいだけの話ですが、
やっぱり、都合よく判定できるものってないんでしょうか?
条件付きコンパイル引数で逃げる?
プロジェクトのプロパティの
条件付きコンパイル引数に例えば
エクセルなら
excelmode = 1
VB6なら
excelmode = 0
Private Sub Command1_Click()
#If excelmode = 1 Then
MsgBox "エクセル"
#Else
MsgBox "VB6"
#End If
End Sub
> そこでディレクティブで切り替えたいのですが、
これって、下記の事ですよね?
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上で実行しても、
結局はコンパイルエラーになってしまい、意味がありませんよね。
ですから、
> 書き換えればいいだけの話ですが、
結局、(条件付きコンパイラ定数を)書き換えて対応する事になると思いますよ。
ソースを共有したいのであれば……。
okuさま
おしえていただいた通りやったらできました。
こんな機能があるなんてしらなかったです、大変ありがとうございました。
でも、ややこしいのでやっぱり書き直すのがいちばんですね。
魔界の仮面弁士さま
>条件付きコンパイラ定数は、実行時に切り替える事ができず、
>あらかじめ #Const で指定しておくか、あるいはプロジェクトの
>プロパティで指定しておかないといけないものですから、
>いずれにしても「実行時に判定する」余地は無いと思いますけど……。
やっぱり無理なんだ・・・
わがままな質問なのに、ていねいに答えてくださいまして
大変ありがとうございました。
プログラムは書き直すことにします・・
ツイート | ![]() |