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

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기:2210978
요약
일부 콜백 함수를 사용 하 여 64 비트 버전의 Microsoft Office 일부 Api는 Microsoft Visual Basic for Applications (VBA)를 선언 하는 코드를 실행 하려고 할 때 코드가 실패 합니다. 그러나이 코드는 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

      PtrSafe 함수 SetTimer Lib "user32" 선언 (ByVal hwnd로 긴 _

      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
      ByVal dwTime로 긴)

      iCounter = iCounter + 1
      End Sub

      Private Sub ToggleTimer()

      If BlnTimer = False Then

      lngTimerID = SetTimer (0, 0, 200, AddressOf TimerProc)

      If lngTimerID = 0 Then

      MsgBox "타이머가 만들어지지 않았습니다. 프로그램을 종료합니다."
      Exit Sub

      End If

      BlnTimer = True
      다른

      lngTimerID = KillTimer (0, lngTimerID)

      If lngTimerID = 0 Then
      MsgBox "하지 죽 일 수 있는 타이머"
      End If

      BlnTimer =
      MsgBox "타이머 수" & iCounter

      End If

      End Sub

      Sub Macro1()
      ToggleTimer
      End Sub
  4. 코드를 실행 하려면 VBA 편집기에서 실행 을 클릭 하거나 실행메뉴에서 Sub\User 양식 실행 명령을 선택 합니다. Macro1 실행 나타나는 대화 상자에서을 누릅니다.
  5. 다음 Function 프로시저는 Sub 프로시저에서 다음과 유사한 코드를 변경:

    Sub TimerProc(ByVal hwnd As Long, _

    ByVal uMsg As Long, _
    로 긴, _ ByVal idEvent
    ByVal dwTime로 긴)


    iCounter = iCounter + 1
    End Sub

    Function 프로시저는 Sub 프로시저 변경한 후 코드는 다음과 같습니다.

    Function TimerProc(ByVal hwnd As Long, _

    ByVal uMsg As Long, _
    로 긴, _ ByVal idEvent
    ByVal dwTime로 긴)


    iCounter = iCounter + 1
    끝 함수
  6. 코드를 다시 실행 하 고 다음과 같은 오류가 발생 합니다.

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

Windows API 함수를 사용 하는 방법에 대 한 자세한 내용은 Microsoft 기술 자료의 다음 문서 번호를 클릭 합니다.
180736 Windows API 함수를 사용 하 여 타이머 이벤트를 만드는 방법

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 2210978 - 마지막 검토: 07/03/2016 15:44:00 - 수정: 3.0

Microsoft Office Professional 2010

  • kbhowto kbinfo kbmt KB2210978 KbMtko
피드백