[vba] CreateObject 오류시 x64에서 ScriptControl등 사용하는 방법 > vb6.0/vba

본문 바로가기

vb6.0/vba

[vba] [vba] CreateObject 오류시 x64에서 ScriptControl등 사용하는 방법

회원사진
하나를하더라도최선을
2020-09-22 22:52 7,650 0

본문



vba 사용하는 사람이면 그냥 32비트 깔아라...

엑셀 2016을 설치하고 나서 영 불편한 게 아니네요....

64 비트 실행 환경에서 ScriptControl이 제공되지 않아 오류가 발생합니다.

미래를 생각하는 가장 좋은 방법은 ScriptControl의 대안을 고려하는 것입니다.

그러나 다른 수단이 없는 것은 아닙니다.

64 비트 Windows에는 32 비트 실행 환경도 있습니다.

ScriptControl은 32 비트 실행 환경에서 제공됩니다.

Function CreateObjectx86(sProgID)

Static oWnd As Object

Dim bRunning As Boolean

#If Win64 Then

bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0

If IsEmpty(sProgID) Then

If bRunning Then oWnd.Close

Exit Function

End If

If Not bRunning Then

Set oWnd = CreateWindow()

oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"

End If

Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)

#Else

If Not IsEmpty(sProgID) Then Set CreateObjectx86 = CreateObject(sProgID)

#End If

End Function

Function CreateWindow()

' source http://forum.script-coding.com/viewtopic.php?pid=75356#p75356

Dim sSignature, oShellWnd, oProc

On Error Resume Next

Do Until Len(sSignature) = 32

sSignature = sSignature & Hex(Int(Rnd * 16))

Loop

CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False

Do

For Each oShellWnd In CreateObject("Shell.Application").Windows

Set CreateWindow = oShellWnd.GetProperty(sSignature)

If Err.Number = 0 Then Exit Function

Err.Clear

Next

Loop

End Function




마이크로소프트는

"대부분의 사용자에게 32 비트 오피스가 권장된다"

라고 말했다.

https://technet.microsoft.com/en-us/library/ee681792.aspx

에서 발췌한 내용입니다.

32 비트 Office는 대부분의 사용자에게 권장됩니다.

대부분의 다른 응용 프로그램, 특히 타사 추가 기능과 더 호환되기 때문에 대부분의 사용자에게 32 비트 버전의 Office를 사용하는 것이 좋습니다. 이것이 64 비트 Windows 운영 체제에서도 32 비트 버전의 Office 2013이 기본적으로 설치되는 이유입니다. 이러한 시스템에서 32 비트 Office 클라이언트는 WOW64 (Windows-32-on-Windows-64) 설치로 지원됩니다. WOW64는 32 비트 Windows 기반 응용 프로그램을 64 비트 Windows 시스템에서 원활하게 실행할 수 있도록하는 x86 에뮬레이터입니다. 이를 통해 사용자는 32 비트 Office에서 기존 Microsoft ActiveX 컨트롤 및 COM 추가 기능을 계속 사용할 수 있습니다.

64 비트 Office는 특정 유형의 사용자 및 워크로드에만 혜택을주는 이점이 있습니다.

64 비트 Office 2013 배포를 고려해야하는 몇 가지 경우가 있습니다. 다음은 몇 가지 예입니다.

복잡한 Excel 워크 시트로 작업하는 Excel 전문가 사용자는 64 비트 Office 2013을 사용하여 이점을 얻을 수 있습니다. 이는 64 비트 Office가 파일 크기에 엄격한 제한을 두지 않기 때문입니다. 대신 통합 문서 크기는 사용 가능한 메모리 및 시스템 리소스에 의해서만 제한됩니다. 반면에 32 비트 Office는 동일한 프로세스에서 실행되는 Excel, 통합 문서 및 추가 기능이 공유하는 2GB의 가상 주소 공간으로 제한됩니다. (디스크에서 2GB보다 작은 워크 시트에는 2GB 이상의 주소 지정 가능 메모리를 차지하기에 충분한 데이터가 포함되어있을 수 있습니다.) Excel 사양 및 제한데이터 모델 사양 및 제한 에서 자세히 알아볼 수 있습니다 .

Project 2013을 사용하는 사용자는 2GB가 넘는 Project 파일을 사용할 때, 특히 대규모 프로젝트에 대한 많은 하위 프로젝트를 처리하는 경우에도 이점이 있습니다.

