Excel 2003とExcel 2007の両方で実行する必要のあるコードがありますが、バージョンの変更によってコードが停止する箇所がいくつかあります。 If-Elseステートメントでこれらの行を区切りますが、どちらのコードでもコードが認識されないため、コードはコンパイルされません。あるバージョンでVBAでCまたはC++スタイルの#ifdefに似たコードブロックを無視する方法がありますか?VBAのIFDEF相当
答えて
これは良い出発点ですが、それだけで把握することができるので、それは、そのが実行して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
はい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
問題のコード行を投稿できますか?
vbYesやxlFileFormatなどの定数の場合は、対応する数値を使用します。
私にあなたが持っているものを見せてください、私がそれをリファクタリングできるかどうかがわかります。
ビル
これは必要ではありません。コードはマクロで生成され、2007年には2003年のコードが正常に機能するので、2007年のコードを解凍しました。 –
- 1. Excel VBA相当のベクトル
- 2. protobufの#ifdef構文に相当します。
- 3. VBAのMac用のControl + Break相当
- 4. Excelのmod関数に相当するVBA
- 5. VBAは<i> "text"</i>に相当しますか?
- 6. Powerpoint VBAに相当するWorkbook_Openイベントはありますか
- 7. 相当
- 8. IsFinite()相当の
- 9. 相当のスコープ?
- 10. #ifdef #imports?
- 11. は#ifdefの
- 12. Golang requirements.txt相当の
- 13. OCaml相当のタイプ
- 14. パブリックメソッドの__call相当
- 15. CDC DrawDragRect相当の
- 16. propel相当の "exists"
- 17. ieee_exceptionsのGFortran相当
- 18. フレット相当のlet *?
- 19. XkbSetDetectableAutoRepeatのXCB相当
- 20. Pygame相当のRuby?
- 21. WPF相当のマージントップ?
- 22. angular2相当のangular.isArray
- 23. System.Windows.Controls.Expander MFC相当の
- 24. SslStream相当のTcpClient.Available?
- 25. Noobslide相当のjQuery
- 26. httplib相当のC
- 27. ldd相当のアンドロイド
- 28. フレンドのHTML相当
- 29. Perl相当のPHP_AUTH_PW
- 30. timespec相当のウィンドウ
これは良い出発点であるが、それは実行時にのみに把握することができるので、それは、その上で実行されているが、Excelのバージョンでは動作しません、時間をコンパイルしません。 –
は質問に答えませんが、それは一般的なコンパイル指令のためにはうまくいくが、質問はどのようにしてアプリケーションのバージョンのExcelをチェックするかを述べている。 –