Visual Basic을 사용하여 Office 응용 프로그램이 표시하는 대화 상자를 해제하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 259971 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

VB(Visual Basic)에서 Office 응용 프로그램을 자동화할 때 Office 응용 프로그램 대화 상자가 표시될 수 있습니다. 이 경우 대화 상자가 해제될 때까지 Visual Basic 응용 프로그램이 대기하기 때문에 Visual Basic 응용 프로그램의 응답이 멈춘 것처럼 보일 수 있습니다. Visual Basic 응용 프로그램을 계속하려면 이러한 대화 상자를 해제해야 합니다.

본 문서에서는 자동화를 수행하는 동안 Office 응용 프로그램 대화 상자를 나타나지 않게 할 수 있는 개체 모델을 사용하는 방법을 설명합니다. 또한 개체 모델에서 제공되는 일반 속성과 메서드를 사용해도 나타나는 대화 상자를 프로그래밍 방식으로 해제하도록 사용자 입력을 시뮬레이션하는 방법을 단계별로 설명합니다.

추가 정보

Office 응용 프로그램을 자동화하면서 Office 응용 프로그램과의 사용자 상호 작용을 원치 않을 수도 있습니다. 이 경우 Office 응용 프로그램 대화 상자가 표시되면 사용자가 대화 상자를 해제할 때까지 해당 응용 프로그램의 응답이 중지된 것처럼 보입니다. 그러나 대화 상자를 사용자가 수동으로 해제하는 대신 프로그래밍 방식으로 자동 해제할 수 있습니다.

Office 응용 프로그램은 무인 실행되도록 설계되지 않았습니다. 따라서 Office를 자동화하는 응용 프로그램을 사용하는 동안 때로는 Office 응용 프로그램이 표시하는 대화 상자가 나타납니다. 일반적인 응용 프로그램 테스트를 통해 주로 어떤 대화 상자가 나타나는지 확인하고 이 특정 대화 상자를 나타나지 않게 하는 코드를 작성할 수 있습니다.

다음은 Office 응용 프로그램을 자동화하는 동안 대화 상자를 나타나지 않도록 하는 몇 가지 방법입니다.
  • 사용할 속성이나 메서드(대화 상자를 발생시키는 속성이나 메서드)에 전달 가능한 선택적 인수가 있는지 확인합니다. 모든 인수를 속성이나 메서드에 전달하면 대화 상자가 나타나는 것을 피할 수 있는 경우가 있습니다. 예를 들어, Open 메서드를 사용하여 암호로 보호된 Excel 통합 문서를 열고 Open 메서드를 호출할 때 암호 인수를 제공하지 않으면 암호를 입력하라는 Excel 대화 상자가 표시됩니다. 이 대화 상자를 나타나지 않게 하려면 Open 메서드를 호출할 때 Password 인수의 값을 제공합니다. 마찬가지로 Close 메서드를 사용하여 문서를 닫을 때 SaveChanges 인수를 지정하면 변경 내용을 저장하라는 대화 상자를 피할 수 있습니다. 호출할 속성이나 메서드에 사용할 수 있는 인수의 결정 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    222101 Office 개체 모델 설명서를 찾고 사용하는 방법
  • Office 응용 프로그램의 개체 모델을 검토하여 특정 대화 상자가 나타나지 않도록 하는 속성이 있는지 확인하십시오. 예를 들어, Excel의 Application 개체에는 AskToUpdateLinksAlertBeforeOverwriting 속성이 있습니다.
  • Application.DisplayAlerts 속성(Excel, Project, Word)을 설정하거나 Application.DoCmd.SetWarnings False(Access만 해당)를 사용하여 경고 메시지 표시 기능을 해제합니다. 이 설정을 사용하면 대부분의 대화 상자를 피할 수 있습니다.
  • Application.FeatureInstall 속성(Office 2000 이상)을 설정하면 시스템에 설치되어 있지 않은 구성 요소에 액세스할 때 "이 기능은 현재 설치되어 있지 않습니다." 대화 상자를 처리합니다.
  • On Error 문을 사용하여 발생할 수 있는 런타임 오류 메시지를 피합니다. 예를 들어, 프린터 드라이버가 시스템에 설치되어 있지 않은 경우 Application.ActivePrinter를 설정하려고 할 때 나타나는 오류 메시지를 피할 수 있습니다.
  • 응용 프로그램을 철저하게 테스트하면 대화 상자가 발생할 수 있는 시기를 예측하는 데 도움이 됩니다. 예를 들어, Office 응용 프로그램의 SaveAs 메서드를 호출하여 파일에 저장한다고 가정합니다. 해당 파일이 이미 있으면 기존 파일을 대체할 것인지 확인하는 대화 상자가 나타납니다. 이 경우 SaveAs 메서드를 호출하기 전에 파일이 있는지 확인하도록 코드를 수정하여 이 대화 상자가 표시되는 것을 피할 수 있습니다. 예를 들어, 파일이 이미 있으면 SaveAs 메서드를 호출하기 전에 Kill 문을 사용하여 기존 파일을 삭제하십시오.
