세 가지 주요 Office 응용 프로그램 (Excel, PowerPoint, Word)에서 작동하는 단일 VBA 코드 모듈을 작성하고 싶습니다.여러 Office 응용 프로그램에서 작동하는 VBA 코드를 작성하는 방법
개체 모델이 각 응용 프로그램마다 다르기 때문에 Excel VBE에서 PowerPoint 용으로 작성된 코드를 작성하면 프로젝트가 컴파일되지 않습니다. 처음에는 조건부 컴파일러 상수를 사용하는 것으로 나타납니다. VBE가 VBE가 현재 호스팅되고있는 MSO 응용 프로그램에 따라 VBE에서 오류가 발생합니다.
아래의 단순화 된 예제에서 어떤 그림을 시트, 슬라이드 또는 문서에 추가할지 여부에 따라 app에서 VBA 코드를 실행하고 있습니다. Excel에서 컴파일하려고하면 PowerPoint 코드가 컴파일되지 않습니다 (조건부 컴파일러 If ... Then 문안에 있더라도!). 그 반대의 경우도 마찬가지입니다. 다른 MSO 버전에 배포 할 때 호환성 문제를 일으키는 다른 MSO 앱에 대한 참조를 추가하지 않으면 어떻게됩니까?
컴파일러가 조건 컴파일러 상수에 의해 효과적으로 "주석 처리"되어야하는 코드를 계속 보는 방식은 매우 이상합니다/성가신 행동입니다! 나는 내 자신의 질문에 대답 할 수 없어요 때문에
' Set the compiler constant depending on which MSO app is hosting the VBE
' before saving as the respective .ppam/.xlam/.dotm add-in
#Const APP = "EXL"
Option Explicit
Dim curSlide As Integer
Dim curSheet As Integer
Public Sub InsertPicture()
Dim oShp as Shape
#If APP = "PPT" Then
' Do PowerPoint stuff
' The next 2 lines will throw "Invalid qualifier" and
' "Variable not defined" errors respectively when compiling in Excel.
curSlide = ActiveWindow.View.Slide.SlideIndex
Set oShp = ActivePresentation.Slides(curSlide).Shapes.AddPicture & _
(filename, msoFalse, msoTrue, 0, 0)
#ElseIf APP = "EXL" Then
' Do Excel stuff
curSheet = ActiveWindow.ActiveSheet
Set oShp = ActiveSheet.AddPicture(filename, msoFalse, msoTrue, 0, 0)
#ElseIf APP = "WRD" Then
' Do Word stuff
#End If
End Sub
은 : 당신의 생각 KazJaw에 확장
를,이 같은 인스턴스가 이미 있기 때문에 존재하기 때문에 (GetObject를 사용하여 CreateObject 함수를 대체 작동 할 수 생각 절차는 추가) 내에서 호출되는 :
' CONDITIONAL COMPILER CONSTANTS
' Set this value before saving to .ppam, .xlam or .dotm
#Const APP = "EXL" ' Allowed Values : PPT, EXL or WRD
Sub One_Sub_For_Word_Excel_PP(filename As String, Optional SlideIndex as Integer)
#If APP = "PPT" Then
Dim appPPP As Object
Set appPPT = GetObject(, "PowerPoint.Application")
appPPT.ActivePresentation.Slides(SlideIndex).Shapes.AddPicture & _
(filename,msoFalse,msoTrue,0,0)
#ElseIf APP = "EXL" Then
Dim appEXL As Object
Set appEXL = GetObject(, "Excel.Application")
appEXL.ActiveSheet.AddPicture(filename, msoFalse, msoTrue, 0, 0)
#ElseIf APP = "WRD" Then
Dim appWRD As Object
Set appWRD = GetObject(, "Word.Application")
appWRD.ActiveDocument.AddPicture(filename, msoFalse, msoTrue, 0, 0)
#End If
End Sub
솔직히 말해서 내가 준비하려고하는 솔루션을 사용하고자하는 상황을 상상할 수는 없습니다. 하나의 옵션이 있지만 매우 비효율적입니다. 그런 솔루션에 관심이 있습니까? –
상황은 MSO의 많은 기능이 모든 앱에서 공통적 인 방식을 반영합니다. 필자가 쓰고있는 글은 똑같은 사건에 속한다. 3 가지 주요 MSO 애플리케이션에서 동일한 기능을 사용할 수 있기를 바란다. 그렇다. 솔루션에 관심이 있지만 "매우 비효율적 인"것을 말하면 무엇을 의미 하는가? 프로그래머 또는 사용자 또는 컴퓨터의 경우? –
두 가지 추가 옵션 : [COM 추가 기능] (http://msdn.microsoft.com/en-us/library/office/aa141383(v=office.10) .aspx) 또는 "Auto_Open" 이벤트에서 프로그래밍 방식으로 세 라이브러리의 각각에 대한 참조가 활성화되어 컴파일되도록해야합니다. (PPT 또는 XLS에서 실행되는 응용 프로그램을 사용하여 후자를 수행했습니다) –