Frage

Ich habe Code, der auf beiden Excel 2003 und Excel 2007 ausgeführt werden muss, und es gibt ein paar Stellen, wo Änderungen in den Versionen der Code führen zu stoppen. Ich habe versucht, diese Zeilen aus mit If-Else-Anweisungen zu trennen, aber der Code kompiliert nicht auf, weil es entweder nicht den Code für die anderen verwendeten nicht erkennt. Gibt es eine Möglichkeit, eine Version sagen könnte, einen Code-Block, ähnlich ein C oder C ++ zu ignorieren - Stil #ifdef, in VBA

?
War es hilfreich?

Lösung

  

Dies ist ein guter Ausgangspunkt, aber es wird nicht mit der Version von Excel arbeiten, die seine auf ausgeführt wird, kann, da dies nur zur Laufzeit herausgefunden werden, keine Zeit kompilieren.

Wenn Sie Ihren Code verzweigen, basierend auf Informationen nur auffindbar zur Laufzeit Sie als Lösung späten Bindung betrachten könnten. Es gibt zwei Möglichkeiten, die Sie Version Probleme schleichen können.

Der erste Weg kann verwendet werden, wenn Sie eine Eigenschaft oder Methode zugreifen müssen, die in bestimmten Versionen existiert nur, können Sie CallByName verwenden. Der Vorteil von Call-by-Namen ist, dass es die frühe Bindung zu erhalten erlaubt (und Intellisense) für Ihre Objekte so viel wie möglich.

Um ein Beispiel zu geben, Excel 2007 hat eine neue TintAndShade Eigenschaft. Wenn Sie die Farbe eines Bereichs und für Excel 2007 auch dafür sorgen, TintAndShade ändern wollte auf 0 gesetzt hätten, würden Sie in Schwierigkeiten geraten, weil Ihr Code wird nicht in Excel 2003 erstellen, die nicht über TintAndShade als Eigenschaft des Range-Objekt. Wenn Sie die Eigenschaft zugreifen, die Sie wissen, ist nicht in allen Versionen mit CallByName, werden Sie Code in allen Versionen fein, kompilieren, aber nur in den Versionen laufen Sie angeben. Siehe unten:

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 

Der zweite Weg ist für Klassen, die über „Neu“ instanziiert werden müssen und nicht existieren auch in alten Versionen. Sie werden nicht in dieses Problem mit Excel laufen, aber ich werde eine Quickie Demo geben, so können Sie sehen, was ich meine:

Stellen Sie sich vor, dass Sie wollten Datei-IO tun, und aus irgendeinem bizarren Grund nicht alle Computer auf ihnen die Microsoft Scripting Runtime hatte. Aber aus irgendeinem ebenso bizarren Grunde wollte man sicherstellen, dass es verwendet wurde, wenn es verfügbar ist. Wenn Sie einen Verweis auf sie gesetzt und die frühe Bindung verwenden in Ihrem Code, wird der Code kompiliert nicht auf Systemen, die nicht über die Datei haben. So verwenden Sie die späte Bindung statt:

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

Es ist eine umfassende Liste aller Zugänge und Veränderungen in Excel-Objektmodell seit 2003:
http://msdn.microsoft.com/en-us/library/bb149069. aspx Für Änderungen zwischen 1997 und 2000 gehen hier:
http://msdn.microsoft.com/en-us /library/aa140068(office.10).aspx

Andere Tipps

Ja, es ist möglich, die bedingte Kompilierung in Excel VBA zu tun. Es folgt eine kurze Ressource und einige Beispiel-Code: 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

Können Sie die beanstandeten Codezeilen schreiben?

Wenn es eine Konstante wie vbYes oder xlFileFormat oder was auch immer, verwenden Sie den entsprechenden numerischen Wert.

Zeigen Sie mir, was du hast, ich werde sehen, ob ich es umgestalten kann.

Bill

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top