참고 대화 상자가 나타나지 않도록 응용 프로그램에 이런 기술을 적용하고 신중히 설계하더라도 Office 응용 프로그램의 개체 모델에서 제공하는 메서드와 속성만으로는 대화 상자가 나타나는 것을 막을 수 없는 경우가 있습니다. 이러한 경우에는 사용자 입력을 시뮬레이션하여 대화 상자를 프로그래밍 방식으로 해제해야 합니다. 다음 예제에서는 Visual Basic 자동화 클라이언트를 사용하여 이를 수행하는 방법을 보여줍니다.

예제

이 절의 단계는 Microsoft Word의 자동화 기능을 사용하여 문서를 인쇄하는 방법을 보여줍니다. 자동화 클라이언트는 Word Document 개체에 대해 PrintOut 메서드를 호출합니다. 기본 프린터가 FILE 포트로 인쇄하도록 구성되어 있는 경우 PrintOut을 호출하면 파일 이름을 입력하라는 대화 상자가 나타납니다. PrintOut 메서드로 인해 이 대화 상자가 나타나는지 확인하기 위해 Visual Basic 자동화 클라이언트는 Timer 컨트롤을 사용하여 PrintOut 메서드를 호출한 후의 유휴 시간을 검색합니다. PrintOut을 호출하기 전에 Timer를 설정하고 5초 내에 실행되도록 설정합니다. PrintOut이 완료되면 Timer가 해제됩니다. 따라서 PrintOut 메서드가 5초 내에 완료되면 Timer 이벤트는 발생하지 않고 추가 조치가 수행되지 않습니다. 문서가 인쇄되고 코드 실행이 PrintOut 메서드를 지나 계속됩니다. 그러나 Timer 이벤트가 5초 간격 내에 발생하는 경우에는 PrintOut 메서드가 완료되지 않았고 사용자 입력이 필요한 대화 상자로 인해 지연된다고 가정합니다. Timer 이벤트가 발생하면 자동화 클라이언트는 Word에 초점을 두고 SendKeys를 사용하여 대화 상자를 해제합니다.

참고 설명을 위하여 이 예제에서는 일부러 PrintOut 메서드를 사용하여 FILE 포트로 설정되어 있는 프린터에 인쇄할 때 대화 상자를 표시하도록 합니다. PrintOut 메서드에는 이 대화 상자를 피할 수 있는 두 개의 인수, 즉 OutputfileNamePrintToFile이 있습니다.

또한 이 "타이머" 방법을 사용하면 5초보다 크거나 작게 대기 시간을 사용자 지정할 수 있을 뿐 아니라 대화 상자에 보내는 키 입력도 사용자 지정할 수 있습니다.

이 예제는 두 개의 Visual Basic 프로젝트로 구성됩니다.
  1. ActiveX EXE는 지연을 검색하는 데 사용되는 Timer 클래스를 제공합니다. Timer 클래스에 대해 ActiveX EXE를 사용하는 이유는 별도의 프로세스 즉, 별도의 스레드에서 Timer 코드를 실행하기 위해서입니다. 이렇게 하면 일시 중지된 자동화 호출 동안 Timer 클래스가 이벤트가 발생시킬 수 있습니다.
  2. 표준 EXE는 Word 자동화에 사용되며 PrintOut 메서드를 호출하여 문서를 인쇄합니다. PrintOut 메서드를 호출할 때 ActiveX EXE를 사용하여 지연을 검색합니다.
