2014-01-09 1 views
3

현재 작업중인 새로운 win7 시스템에 적용 할 수있는 VBA 코드를 만들고 있습니다. 즉, 새로운 64 비트 호환성으로 많은 기능을 추가해야합니다. 현재 this 홈페이지의 지침을 따르고 있습니다.Excel 2003의 PtrSafe에서 문제가 발생했습니다.

그러나
#If VBA7 Then 
    Declare PtrSafe Function CreateProcess Lib "kernel32" 'More code, see below. 
#Else 
    Declare Function CreateProcess Lib "kernel32" 'More code, see below. 
#EndIf 

은 현재 VBA 오류 메시지가 다음 나에게주고 내 코드를 저장할 때 :

this error code

가 참고 : 위의 코드는 설명 된 코드를 포함를 나는 다음 그들에게 매우 유용 및 구현 앞에서 언급 한 링크 : from jkp-adsDeclare PtrSafe Function CreateProcess Lib "kernel32" Alias "CreateProcessA"에 오류가 나타납니다. 전체 코드는 here입니다.

무엇이 여기에 있습니까? 감사합니다.

업데이트 내 전체 코드는 :

Option Explicit 
Const INFINITE = &HFFFF 
Const STARTF_USESHOWWINDOW = &H1 
Private Enum enSW 
    SW_HIDE = 0 
    SW_NORMAL = 1 
    SW_MAXIMIZE = 3 
    SW_MINIMIZE = 6 
End Enum 

Private Type PROCESS_INFORMATION 
    hProcess As Long 
    hThread As Long 
    dwProcessId As Long 
    dwThreadId As Long 
End Type 

Private Type STARTUPINFO 
    cb As Long 
    lpReserved As String 
    lpDesktop As String 
    lpTitle As String 
    dwX As Long 
    dwY As Long 
    dwXSize As Long 
    dwYSize As Long 
    dwXCountChars As Long 
    dwYCountChars As Long 
    dwFillAttribute As Long 
    dwFlags As Long 
    wShowWindow As Integer 
    cbReserved2 As Integer 
    lpReserved2 As Byte 
    hStdInput As Long 
    hStdOutput As Long 
    hStdError As Long 
End Type 

Private Type SECURITY_ATTRIBUTES 
    nLength As Long 
    lpSecurityDescriptor As Long 
    bInheritHandle As Long 
End Type 

Private Enum enPriority_Class 
    NORMAL_PRIORITY_CLASS = &H20 
    IDLE_PRIORITY_CLASS = &H40 
    HIGH_PRIORITY_CLASS = &H80 
End Enum 
#If VBA7 Then 
private Declare PtrSafe Function CreateProcess Lib "kernel32" _ 
Alias "CreateProcessA" (ByVal lpApplicationName As String, _ 
         ByVal lpCommandLine As String, _ 
         lpProcessAttributes As SECURITY_ATTRIBUTES, _ 
         lpThreadAttributes As SECURITY_ATTRIBUTES, _ 
         ByVal bInheritHandles As Long, _ 
         ByVal dwCreationFlags As Long, _ 
         lpEnvironment As Any, _ 
         ByVal lpCurrentDriectory As String, _ 
         lpStartupInfo As STARTUPINFO, _ 
         lpProcessInformation As PROCESS_INFORMATION) As LongPtr 

#Else 
Declare Function CreateProcess Lib "kernel32" _ 
Alias "CreateProcessA" (ByVal lpApplicationName As String, _ 
         ByVal lpCommandLine As String, _ 
         lpProcessAttributes As SECURITY_ATTRIBUTES, _ 
         lpThreadAttributes As SECURITY_ATTRIBUTES, _ 
         ByVal bInheritHandles As Long, _ 
         ByVal dwCreationFlags As Long, _ 
         lpEnvironment As Any, _ 
         ByVal lpCurrentDriectory As String, _ 
         lpStartupInfo As STARTUPINFO, _ 
         lpProcessInformation As PROCESS_INFORMATION) As Long 