사내 Office 솔루션 개발자는 이러한 솔루션을 테스트하고 업데이트하기 위해 64 비트 Office 2013에 액세스 할 수 있어야합니다.

Office 2013은 하드웨어 데이터 실행 방지 (DEP)를 통해 향상된 기본 보안 보호를 제공합니다. (DEP)는 시스템에서 악성 코드가 실행되는 것을 방지하기 위해 메모리에 대한 추가 검사를 수행하는 일련의 하드웨어 및 소프트웨어 기술입니다. 64 비트 설치의 경우 Office 응용 프로그램에 대해 항상 DEP가 적용됩니다. 32 비트 설치에서는 그룹 정책 설정을 사용하여 DEP를 구성 할 수 있습니다.

Office 64 비트 배포를위한 요구 사항 검토

Office 2013 시스템 요구 사항검토하는 것 외에도 64 비트 Office를 배포하기 전에 다음 섹션을 검토하는 것이 좋습니다.

64 비트 Office는 64 비트 Windows에서만 작동합니다.

동일한 컴퓨터에서 32 비트 및 64 비트 버전의 Office를 실행하는 것은 지원되지 않습니다.

Office 2013으로 업그레이드 할 때 아키텍처 버전은 이전 버전과 새 버전이 동일해야합니다.

32 비트와 64 비트 버전간에 전환하려면 Office 2013을 제거한 다음 다시 설치해야합니다.

일부 응용 프로그램은 64 비트 Office 2013 설치를 차단합니다.

64 비트 Office는 64 비트 Windows에서만 작동합니다.

64 비트 Office는 Windows 7, Windows 8, Windows 8.1, Windows Server 2008 R2, Windows Server 2012 및 Windows Server 2012 R2의 64 비트 버전에만 설치할 수 있습니다.

동일한 컴퓨터에서 32 비트 및 64 비트 버전의 Office를 실행하는 것은 지원되지 않습니다.

Office 2013은 64 비트 및 32 비트 버전 Office의 병렬 설치 실행을 지원하지 않습니다. 예를 들어 Office 2010 32 비트를 Office 2013 64 비트와 나란히 설치할 수 없습니다. 이는 Windows Installer (MSI) 및 Office 2013의 간편 실행 설치 모두에 적용됩니다. 이렇게하면 오류 메시지가 표시되고 계속할 수 없게됩니다.

Office 2013으로 업그레이드 할 때 아키텍처 버전은 이전 버전과 새 버전이 동일해야합니다.

MSI 기반 버전의 Office 2013을 배포하는 경우 Office를 동일한 아키텍처로만 업그레이드 할 수 있습니다. 예를 들어 Office 2010 32 비트에서 Office 2013 32 비트로 업그레이드하고 Office 2010 64 비트에서 Office 2013 64 비트로 업그레이드 할 수 있습니다.

32 비트와 64 비트 버전간에 전환하려면 Office 2013을 제거한 다음 다시 설치해야합니다.

32 비트를 설치 한 후 나중에 64 비트로 전환하려면 32 비트 버전을 제거한 다음 64 비트 버전을 다시 설치해야합니다. 그 반대의 경우도 마찬가지입니다. 64 비트 Office에서 32 비트 Office로 이동하려면 제거 후 다시 설치해야합니다.

일부 응용 프로그램은 64 비트 Office 2013 설치를 차단합니다.

이러한 응용 프로그램은 64 비트 Office 2013 설치도 차단합니다.

Microsoft Office Excel 뷰어

Access 2013의 Access 데이터베이스 엔진

2007 Office System 용 호환 기능 팩

64 비트 Office 2013을 차단하는 응용 프로그램 및 구성 요소에 대한 자세한 내용은 KB 2269468 : "32 비트 Office 제품이 설치되어 있으므로 64 비트 버전의 Office 2010을 설치할 수 없습니다."라는 오류 메시지가 표시됨을 참조하십시오 .

64 비트 Office를 배포 할 때 고려해야 할 호환성 문제

64 비트 Office 2013을 배포하기 전에 다음과 같은 단점을 고려하십시오.

일부 32 비트 기능은 64 비트 버전의 Office에 없습니다.

그래픽 렌더링은 성능에 영향을 미칠 수 있습니다.

Declare 문을 사용하는 VBA 코드를 업데이트해야합니다.

32 비트 Office 용으로 작성된 ActiveX 컨트롤 및 COM 추가 기능은 64 비트 프로세스에서 작동하지 않습니다.

