- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码需要在 Excel 2003 和 Excel 2007 上运行,并且在某些地方版本中的更改会导致代码停止。我尝试使用 If-Else 语句将这些行分开,但代码无法在其中任何一个上编译,因为它无法识别用于另一个的代码。有没有什么方法可以让一个版本忽略一段代码,类似于 VBA 中的 C 或 C++ 风格的 #ifdef?
最佳答案
This is a good starting point, but it won't work with the version of Excel that its running on, since that can only be figured out at run-time, not compile time.
如果您需要根据仅在运行时可发现的信息对代码进行分支,您可能会考虑将后期绑定(bind)作为解决方案。有两种方法可以绕过版本问题。
可以使用第一种方式,如果需要访问仅在某些版本中存在的属性或方法,可以使用CallByName。按名称调用的优点是它允许您尽可能保留对象的早期绑定(bind)(和智能感知)。
举个例子,Excel 2007 有一个新的 TintAndShade 属性。如果您想更改某个范围的颜色,并且对于 Excel 2007,还要确保 TintAndShade 设置为 0,您会遇到麻烦,因为您的代码无法在 Excel 2003 中编译,因为 Excel 2003 没有 TintAndShade 作为范围对象的属性。如果您使用 CallByName 访问您知道并非在所有版本中的属性,则您的代码将在所有版本中正常编译,但仅在您指定的版本中运行。见下文:
Sub Test()
ColorRange Selection, Excel.Application.version, 6
End Sub
Sub ColorRange(rng As Excel.Range, version As Double, ParamArray args() As Variant)
With rng.Interior
.colorIndex = 6
.Pattern = xlSolid
If version >= 12# Then
'Because the property name is stored in a string this will still compile.
'And it will only get called if the correct version is in use.
CallByName rng.Interior, "TintAndShade", VbLet, 0
End If
End With
End Sub
第二种方法适用于必须通过“New”实例化的类,并且在旧版本中甚至不存在。使用 Excel 时您不会遇到这个问题,但我将提供一个快速演示,以便您明白我的意思:
想象一下,您想要执行文件 IO,并且由于某些奇怪的原因,并非所有计算机都安装了 Microsoft Scripting Runtime。但由于一些同样奇怪的原因,您想确保它在可用时被使用。如果设置对其的引用并在代码中使用早期绑定(bind),则代码将无法在没有该文件的系统上编译。所以你改用后期绑定(bind):
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
自 2003 年以来 Excel 对象模型的所有添加和更改的完整列表:
http://msdn.microsoft.com/en-us/library/bb149069.aspx如需了解 1997 年至 2000 年之间的变化,请访问此处:
http://msdn.microsoft.com/en-us/library/aa140068(office.10).aspx
关于vba - VBA 中的 IFDEF 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/926561/
在下面的 C 代码摘录中,SUPPORT_MULTI_DNS_SERVER 是否仅在定义 ProductName 时执行? #ifdef //do things here #ifdef SUPPO
我有一些 C++ 代码,其中有一堆 #ifdef WIN32,否则我们假设它的 IOS 代码。但是,我现在正尝试将相同的 C++ 代码用于 Android 端口。 #ifdef WIN32 是否有某种
我看过一些用于处理不同操作系统的样板头文件代码,如下所示: #ifdef __WIN32 //windows #elif __linux //linux #elif __unix
在 C++ 中,是这样的: #ifdef A && B 同: #if defined(A) && defined(B) ? 我以为不是,但我无法通过我的编译器 (VS2005) 找到差异。 最佳答案
我正在尝试理解 #ifdef 宏。下面的示例代码。 getval(int val) { if(val==0) { #ifndef PKT #define PKT #endi
我有一个包含如下命令的 Makefile: #Makefile hello: echo 'hello' echo $(TAG) ifdef TA
我正在努力让 Log4D 在 Delphi XE4 中工作,并且遇到了一些编译错误,因为它在 use 子句中找不到 Contnrs,除非我将它移到定义它的 ifdef 之外。 {$IFDEF DELP
是否可以在一个 {$IFDEF} 指令中定义多个条件? 我想要这样的语法: {$IFDEF Condition1 OR Condition2} DoSomething; {$ENDIF} {$IFDE
我经常看到这用于使模块与 GHC 和 Hugs 兼容,但谷歌并没有帮助我了解更多关于它的信息。 我可以在条件中放什么?我可以根据正在使用的“基础”版本来制作模块的一部分吗? 编辑 3/2017 :这是
在调试gen_server模块的时候,我想记录更多的细节状态。 init()-> put(?COMPLETED_COMMANDS,[]), -ifdef(DEBUG). put(?DE
在调试gen_server模块的时候,我想记录更多的细节状态。 init()-> put(?COMPLETED_COMMANDS,[]), -ifdef(DEBUG). put(?DE
我知道已经有一篇与我的类似的帖子( C++ `ifdef` with concatenation of macros values ),但该帖子相当旧,提供的解决方案对我不起作用,因为我无法设置我想要
我在编译过程中传递了一个macto: % gcc -DIDENT="abcd"app.c 在编译宏时检查宏的正确方法是什么?例如,以下内容有效,但会引发警告: #ifdef IDENT == "abc
我有一个回调函数数组。仅当定义了“SOMETHING”时才应使用一个函数。在数组中包含 #ifdef 是否正确,例如: void (*const array[])(void) = { func
是否可以在这样的 if 条件中使用 #ifdef 宏? if(Something() || SomethingElse() #ifdef __TEST__ || SomethingTest()#end
我有一个 QT 输入监听器类,它在运行的 QCoreApplication 中发出 stdin 输入信号。我想在 Windows 和 Linux 上都使用它。 我目前的方法是在 header 和 cp
我看见了 #ifdef code; #endif 要包含在内,但我找不到它在它包含的任何 header 中定义。是否有任何其他机制可以定义 token ? 最佳答案 首先,有些宏是由编译器隐式定义的
这个类是在我的项目中定义的: class B : public A { public: A& Get_a(int type); ... protected: #ifdef COMPILE_F
我正在以编程方式创建 UniversalApp。在我的应用程序中,我有 2 个常量类,并且在设备的基础上我想导入我的常量类。但它总是打开“Constants_iPad”类。甚至条件为真或假。 #ifn
我正在开发一个共享库,它有一些头文件,其中包含函数模板,例如: #ifdef somecompilerflag #define FUNCTION functionA #else #define FUN
我是一名优秀的程序员,十分优秀!