#End If 

는 지금, 나는 몇 가지를 강조하고 싶다. 먼저 Excel 2003 및 Windows XP 32 비트를 실행하고 있습니다. 이 외에도 코드를 실행하려고 시도하지 않았습니다.. 왜 물을 수 있습니다. 그 이유는 간단합니다. 에디터는 내가 할 수 있기 전에 컴파일 에러를 낸다. 이 컴파일 오류는이 코드 위에있는 그림에서 볼 수 있습니다. 일부 코드의 스크린 샷을 찍었으며 특히 컴파일 오류가 발생한 곳을 찍었습니다. 이는 모습입니다 :

Error

UpdateUpdate : 는 "이 문제를 해결하려면 무시"컴파일 오류 "과의 VBA 코드를 실행 : 그냥 해상도가 다음과 같은 것 같습니다 this article from MS support. 발견 Office 2010 프로그램의 64 비트 버전. " 나는 아직도 어떤 해결책이 존재하기를 바랍니다.

+1

내게 잘 보이네요. 단, '# EndIf'에 오타가있는 공백이 있어야합니다. BTW [이] (http://www.jkp-ads.com/articles/apideclarations.asp) 링크를 보았습니까? –

+0

@PradeepKumar : 질문에서 OP와 똑같은 링크입니다 :-) 또한 VBA 편집기는 자동으로 공간을 추가하므로 문제가되지 않아야합니다. –

+0

@ Jean-FrançoisCorbett : 아! 예 :) 나는 그것을 놓쳤습니다 ... –

답변

1

이것은 해결책은 아니지만 조사 할 경로입니다.

컴파일러가 #If VBA7 Then 아래의 내용을 보는 것처럼 보입니다. 그러나 Excel 2003에서는이 문제가 전혀 발생하지 않아야합니다. #If VBA7 Then 아래에있는 것은 무엇이든 쓰레기로 바꾸어 쓰고 #Else 부분에 하나의 선언을 추가하십시오 (예 : #Else).

#If VBA7 Then 
    ksjdhfg lkjsdh fgkjh,dlgf sldjkgflsd g 'obvious syntax error 
#Else 
    Const vOlder As String = "older VBA" 
    Declare Function CreateProcess Lib "kernel32" '... keep this part as it was 
#End If 

는 그 다음 컴파일하면이보고 실행하려고 :

Sub tester() 
    Debug.Print vOlder 
End Sub 

이 컴파일하고 7.0 VBA의 이전 버전을 가지고 있기 때문에 Excel 2003에서 잘 실행해야합니다. #If VBA7 Then 아래의 내용은 문법 오류 또는 기타 사항과 상관없이 완전히 무시되어야하며 #Else 아래의 내용 (예 : vOlder에 액세스 할 수 있어야합니다.

오류 추적에 도움이되는지 알려주십시오.

+0

실제로 좋은 점! 나는 이것을 시도하고 그것을 작동합니다. 그러나 다른 조각의 코드를 삽입하면 컴파일 오류가 계속 나타납니다. 컴파일 오류 (이전의 오류 메시지 참조)가 나타나면 PtrSafe가 검은 색으로 강조 표시됩니다. 나머지 코드는 'Declare PtrSafe 함수 CreateProcess Lib "kernel32"별칭 "CreateProcessA"가 빨간색으로 표시됩니다. 그것은 PtrSafe로부터 어떤 것을 기대하는 것처럼 솔기가 있습니다. – SteewDK

+0

'컴파일러가 #If VBA7 아래의 내용을보고있는 것처럼 보입니다. 그렇다면. 그러나 이것은 Excel 2003에서 전혀 일어나지 않아야합니다. '아니오 그게 사실이 아닙니다 :) 컴파일러는 각각의 모든 라인을 검사합니다. 그리고 당신이'Debug | 컴파일 VBA 프로젝트' –

