0

次のコードを使用して、VBA Excel から OneNote アプリケーションを閉じようとしています。

Sub closeOneNote()
                Dim oneNoteApp As Object
                On Error Resume Next
                Set oneNoteApp = GetObject(, "OneNote.Application")
                If Err.Number = 0 Then
                oneNoteApp.Quit
                Else
                Err.Clear
                End If
End Sub

OneNote の代わりに Outlook を試してみると、問題なく動作し、Outlook が閉じます。OneNote は VBA による自動化をサポートするアプリケーションではないためではないかと考えていました。以下のリンクに示されているように、ページの下部にある表には、Ican が参照できるすべての最上位の Office オブジェクトとそれらのクラス名が一覧表示されており、OneNote はその中に含まれていません。

別の Office アプリケーションを自動化するためのオブジェクト変数の作成

アプリケーションを閉じる方法に関するアイデア、提案 (ノートブック自体ではなく、実行中のアプリケーションのみ..)

ありがとう

4

2 に答える 2

0

OneNote アプリケーション インターフェイス (ここに記載) には Quit メソッドがありません。それがうまくいかない理由です。代わりにできることは、OneNote ウィンドウを閉じることですが、これは少し注意が必要です。以下に、いくつかの手順とサンプル コードを示します。

  • OneNote ウィンドウ ハンドルを取得します。アプリケーション オブジェクトには、現在の OneNote ウィンドウに対するメンバーをCurrentWindow持つWindowHandleメンバーがあります。HWND

  • トップ レベル ウィンドウを取得する:このハンドルは通常、OneNote ウィンドウの子ウィンドウであるため、トップ レベル ウィンドウを取得するにはGetAncestorを呼び出す必要があります。GA_ROOT

  • ウィンドウを閉じる:WM_CLOSE最上位のウィンドウに送信して閉じることができます。もちろん、ダイアログ ボックスを表示している場合や、別の方法でビジー状態の場合は、これに応答しない場合があります。

    Option Explicit
    
    Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    
    Private Declare PtrSafe Function GetAncestor Lib "user32.dll" _
    (ByVal hwnd As Long, ByVal gaFlags As Long) As Long
    
    Private Const GA_ROOT As Long = 2
    Private Const WM_CLOSE = &H10
    
    Sub test()
        ' Create Application Object
        Dim app As Object
        Set app = CreateObject("OneNote.Application")
    
        ' Get the window handle
        Dim hwnd As Long
        hwnd = app.Windows.CurrentWindow.WindowHandle
    
        ' Get the top level window
        Dim hwndRoot As Long
        hwndRoot = GetAncestor(hwnd, GA_ROOT)
    
        ' Close it
        PostMessage hwndRoot, WM_CLOSE, 0&, 0&
    End Sub
    

複数の OneNote ウィンドウがある場合、これでは不十分です。その場合、Windowsコレクションを列挙し、その中の各Windowオブジェクトに対してこれを行うことができます。

于 2014-02-22T06:17:23.060 に答える