VBA 코드를 64비트 Windows와 호환되도록 하려면 어떻게 해야 합니까?
나는 Excel 2007에서 개발된 VBA 애플리케이션을 가지고 있으며, 그것은 다음 코드를 포함하고 있습니다.ShellExecute
에서 기능.Shell32.dll
:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
내가 원래 말했던 것은:
이 애플리케이션은 64비트 버전의 Windows(32비트 Office 2007 사용)에서는 컴파일되지 않을 것으로 보입니다.나는 이것이 왜냐하면
Declare
선언을 업데이트해야 합니다.Office 2010에서 새로운 VBA 런타임(VB7)을 도입했으며, 이것은 다음에서 사용할 수 있는 몇 가지 새로운 키워드를 가지고 있다는 것을 읽었습니다.
Declare
64비트 윈도우즈에서 제대로 작동할 수 있도록 하는 명령문입니다.또한 VB7에는 응용 프로그램이 32비트 또는 64비트 Windows에서 실행되는지 여부에 따라 이전 선언 또는 새 선언이 사용되는 조건부 컴파일을 지원하는 새로운 미리 정의된 컴파일러 상수가 있습니다.하지만 저는 Office 2007에 얽매여 있기 때문에 대안이 필요합니다.옵션은 무엇입니까? (가능하다면 애플리케이션의 두 가지 버전을 별도로 릴리스하지 않는 것이 좋습니다.
하지만, 아래 David의 답변에 따르면, 나는 나의 상황에 대해 잘못 알고 있었습니다.Declare
문이 작동하지 않습니다.Windows 64비트의 Office 2010 64비트만 작동하지 않습니다.따라서 Office 2007은 문제가 되지 않습니다.
Office 2010이 탑재된 새로운 64비트 시스템에서 사내 툴을 사용하는 사람들에게서 이미 이 문제에 직면했습니다.
제가 해야 할 일은 코드 줄을 다음과 같이 바꾸는 것이었습니다.
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
대상:
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
물론 사용 중인 라이브러리를 두 컴퓨터에서 모두 사용할 수 있는지 확인하고 싶겠지만, 지금까지 사용한 라이브러리는 문제가 되지 않았습니다.
이전 VB6에서 PtrSafe는 유효한 명령도 아니므로 컴파일 오류가 있는 것처럼 빨간색으로 표시되지만 컴파일러가 if 블록의 첫 번째 부분을 건너뛸 것이기 때문에 실제로 오류가 발생하지는 않습니다.
위의 코드를 사용하는 응용 프로그램은 Office 2003, 2007 및 2010 32 및 64비트에서 완벽하게 컴파일되고 실행됩니다.
나는 이 코드를 찾았습니다. (참고로 일부는Long
로 변경됨LongPtr
):
Declare PtrSafe Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As _
String, ByVal nShowCmd As Long) As LongPtr
출처: http://www.cadsharp.com/docs/Win32API_PtrSafe.txt
Office 2007은 32비트 전용이므로 문제가 없습니다.32비트 버전과 64비트 버전이 모두 있는 Office 64비트에서만 문제가 발생합니다.
Office 2007만 있는 경우 64비트 Office 2010으로 사용자를 지원할 수 없습니다.해결책은 업그레이드입니다.
유일한 한경우일유경우▁the.Declare
당신이 가지고 있는 것은 그것입니다.ShellExecute
그러면 64비트 오피스를 손에 넣으면 할 일이 별로 없겠지만, 출하하는 프로그램을 실행할 수 없을 때 사용자를 지원하는 것은 실제로 실행 가능하지 않습니다!그들이 버그를 보고할 때 당신은 어떻게 할 것인지 생각해 보세요?
PtrSafe를 사용하여 Excel 2010에서 어떻게 작동하는지 확인하십시오.
"Microsoft Excel 2010 Power Programming with VBA" 책의 오타 수정.
#If vba7 and win64 then
declare ptrsafe function ....
#Else
declare function ....
#End If
val(응용 프로그램)버전)>Office 2010에는 32비트 버전과 64비트 버전이 모두 있기 때문에 12.0이 작동하지 않습니다.
실제로 32비트 또는 64비트 플랫폼을 확인하는 올바른 방법은 모든 VBA 버전(16비트, 32비트 및 64비트 버전)에 정의된 Win64 상수를 사용하는 것입니다.
#If Win64 Then
' Win64=true, Win32=true, Win16= false
#ElseIf Win32 Then
' Win32=true, Win16=false
#Else
' Win16=true
#End If
소스: 컴파일러 상수에 대한 VBA 도움말
모든 버전의 Office에 대해 작성하려면 최신 VBA7 및 Win64 조건부 컴파일러 상수를 조합하여 사용합니다.
VBA7
코드가 VB 편집기 버전 7(Office 2010+에서 제공되는 VBA 버전)에서 실행되고 있는지 여부를 확인합니다.
Win64
실행 중인 Office 버전(32비트 또는 64비트)을 결정합니다.
#If VBA7 Then
'Code is running VBA7 (2010 or later).
#If Win64 Then
'Code is running in 64-bit version of Microsoft Office.
#Else
'Code is running in 32-bit version of Microsoft Office.
#End If
#Else
'Code is running VBA6 (2007 or earlier).
#End If
자세한 내용은 Microsoft 지원 문서를 참조하십시오.
이 대답은 문맥이 틀릴 수 있습니다.저는 요즘 VBA가 CLR에서 실행되는 줄 알았는데 실행되지 않습니다.어쨌든, 이 답변은 누군가에게 유용할 수 있습니다.그렇지 않으면.
Office 2010 32비트 모드를 실행하면 Office 2007과 동일합니다("문제"는 Office가 64비트 모드로 실행된다는 것입니다).여기서 중요한 것은 실행 컨텍스트(VBA/CLR)의 비트이며 로드된 VBA/CLR의 비트는 호스트 프로세스의 비트에 따라 달라집니다.
통화 중 눈에 은 32/64를 사용하는 입니다.long
또는int
CLR ) )IntPtr
(비트성을 기반으로 한 동적 크기)는 "다양한 유형"을 나타냅니다.
Shell Execute 함수의 서명은 다음과 같습니다.
HINSTANCE ShellExecute(
__in_opt HWND hwnd,
__in_opt LPCTSTR lpOperation,
__in LPCTSTR lpFile,
__in_opt LPCTSTR lpParameters,
__in_opt LPCTSTR lpDirectory,
__in INT nShowCmd
);
가 HWND인 합니다.IntPtr
(이는 HWND가 "핸들"이기 때문입니다.void*
및 /"pointer")가 아닌 경우long
예를 들어 pinvoke.net Shell Execute를 참조하십시오. (일부 "shadow"는 pinvoke.net 에서 음습하지만, 처음에는 보기에 좋습니다.)
해피 코딩.
"새로운 구문"에 대해서는 저는 전혀 모릅니다.
언급URL : https://stackoverflow.com/questions/5506912/how-should-i-make-my-vba-code-compatible-with-64-bit-windows
'programing' 카테고리의 다른 글
전체 경로 없이 현재 디렉토리 또는 폴더 이름 가져오기 (0) | 2023.05.10 |
---|---|
VB에서 #IF DEBUG를 사용하는 방법.그물 (0) | 2023.05.10 |
mongo 명령을 사용할 수 없습니다. mac에서 명령을 찾을 수 없음을 표시합니다. (0) | 2023.05.10 |
윈도우즈의 로컬 파일 시스템 전반에서 GIT 클론 repo (0) | 2023.05.10 |
컴파일을 비교합니다.NET 어셈블리? (0) | 2023.05.10 |