我有一个需要两个Excel 2003和Excel 2007中运行代码,并有几个景点,其中的版本变化导致代码停止。我想这些线分离出与if-else语句,但代码不会对可能是因为它不承认用于其它的代码编译。有什么办法,我可以告诉一个版本忽略的代码块,类似于C或C ++ - 风格的#ifdef,在VBA

有帮助吗?

解决方案

  

这是一个很好的起点,但它不会与它运行的Excel版本的工作,因为只能在运行时可以想通了,不能编译时间。

如果您需要根据在运行时可以考虑作为解决后期绑定信息只发现到的代码分支。有两种方法可以绕版本问题潜行。

第一种方法可以使用,如果您需要访问属性或方法,只有在某些版本存在,你可以使用CallByName。按名称调用的好处是,它可以让你保持你的对象早期绑定(和智能)尽可能。

要举一个例子,Excel 2007中有一个新的TintAndShade属性。如果你想改变一个范围的颜色,和Excel 2007也确保TintAndShade被设置为0,你会遇到麻烦,因为你的代码将不能在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 

第二个方法是有通过“新”被实例化,甚至不老版本存在的类。你不会遇到这样的问题,与Excel,但我会给一个匆匆的演示,所以你可以看到我的意思是:

想象一下,你想要做文件IO,以及一些奇怪的原因,不是所有的计算机有Microsoft脚本运行它们。但是,对于一些同样奇怪的原因,你想确保它是何时使用,它是可用的。如果设置为它的引用,并在代码中使用早期绑定,代码将无法编译上没有文件系统。所以,你使用后期绑定,而不是:

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

其他提示

是的,这是可以做到的条件编译在Excel VBA。下面是一个简单的资源和一些示例代码: 条件编译

#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或任何一个常数,使用相应的数字值。

让我看看你得到了什么,我会看看我是否能重构它。

比尔

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top