2009-05-29 46 views
4

Excel 2003とExcel 2007の両方で実行する必要のあるコードがありますが、バージョンの変更によってコードが停止する箇所がいくつかあります。 If-Elseステートメントでこれらの行を区切りますが、どちらのコードでもコードが認識されないため、コードはコンパイルされません。あるバージョンでVBAでCまたはC++スタイルの#ifdefに似たコードブロックを無視する方法がありますか?VBAのIFDEF相当

答えて

4

これは良い出発点ですが、それだけで把握することができるので、それは、そのが実行してExcelのバージョンでは動作しません。実行時にコンパイルするのではなく、コンパイル時にコンパイルします。

実行時にのみ検出可能な情報に基づいてコードを分岐する必要がある場合は、ソリューションとして遅延バインディングを検討することがあります。バージョンの問題を覗き見るには2つの方法があります。

特定のバージョンにのみ存在するプロパティまたはメソッドにアクセスする必要がある場合は、最初の方法を使用できます.CallByNameを使用できます。名前による呼び出しの利点は、オブジェクトの初期バインディング(およびインテリセンス)を可能な限り保存できることです。

例として、Excel 2007には新しいTintAndShadeプロパティがあります。範囲の色を変更し、Excel 2007でTintAndShadeが0に設定されていることを確認した場合、TintAndShadeを範囲オブジェクトのプロパティとして持たないExcel 2003でコードがコンパイルされないため、問題が発生します。 CallByNameを使用するすべてのバージョンではないことがわかっているプロパティにアクセスすると、コードはすべてのバージョンでコンパイルされますが、指定したバージョンでのみ実行されます。以下を参照してください:

2番目の方法は、「新規」でインスタンス化する必要があり、古いバージョンでも存在しないクラスです。あなたはExcelでこの問題に遭遇することはありませんが、私はあなたが私が何を意味するかを見ることができるように簡単なデモを行います:

ファイルIOをやりたいと思っていて、いくつかの奇妙な理由で、それらのMicrosoft Scripting Runtimeしかし、同じように奇妙な理由のために、あなたはそれが利用可能であるときはいつでもそれが使われていることを確かめたいと思っていました。そのファイルへの参照を設定し、コード内のアーリーバインドを使用すると、そのファイルを持たないシステムでコードはコンパイルされません。だから、代わりに遅延バインディングを使用:

Public Sub test() 
    Dim strMyString As String 
    Dim strMyPath As String 
    strMyPath = "C:\Test\Junk.txt" 
    strMyString = "Foo" 
    If LenB(Dir("C:\Windows\System32\scrrun.dll")) Then 
     WriteString strMyPath, strMyString 
    Else 
     WriteStringNative strMyPath, strMyString 
    End If 
End Sub 

Public Sub WriteString(ByVal path As String, ByVal value As String) 
    Dim fso As Object '<-Use generic object 
    'This is late binding: 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    fso.CreateTextFile(path, True, False).Write value 
End Sub 

Public Sub WriteStringNative(ByVal path As String, ByVal value As String) 
    Dim lngFileNum As Long 
    lngFileNum = FreeFile 
    If LenB(Dir(path)) Then Kill path 
    Open path For Binary Access Write Lock Read Write As #lngFileNum 
    Put #lngFileNum, , value 
    Close #lngFileNum 
End Sub 

すべて追加し、Excelのオブジェクトモデルへの変更の包括的なリストは、2003年からあります:
1997年から2000年の間の変更については http://msdn.microsoft.com/en-us/library/bb149069.aspx ここに行く:
http://msdn.microsoft.com/en-us/library/aa140068(office.10).aspx

2

はいExcel VBAで条件付きコンパイルを行うことは可能です。以下は簡単なリソースと、いくつかのサンプルコードです: Conditional Compilation

#If Win32 Then 
    ' Profile String functions: 
    Private Declare Function WritePrivateProfileString Lib "KERNEL32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long 
    Private Declare Function GetPrivateProfileString Lib "KERNEL32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As Any, ByVal lpKeyName As Any, ByVal lpDefault As Any, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long 
#Else 
    ' Profile String functions: 
    Private Declare Function WritePrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Integer 
    Private Declare Function GetPrivateProfileString Lib "Kernel" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As Any, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer 
#End If 
+0

これは良い出発点であるが、それは実行時にのみに把握することができるので、それは、その上で実行されているが、Excelのバージョンでは動作しません、時間をコンパイルしません。 –

+0

は質問に答えませんが、それは一般的なコンパイル指令のためにはうまくいくが、質問はどのようにしてアプリケーションのバージョンのExcelをチェックするかを述べている。 –

0

問題のコード行を投稿できますか?

vbYesやxlFileFormatなどの定数の場合は、対応する数値を使用します。

私にあなたが持っているものを見せてください、私がそれをリファクタリングできるかどうかがわかります。

ビル

+0

これは必要ではありません。コードはマクロで生成され、2007年には2003年のコードが正常に機能するので、2007年のコードを解凍しました。 –