Visual Basic で Office アプリケーションのダイアログ ボックスの表示を回避する方法

文書翻訳 文書翻訳
文書番号: 259971 - 対象製品
すべて展開する | すべて折りたたむ

概要

Visual Basic (VB) を使用して Office アプリケーションを自動化している場合に、Office アプリケーションでダイアログ ボックスが表示されることがあります。ダイアログ ボックスが表示されると、ダイアログ ボックスが閉じられるまで VB アプリケーションの実行が保留になるため、VB アプリケーションが応答を停止 (ハング) したようになります。Visual Basic アプリケーションの実行を継続させるには、ダイアログ ボックスを閉じる必要があります。

この資料では、Office アプリケーションのオブジェクト モデルを使用して、オートメーションの実行中にダイアログ ボックスが表示されないようにする方法を説明します。また、オブジェクト モデルで公開されている通常のプロパティやメソッドを使用しても表示を抑制できないダイアログ ボックスについては、プログラムでユーザー入力をシミュレートしてダイアログ ボックスを閉じる方法の例を手順を追って説明します。

詳細

Office アプリケーションを自動化して、Office アプリケーションでのユーザー入力を不要にする場合があります。このような場合に Office アプリケーションでダイアログ ボックスが表示されると、ユーザーがダイアログ ボックスを閉じるまで、アプリケーションは応答を停止したようになります。しかし、ユーザーがコンピュータの前に座っていて、ダイアログ ボックスを閉じられるとは限りません。

Office アプリケーションは、無人で実行できるようには設計されていません。そのため、Office を自動化するアプリケーションの実行中でも、Office アプリケーションからダイアログ ボックスが表示されることがあります。多くの場合、アプリケーションの通常のテストを行うことで、どのようなダイアログ ボックスが表示されるかがわかります。その結果を使用して、特定のダイアログ ボックスが表示されないようにコードを記述することができます。

Office アプリケーションを自動化するときにダイアログ ボックスを抑制するために推奨される方法を以下に示します。
  • 使用しているプロパティまたはメソッドによってダイアログ ボックスが表示される場合、それらのプロパティやメソッドに渡すことのできる引数が他にないかどうかを調べます。プロパティやメソッドにすべての引数を渡すことにより、ダイアログ ボックスの表示を回避できる場合があります。たとえば、Open メソッドを使用して Excel ブックを開く場合、そのブックがパスワードで保護されていると、Open メソッドの呼び出し時にパスワードの引数を指定しない限り、Excel によりユーザーにパスワードの入力を求めるダイアログ ボックスが表示されます。このダイアログ ボックスが表示されないようにするには、Open メソッドの呼び出し時に Password 引数の値を指定します。同様に、Close メソッドを使用してドキュメントを閉じる場合、通常は SaveChanges 引数を指定することで、変更を保存するかどうかを確認するダイアログ ボックスがユーザーに表示されるのを回避できます。 呼び出しているプロパティまたはメソッドに必要な引数の確認方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
    222101 [HOWTO] Office オブジェクト モデルに関するドキュメントの検索および使用方法
  • Office アプリケーションのオブジェクト モデルに、特定のダイアログ ボックスの表示を抑制するプロパティがないかどうかを調べます。たとえば、Excel の Application オブジェクトには AskToUpdateLinks プロパティと AlertBeforeOverwriting プロパティが用意されています。
  • 警告メッセージの表示を無効にするには、Application.DisplayAlerts プロパティを設定するか (Excel、Project、Word の場合)、Application.DoCmd.SetWarnings False を使用します (Access のみ)。この設定を使用することにより、ほとんどのダイアログ ボックスの表示を回避できます。
  • ユーザーのシステムにインストールされていないコンポーネントにアクセスすると、"この機能はインストールされていません" というダイアログ ボックスが表示されることがあります。これを回避するには、Application.FeatureInstall プロパティを設定します (Office 2000 以降)。
  • プリンタ ドライバがインストールされていないシステムで Application.ActivePrinter を設定すると表示されるエラー メッセージなど、実行時エラーのメッセージが表示されるのを回避するには、On Error ステートメントを使用します。
  • ダイアログ ボックスがいつ表示されるかを予測するため、アプリケーションを全面的にテストします。たとえば、Office アプリケーションの SaveAs メソッドを呼び出してファイルを保存するとします。ファイルが既に存在する場合、既存のファイルの置き換えを確認するダイアログ ボックスが表示されることがあります。 SaveAs メソッドの呼び出し前にファイルの有無を確認するようにコードを変更すると、ダイアログ ボックスの表示を回避できます。たとえば、ファイルが既に存在する場合、Kill ステートメントで既存のファイルを削除してから SaveAs メソッドを呼び出します。
: これらの方法を使用して、ダイアログ ボックスが表示されないように注意深くアプリケーションを設計しても、Office アプリケーションのオブジェクト モデルで公開されているメソッドとプロパティでは、ダイアログ ボックスの表示を回避できないことがあります。そのような場合は、ユーザー入力をシミュレートすることにより、プログラムからダイアログ ボックスを閉じる必要があります。以下のサンプルでは、Visual Basic オートメーション クライアントでこれを実現する方法を説明します。