소스 코드가 제거 된 Microsoft Access .mde, .ade 및 .accde 데이터베이스 파일은 Office 2013의 32 비트와 64 비트 버전간에 이동할 수 없습니다.

Outlook에서 작동하는 MAPI 응용 프로그램을 다시 작성해야합니다.

Office 2013 버전이 등록 된 응용 프로그램과 일치하지 않으면 전체 OLE 활성화가 작동하지 않을 수 있음

일부 32 비트 기능은 64 비트 버전의 Office에 없습니다.

32 비트 버전의 Office에 포함 된 대부분의 기능은 64 비트 버전의 Office에 포함되어 있습니다. 다음은 64 비트 버전의 Office에없는 몇 가지 기능입니다.

Word 레거시 수식 편집기는 64 비트 Office 2013에서 지원되지 않지만 32 비트 Office 2013 설치 (WOW64)에서는 지원됩니다. 그러나 Word 2013의 수식 작성기 기능은 모든 플랫폼에서 작동합니다.

WLL (Word 추가 기능 라이브러리) WLL 파일은 32 비트 Office 2013에서 사용할 수 있으며 64 비트 Office 2013에서는 지원되지 않습니다.

그래픽 렌더링은 성능에 영향을 미칠 수 있습니다.

32 비트와 64 비트 GDI (Graphics Device Interface)의 차이점은 64 비트에서 MMX 지원이 없기 때문에 성능에 영향을 미칠 수 있습니다. 인텔의 MMX 기술은 인텔 아키텍처 (IA) 명령 세트의 확장입니다. 이 기술은 SIMD (Single-Instruction, Multiple-Data) 기술을 사용하여 데이터 요소를 병렬로 처리하여 멀티미디어 및 통신 소프트웨어의 속도를 높입니다.

Declare 문을 사용하는 VBA 코드를 업데이트해야합니다.

64 비트 플랫폼에서 Office 2010 릴리스 (VBA 버전 6 이하) 이전에 작성된 VBA 코드를 실행하면 64 비트 버전의 Office에서 실행되도록 코드를 변경하지 않으면 오류가 발생할 수 있습니다. Office 2010에 도입 된 Microsoft VBA (Visual Basic for Applications) 변경 사항에 대해 알아 보려면 MSDN Library에서 64 비트 Visual Basic for Applications 개요 를 참조하십시오 .

32 비트 Office 용으로 작성된 ActiveX 컨트롤 및 COM 추가 기능은 64 비트 프로세스에서 작동하지 않습니다.

컴퓨터에 64 비트 및 32 비트 컨트롤을 설치할 수 있으며 Office 2013 64 비트는 64 비트 버전의 컨트롤 만 실행할 수 있습니다. 이러한 문제를 해결하기위한 해결 방법은 64 비트 호환 컨트롤 및 추가 기능을 얻거나 Office 2013 32 비트를 설치하는 것입니다.

Office 응용 프로그램에로드되는 컨트롤 외에도 Internet Explorer에서 ActiveX 컨트롤을 사용하는 웹 기반 솔루션이 있습니다. SharePoint Server 2013을 사용하여 만든 Office 2013 데이터 시트보기는 Internet Explorer가 아닌 모든 플랫폼 및 브라우저에서 작동합니다. SharePoint Server 2013 데이터 시트 편집 보기에는 클라이언트 쪽 컨트롤이 필요하지 않습니다. 예를 들어 사용자에게 Office 2010 64 비트 또는 Office 2013이 있는 경우 데이터 시트 에서 편집이 SharePoint Server 2013에서 올바르게 작동합니다.

노트

SharePoint Server 2010의 경우 64 비트 버전은 32 비트 브라우저 (현재 64 비트 Windows 시스템의 기본 브라우저)에서 솔루션을 지원하기 위해 일부 Office 32 비트 클라이언트 쪽 컨트롤을 설치합니다. 데이터 시트에서 편집 64 비트 오피스 2013 클라이언트를 설치하는 경우 SharePoint Server의 2010보기 기능이 지원되지 않습니다. 데이터 시트에서 편집 32 비트 오피스 2013 클라이언트를 설치하면 기능을 사용할 수 있습니다.

소스 코드가 제거 된 Microsoft Access .mde, .ade 및 .accde 데이터베이스 파일은 Office 2013의 32 비트와 64 비트 버전간에 이동할 수 없습니다.

