Pregunta

Tengo el código que necesita para ejecutarse en Excel 2003 y Excel 2007, y hay un par de lugares donde los cambios en las versiones de que el código detener.Traté de separar estas líneas con If-Else, pero el código no compilará en ya sea porque no reconoce el código que se usa para el otro.Hay alguna manera de que yo pudiera decirle una versión para ignorar un bloque de código, similar a la de C o C++-estilo #ifdef, en VBA?

¿Fue útil?

Solución

Este es un buen punto de partida, pero no funciona con la versión de Excel que su ejecución, ya que sólo puede ser resuelto en tiempo de ejecución, no en tiempo de compilación.

Si usted necesita para sucursal de su código basado en la información solo se puede detectar en tiempo de ejecución, usted podría considerar la posibilidad de enlace en tiempo de ejecución como una solución.Hay dos maneras que usted puede colarse en torno a problemas de versión.

La primera forma puede ser usado si usted necesita para Acceder a una propiedad o método que sólo existe en ciertas versiones, puede utilizar CallByName.La ventaja de llamar por su nombre es que permite preservar el enlace (y intellisense) para los objetos tanto como sea posible.

Para dar un ejemplo, Excel 2007 tiene un nuevo TintAndShade de la propiedad.Si usted quiere cambiar el color de un rango, y para Excel 2007 también garantizar TintAndShade se establece en 0, tendría que ejecutar en problemas debido a que su código no compilará en Excel 2003, que no tiene TintAndShade como una propiedad del objeto range.Si usted tiene acceso a la propiedad que usted sabe que no está en todas las versiones utilizando CallByName, el código se compilará en todas las versiones bien, pero sólo se ejecuta en las versiones que usted especifique.Ver a continuación:

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 

La segunda forma es para las clases que han de ejecutarse a través de "Nuevo" y ni siquiera existe en versiones antiguas.No tendrás este problema con Excel, pero voy a dar un rapidito demo así que usted puede ver lo que quiero decir:

Imagine que usted quería hacer e / s de Archivo, y por alguna extraña razón no todos los equipos se había Microsoft Scripting Runtime en ellos.Pero para algunos igual de extraña razón quería asegurarse de que se utiliza cada vez que estaba disponible.Si se establece una referencia a él y utilizar el enlace en el código, el código no compilará en sistemas que no tienen el archivo.Así que utilizar el enlace en su lugar:

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

Hay una lista completa de todas las adiciones y Cambios al Modelo de Objetos de Excel desde el año 2003:
http://msdn.microsoft.com/en-us/library/bb149069.aspx Para cambios entre 1997 y 2000, vaya aquí:
http://msdn.microsoft.com/en-us/library/aa140068(la oficina.10).aspx

Otros consejos

Sí, es posible hacer la compilación condicional en Excel VBA. A continuación se muestra una breve recursos y un código de ejemplo: compilación condicional

#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

Se puede publicar las líneas de código que?

Si se trata de una constante como vbYes o xlFileFormat o lo que sea, utilizar el valor numérico correspondiente.

Muéstrame lo que tienes, voy a ver si puedo refactorizar.

Bill

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top