サンプル

ここで示す手順では、文書を印刷する Microsoft Word のオートメーションの例を紹介します。オートメーション クライアントで、Word の Document オブジェクトの PrintOut メソッドを呼び出します。ユーザーの通常使うプリンタが、FILE ポートに出力するように構成されている場合、PrintOut の呼び出しによって、ファイル名の入力を求めるダイアログ ボックスがユーザーに表示されます。このダイアログ ボックスが PrintOut メソッドによって表示されるかどうかを判断するため、Visual Basic のオートメーション クライアントでは Timer コントロールを使用して、PrintOut メソッドを呼び出した後のアイドル時間を検出します。PrintOut を呼び出す前に、Timer を有効にし、5 秒でイベントが発生するように設定します。PrintOut の完了時には Timer を無効にします。したがって、PrintOut メソッドが 5 秒以内に完了すれば、Timer イベントが発生することはなく、それ以上の対応もありません。文書が印刷され、PrintOut メソッド以降のコードの実行が継続されます。しかし、5 秒が経過して Timer イベントが発生した場合は、PrintOut メソッドは完了しておらず、ダイアログ ボックスがユーザーの入力を待機しているために遅延が発生していると見なします。Timer イベントが発生すると、オートメーション クライアントは Word にフォーカスを移動し、SendKeys を使用してダイアログ ボックスを閉じます。

: このサンプルでは、わかりやすくするために、FILE ポートに設定されているプリンタへの出力時に、ダイアログ ボックスが表示されるような方法で PrintOut メソッドを使用しています。PrintOut メソッドには OutputfileName と PrintToFile の 2 つの引数があり、これらを指定することでダイアログ ボックスの表示を抑制できます。

また、"タイマー" 方式を使用する場合、待ち時間を 5 秒より長くまたは短く設定することや、ダイアログ ボックスに送信するキー入力を変更することもできます。

このサンプルは、次の 2 つの Visual Basic プロジェクトで構成されています。
  1. 遅延の検出に使用される Timer クラスを提供する ActiveX EXE プロジェクト。Timer クラスに ActiveX EXE を使用する理由は、Timer のコードを別のプロセス、つまり別のスレッドで実行するためです。こうすることにより、オートメーション呼び出しが中断している間でも、Timer クラスによってイベントを発生させることが可能になります。
  2. Word に対するオートメーションを使用し、PrintOut メソッドを呼び出して文書を印刷する標準 EXE プロジェクト。このプログラムでは、ActiveX EXE を使用して、PrintOut メソッド呼び出し時の遅延を検出します。
ActiveX EXE プロジェクトの作成
  1. Visual Basic を起動し、ActiveX EXE プロジェクトを作成します。デフォルトでは、Class1 が作成されます。
  2. [プロジェクト] メニューの [Project1 のプロパティ] をクリックし、プロジェクト名を 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 (または Office のバージョンに応じて 9.0、10.0、11.0 のいずれか) Object Library、および MyTimer への参照を追加します。
  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. コントロール パネルで通常使うプリンタを変更し、FILE ポートに出力されるように構成します。
  9. [Command1] を再度クリックすると、Word でダイアログ ボックスが表示されます。このダイアログ ボックスを閉じないようにします。5 秒待つと、Timer イベントが発生し、プログラムによりダイアログ ボックスが閉じられます。MyOutput.prn という名前の出力ファイルが Client サブフォルダに作成されます。
マイクロソフトは、この情報をプログラミング言語の使用方法の一例として提供するだけであり、市場性および特定目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。プログラミングに習熟されていない場合、マイクロソフト認定パートナー、あるいはマイクロソフトの有償サポート窓口までお問い合わせください。マイクロソフト認定パートナー、有償サポート窓口については、次のマイクロソフト Web サイトを参照してください。
https://solutionfinder.microsoft.com/
http://support.microsoft.com/default.aspx?scid=/isapi/gomscom.asp?target=/japan/support/supportnet/is.asp
利用可能なサポート オプションおよびマイクロソフトの問い合わせ先の詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/contactus/

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
257757 [OFF2003] [INFO] Office のサーバーサイド オートメーションについて
226118 Visual Basic for Applications のプログラミングの学習に役立つリソースの一覧
253235 Office 97 および Office 2000 のオートメーションに関する説明およびサンプル コードを含む Offautmn.exe
Office オートメーションの詳細については、次のマイクロソフト Web サイトで Office 開発サポート センターを参照してください。
http://www.microsoft.com/japan/msdn/office/

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 259971 (最終更新日 2005-06-23) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 259971 - 最終更新日: 2007年8月13日 - リビジョン: 8.4
この資料は以下の製品について記述したものです。
  • 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
  • Microsoft Word 2000
  • 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

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