ActiveX EXE 프로젝트 만들기
  1. Visual Basic을 시작하고 ActiveX EXE 프로젝트를 만듭니다. 기본적으로 Class1이 만들어집니다.
  2. 프로젝트 메뉴에서 속성을 누른 다음 프로젝트 이름을 MyTimer로 변경합니다.
  3. 다음 코드를 복사하고 Class1 모듈에 붙여 넣습니다.
    Option Explicit
    
    Public Event Timer()
    Private oForm1 As Form1
    
    Private Sub Class_Initialize()
        Set oForm1 = New Form1
        oForm1.Timer1.Enabled = False
    End Sub
    
    Private Sub Class_Terminate()
        Me.Enabled = False
        Unload oForm1
        Set oForm1 = Nothing
    End Sub
    
    Public Property Get Enabled() As Boolean
        Enabled = oForm1.Timer1.Enabled
    End Property
    
    Public Property Let Enabled(ByVal vNewValue As Boolean)
        oForm1.Timer1.Enabled = vNewValue
        If vNewValue = True Then
            Set oForm1.oClass1 = Me
        Else
            Set oForm1.oClass1 = Nothing
        End If
    End Property
    
    Public Property Get Interval() As Integer
        Interval = oForm1.Timer1.Interval
    End Property
    
    Public Property Let Interval(ByVal vNewValue As Integer)
        oForm1.Timer1.Interval = vNewValue
    End Property
    
    Friend Sub TimerEvent()
        RaiseEvent Timer
    End Sub
    					
  4. 프로젝트 메뉴에서 폼 추가를 선택하여 새 폼을 프로젝트에 추가합니다.
  5. 폼에 Timer 컨트롤을 추가합니다.
  6. 다음 코드를 복사하고 Form1의 코드 모듈에 붙여 넣습니다.
    Option Explicit
    
    Public oClass1 As Class1
    
    Private Sub Timer1_Timer()
        oClass1.TimerEvent
    End Sub
    					
  7. 이 프로젝트를 Server라는 새 하위 폴더에 저장합니다.
  8. 파일 메뉴에서 MyTimer.Exe 만들기를 선택하여 구성 요소를 만들고 등록합니다.