+0

@SteewDK : 귀하의 질문에 내 코멘트를 놓친 것? –

2

귀하의 질문에 대한 아래의 저의 의견 (귀하는 무시한 것입니다 ... 실수로 나는 추측합니까?) 모든 매개 변수를 올바르게 지정하지 않았기 때문에 오류가 발생한다고 생각합니다.

이것을 시도하면 잘 컴파일됩니다.

Const INFINITE = &HFFFF 
Const STARTF_USESHOWWINDOW = &H1 
Private Enum enSW 
    SW_HIDE = 0 
    SW_NORMAL = 1 
    SW_MAXIMIZE = 3 
    SW_MINIMIZE = 6 
End Enum 

Private Type PROCESS_INFORMATION 
    hProcess As Long 
    hThread As Long 
    dwProcessId As Long 
    dwThreadId As Long 
End Type 

Private Type STARTUPINFO 
    cb As Long 
    lpReserved As String 
    lpDesktop As String 
    lpTitle As String 
    dwX As Long 
    dwY As Long 
    dwXSize As Long 
    dwYSize As Long 
    dwXCountChars As Long 
    dwYCountChars As Long 
    dwFillAttribute As Long 
    dwFlags As Long 
    wShowWindow As Integer 
    cbReserved2 As Integer 
    lpReserved2 As Byte 
    hStdInput As Long 
    hStdOutput As Long 
    hStdError As Long 
End Type 

Private Type SECURITY_ATTRIBUTES 
    nLength As Long 
    lpSecurityDescriptor As Long 
    bInheritHandle As Long 
End Type 

Private Enum enPriority_Class 
    NORMAL_PRIORITY_CLASS = &H20 
    IDLE_PRIORITY_CLASS = &H40 
    HIGH_PRIORITY_CLASS = &H80 
End Enum 

#If VBA7 Then 
    Declare PtrSafe Function CreateProcess Lib "kernel32" _ 
    Alias "CreateProcessA" (ByVal lpApplicationName As String, _ 
          ByVal lpCommandLine As String, _ 
          lpProcessAttributes As SECURITY_ATTRIBUTES, _ 
          lpThreadAttributes As SECURITY_ATTRIBUTES, _ 
          ByVal bInheritHandles As Long, _ 
          ByVal dwCreationFlags As Long, _ 
          lpEnvironment As Any, _ 
          ByVal lpCurrentDriectory As String, _ 
          lpStartupInfo As STARTUPINFO, _ 
          lpProcessInformation As PROCESS_INFORMATION) As LongPtr 
#Else 
    Declare Function CreateProcess Lib "kernel32" _ 
    Alias "CreateProcessA" (ByVal lpApplicationName As String, _ 
          ByVal lpCommandLine As String, _ 
          lpProcessAttributes As SECURITY_ATTRIBUTES, _ 
          lpThreadAttributes As SECURITY_ATTRIBUTES, _ 
          ByVal bInheritHandles As Long, _ 
          ByVal dwCreationFlags As Long, _ 
          lpEnvironment As Any, _ 
          ByVal lpCurrentDriectory As String, _ 
          lpStartupInfo As STARTUPINFO, _ 
          lpProcessInformation As PROCESS_INFORMATION) As Long 
#End If 
+0

먼저 감사의 말씀을 전합니다. 위에서 복사 한 코드를 모듈에 붙여 넣으려고했지만 컴파일 오류가 여전히 발생하고 전체 함수 ('PrtSafe CreateProcess')가 빨간색으로 표시됩니다. Excel 2003 및 Windows XP 32 비트를 실행하고 있습니다. – SteewDK

+0

질문을 정확한 코드로 업데이트 할 수 있습니까? 또는 스크린 샷? –

+0

@SteewDK : 스크린 샷을 보았습니다. 'Declare' 전에'Private'이라는 단어를 지우고 무슨 일이 일어나는 지 봅시다. –

관련 문제