Access 소프트웨어 개발자가 솔루션을 배포하고 지적 재산을 보호하는 일반적인 방법 인 .MDE 및 .ACCDE 파일은 64 비트 버전의 Office에서 작동하지 않습니다. 64 비트 버전에서 솔루션을 다시 컴파일, 다시 테스트 및 재배포하려면 응용 프로그램 개발자에게 문의해야합니다.

Outlook에서 작동하는 MAPI 응용 프로그램을 다시 작성해야합니다.

조직에서 Outlook 용 32 비트 MAPI 응용 프로그램, 추가 기능 또는 매크로를 개발 한 경우 64 비트 플랫폼에서 실행되도록 32 비트 응용 프로그램을 변경하고 다시 작성하기 위해 수행해야하는 작업이 있습니다. 32 비트 및 64 비트 플랫폼 용 Outlook 응용 프로그램을 준비하는 방법에 대한 자세한 내용은 MSDN Library 에서 Microsoft Office Development 의 Outlook 2013 MAPI 참조를 참조하십시오 .

Office 2013 버전이 등록 된 응용 프로그램과 일치하지 않으면 전체 OLE 활성화가 작동하지 않을 수 있음

Office 2013의 버전 (32 비트 또는 64 비트)과 등록 된 응용 프로그램이 일치하지 않는 경우 다음 문제가 발생할 수 있습니다.

OLE 서버는 현재 위치에서 인스턴스화되지 않을 수 있으며 등록 된 응용 프로그램이 설치된 Office 버전과 동일한 버전이 아닌 경우 열리지 않을 수 있습니다. 예를 들어 OLE Server 응용 프로그램이 32 비트이고 설치된 Office 버전이 64 비트 인 경우 이러한 문제가 발생할 수 있습니다.

Office 2013 응용 프로그램 문서에 삽입 된 개체는 버전 간 시나리오에서 실패 할 수 있습니다. 예를 들어 64 비트 Office 2013 응용 프로그램 문서에 32 비트 개체를 삽입하는 경우 이러한 문제가 발생할 수 있습니다.

원격 분석 로그를 통해 64 비트 Office와의 호환성 문제를 식별 할 수 있습니다.

원격 분석 로그는 Office 2013에 기본 제공되는 새로운 Office 원격 분석 모니터링 프레임 워크의 일부입니다. 개발자와 숙련 된 사용자는 일부 Office 2013 응용 프로그램 내에서 발생하는 이벤트를 표시하여 호환성 문제를 진단 할 수 있습니다. 식별 된 문제 중에는 64 비트 버전의 Office에서 작동하지 않는 Visual Basic 6.0 컨트롤이 있습니다.

당신이있는 거 준비 오피스 2013의 호환성을 평가하기 시작하면, 우리는 당신이 시작하는 것이 좋습니다 사무실을 평가 2013 호환성 . Office 2013을 실행하는 컴퓨터에서 추가 기능 및 솔루션 문제를 해결하려면 Telemetry Log를 사용하십시오 .

Sub Test()
    
    Dim oSC As Object
    
    Set oSC = CreateObjectx86("ScriptControl"' create ActiveX via x86 mshta host
    Debug.Print TypeName(oSC) ' ScriptControl
    ' do some stuff
    
    CreateObjectx86 Empty ' close mshta host window at the end
    
End Sub
 
Function CreateObjectx86(sProgID)
   
    Static oWnd As Object
    Dim bRunning As Boolean
    
    #If Win64 Then
        bRunning = InStr(TypeName(oWnd), "HTMLWindow"> 0
        If IsEmpty(sProgID) Then
            If bRunning Then oWnd.Close
            Exit Function
        End If
        If Not bRunning Then
            Set oWnd = CreateWindow()
            oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function""VBScript"
        End If
        Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
    #Else
        If Not IsEmpty(sProgID) Then Set CreateObjectx86 = CreateObject(sProgID)
    #End If
    
End Function
 
Function CreateWindow()
 
    Dim sSignature, oShellWnd, oProc
    
    On Error Resume Next
    Do Until Len(sSignature) = 32
        sSignature = sSignature & Hex(Int(Rnd * 16))
    Loop
    CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>"""0False
    Do
        For Each oShellWnd In CreateObject("Shell.Application").Windows
            Set CreateWindow = oShellWnd.GetProperty(sSignature)
            If Err.Number = 0 Then Exit Function
            Err.Clear
        Next
    Loop
    
End Function

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색