자동화 클라이언트 만들기
  1. Visual Basic에서 새로운 표준 EXE 프로젝트를 만듭니다. 기본적으로 Form1이 생성됩니다.
  2. 폼에 CommandButton 컨트롤을 추가합니다.
  3. 프로젝트 메뉴에서 참조를 선택합니다. Microsoft Word 8.0 (or 9.0, or 10.0) Object LibraryMyTimer에 참조를 추가합니다.
  4. 다음 코드를 복사하고 폼 모듈에 붙여 넣습니다.
    Option Explicit
    
    Private oWord As Word.Application
    Private strWordCaption As String
    Private WithEvents oMyTimer As MyTimer.Class1
    
    Private Sub Form_Load()
        'Create MyTimer object, and then disable it by default:
        Set oMyTimer = New MyTimer.Class1
        oMyTimer.Enabled = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        'Terminate MyTimer object when the form is closed:
        oMyTimer.Enabled = False
        Set oMyTimer = Nothing
    End Sub
    
    Private Sub Command1_Click()
        On Error GoTo ErrorHandler
        
        'Create a new Word instance and put text in the new document:
        Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
        oWord.Documents.Add
        oWord.Selection.TypeText "Hello World!"
        
        'Prepare Timer to "watch out" for a delay in calling PrintOut:
        strWordCaption = GetWordCaption 'for use with AppActivate
        oMyTimer.Interval = 5000 'allow 5 second wait time
        oMyTimer.Enabled = True
            
        'Call the PrintOut method, which may prompt the user to select
        'an output file name if the default printer is set to FILE:
        oWord.PrintOut Background:=False
    
    Done:
        On Error Resume Next
        'Turn off Timer:
        oMyTimer.Enabled = False
        
        'Close document and quit the Word instance:
        oWord.ActiveDocument.Close SaveChanges:=False
        oWord.Quit
        Set oWord = Nothing
        Exit Sub
    ErrorHandler:
        Resume Done
    End Sub
    
    Private Sub oMyTimer_Timer()
    'If this event occurs, there was a delay in calling PrintOut.
    'You can assume that the delay is caused by a dialog box prompting
    'for an output file name because the user has the printer
    'configured to print to FILE. SendKeys is used to provide the
    'output file name and dismiss the dialog box.
        Dim strKeys As String
        
        On Error Resume Next
        
        'Make sure that Word has the focus before using SendKeys to it:
    
        AppActivate strWordCaption 'Set focus to Word.
        
        'Send keystrokes to enter the output file name:
        If Right$(App.Path, 1) = "\" Then
            strKeys = App.Path & "MyOutput.prn"
        Else
            strKeys = App.Path & "\MyOutput.prn"
        End If
        Kill strKeys 'make sure file does not already exist
        strKeys = strKeys & "~" '~ represents the OK button to dismiss dialog
        SendKeys strKeys, True
           
        'Disable MyTimer:
        oMyTimer.Enabled = False
    End Sub
    
    Private Function GetWordCaption() As String
    'Returns the Word Caption. For use with the AppActivate statement
        Dim s As String
        On Error Resume Next
        If Left$(oWord.Version, 1) = "8" Then
            'Word 97 logic:
            s = oWord.Caption
        Else
            'Word 2000 or 2002 logic:
            Err.Clear
            s = oWord.ActiveWindow.Caption
            If Err.Number = 0 Then 'no error
                s = s & " - " & oWord.Caption
            Else
                s = oWord.Caption
            End If
        End If
        GetWordCaption = s
    End Function
    					
  5. 이 프로젝트를 Client라는 새 하위 폴더에 저장합니다.
  6. F5 키를 눌러 프로젝트를 실행합니다. Form1이 나타납니다.
  7. 폼에서 Command1을 누릅니다. 그러면 Word가 자동화되고 약간의 텍스트가 포함된 새 문서가 추가된 다음 PrintOut 메서드를 사용하여 프린터로 보내집니다. 인쇄할 프린터가 구성되어 있으면 대화 상자가 표시되지 않습니다.
  8. Windows 제어판에서 기본 프린터를 변경하여 FILE 포트에 인쇄하도록 구성합니다.
  9. Command1을 다시 누르고 Word에서 대화 상자가 나타나는지 확인합니다. 대화 상자를 해제하지 마십시오. Timer 이벤트가 발생할 때 5초간 기다리면 대화 상자가 프로그래밍 방식으로 해제됩니다. MyOutput.prn이라는 출력 파일이 Client 하위 폴더에 만들어집니다.
Microsoft는 모든 보증(상품, 특정 목적에 대한 적합성 및 비침해에 대한 묵시적인 보증을 포함하며 이에 제한되지 않음)을 배제하며 예를 보여주기 위한 목적으로만 이 프로그래밍 예제를 제공합니다. 본 문서의 내용은 프로시저를 작성하고 디버깅하는 데 사용되는 도구 및 여기서 설명하는 프로그래밍 언어에 익숙한 사용자를 대상으로 합니다. Microsoft 기술 지원 전문가는 사용자에게 도움이 되도록 특정 절차에 대한 기능을 설명할 수 있지만 사용자의 특정 목적에 맞도록 예제를 수정하여 추가 기능을 제공하거나 절차를 구성하지는 않습니다. 프로그래밍에 익숙하지 않은 사용자는 MCP(Microsoft Certified Partner)의 도움을 받거나 마이크로소프트 고객기술지원부(02-508-0040)로 문의하십시오. MCP에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/partner/referral/
사용 가능한 지원 옵션 및 Microsoft에 문의하는 방법에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
기술지원 서비스 안내

참조

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
257757 INFO: Office의 서버쪽 자동화에 대한 고려 사항
226118 Visual Basic for Applications 프로그래밍을 배우기 위해 사용할 수 있는 리소스 목록
253235 OFFAUTMN.EXE는 Office 97 및 2000 자동화를 설명하고 예제 코드를 제공한다
Office 자동화에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트에서 Office 개발 지원 센터를 방문하십시오.
http://support.microsoft.com/ofd(영문)




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 259971 - 마지막 검토: 2007년 1월 17일 수요일 - 수정: 6.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
키워드:?
kbautomation kbhowto kbprogramming KB259971

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com