다음을 통해 공유


64비트 환경에서 실행하는 VBA 매크로에서 반환 형식을 명시적으로 선언해야 합니다.

요약

일부 콜백 함수를 사용하여 64비트 버전의 Microsoft Office에서 Microsoft VBA(Visual Basic for Applications)에서 일부 API를 선언하는 일부 코드를 실행하려고 하면 코드가 실패합니다. 그러나 이 코드는 32비트 버전의 Microsoft Office에서 실패하지 않습니다. 이 문제는 반환 형식이 64비트 VBA 애플리케이션에서 명시적으로 선언되어야 하기 때문에 발생합니다. 

참고 반환 형식이 명시적으로 선언되지 않은 경우 값은 Variant 데이터 형식을 사용하여 처리됩니다.

추가 정보

"요약" 섹션에 언급된 이 문제를 테스트하려면 다음 단계를 수행합니다.

  1. 64비트 버전의 Microsoft Word 2010 Word 문서를 엽니다.
  2. VBA 편집기를 열려면 리본 메뉴의 개발자 탭에서 Visual Basic을 클릭합니다.
  3. VBA 편집기에서 새 모듈을 만들려면 다음 단계를 수행합니다.
    1. VBA 편집기의 왼쪽 위 영역에 있는 프로젝트 트리 아래에서 이 문서를 마우스 오른쪽 단추로 클릭합니다.
    2. 삽입을 선택한 다음 모듈을 클릭합니다.
    3. 새 모듈 노드가 프로젝트 트리 아래에 표시되고 새 모듈에 대한 VBA 코드 창이 열립니다.
    4. 다음 코드를 복사한 다음 새 모듈의 VBA 코드 창에 코드를 붙여넣습니다.
Option Explicit
Dim iCounter As Integer
Dim lngTimerID As Long
Dim BlnTimer As Boolean

Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As Long, _
 ByVal nIDEvent As Long, _
 ByVal uElapse As Long, _
 ByVal lpTimerFunc As LongPtr) As Long

Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As Long, _
 ByVal nDEvent As Long) As Long

Sub TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)
iCounter = iCounter + 1
End Sub 

Private Sub ToggleTimer()
 If BlnTimer = False Then
 lngTimerID = SetTimer(0, 0, 200, AddressOf TimerProc)
 If lngTimerID = 0 Then
 MsgBox "Timer not created. Ending program"
 Exit Sub
 End If
 BlnTimer = True
 Else 
lngTimerID = KillTimer(0, lngTimerID)
 If lngTimerID = 0 Then
MsgBox "Could not kill the timer"
 End If
 BlnTimer = False
 MsgBox " Timer Count " & iCounter
 End If

End Sub

Sub Macro1()
 ToggleTimer
End Sub   
  1. 코드를 실행하려면 VBA 편집기에서 실행을 클릭하거나 실행 메뉴에서 하위\사용자 양식 실행 명령을 선택합니다. 그런 다음 표시되는 대화 상자에서 매크로1 실행을 클릭합니다. 
  2. 그런 다음 하위 프로시저에서 다음과 유사한 코드를 함수 프로시저로 변경합니다.
Sub TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)

iCounter = iCounter + 1
End Sub
After you have changed the Sub procedure to a Function procedure, the code resembles the following:

Function TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)

iCounter = iCounter + 1
End Function   
  1. 코드를 다시 실행하면 다음 오류가 발생합니다.

Microsoft Word에서 정보를 복구하려고 합니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.

반환 형식은 Variant 데이터 형식일 수 없습니다. 이 제한은 64비트 환경에서 실행하는 VBA의 콜백 함수에만 적용됩니다. 이 제한은 외부 API 메서드를 호출하기 위한 Declare 문에는 적용되지 않습니다. 32비트 환경에서 실행하는 VBA에서는 Variant 데이터 형식을 사용하는 함수 프로시저와 Void 값, 16비트인 정수 데이터 형식 또는 32비트인 Long 데이터 형식을 반환할 수 있는 API 콜백에 대한 하위 프로시저를 사용할 수 있습니다. 따라서 앞에서 언급한 단계는 32비트 환경에서 VBA에서 코드를 실행하는 경우 오류를 생성하지 않습니다. 이 문제는 64비트 환경에서 실행하는 VBA의 포인터 변경으로 인해 발생합니다. 따라서 콜백 함수는 64비트 환경에서 올바른 반환 형식을 사용하여 명시적으로 선언해야 합니다. 이 동작을 수행하려면 앞에서 언급한 예제에 있는 TimerProc을 함수 프로시저가 아닌 하위 프로시저로 선언해야 합니다.