문제

Excel 2003과 Excel 2007에서 실행 해야하는 코드가 있으며, 버전의 변경으로 인해 코드가 중단되는 몇 가지 지점이 있습니다. 이 라인을 IF-ELSE 문으로 분리하려고 시도했지만 코드는 다른 코드에 사용 된 코드를 인식하지 못하기 때문에 코드가 컴파일되지 않습니다. VBA에서 C 또는 C ++ -Style #Ifdef와 유사한 코드 블록을 무시하도록 하나의 버전을 알릴 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

이것은 좋은 출발점이지만, 실행중인 Excel 버전에서는 작동하지 않습니다.

실행 시간에만 발견 할 수있는 정보를 기준으로 코드를 분기 해야하는 경우 늦은 바인딩을 솔루션으로 간주 할 수 있습니다. 버전 문제에 대해 몰래 빠져 나갈 수있는 두 가지 방법이 있습니다.

첫 번째 방법은 특정 버전에만 존재하는 속성 또는 메소드에 액세스 해야하는 경우 사용할 수 있습니다. CallByName을 사용할 수 있습니다. 이름으로 전화의 장점은 가능한 한 객체에 대한 조기 바인딩 (및 Intellisense)을 보존 할 수 있다는 것입니다.

예를 들어, Excel 2007에는 새로운 Tintandshade 속성이 있습니다. 범위의 색상을 변경하려면 Excel 2007의 경우 Tintandshade가 0으로 설정되었는지 확인하십시오. Range 객체의 속성으로 Tintandshade가없는 Excel 2003에서 코드가 컴파일되지 않기 때문에 문제가 발생합니다. 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.aspx1997 년에서 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