[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/08/10(Wed) 13:47
投稿者名:YK
Eメール:
URL :
タイトル:
エクセルのメッセージをフックしたい
こんにちは。

下記のようなコードでエクセルを起動しています。
API宣言は省きます。
SetWindowPos で Form を最前面表示をさせています。

それで、エクスプローラー等で同じファイルをクリックして
開こうとするとエクセルのメッセージが出ます。
"xxxx.xls は既に開いています。・・・・・・・" 等
(普通はしないと思いますがヤル人がいるのです。)

ところが Form のサイズが大きい為、このメッセージボックスが
フォームの後ろに隠れてしまいます。
このメッセージボックスを最前面表示させるか、
フォームをミニマムにしたいのですがどのようにしたら良いのでしょうか。

Dim xlsApp   As Excel.Application
Dim wbDt     As Excel.Workbook

Private Sub Command1_Click()
    Dim strFname    As String
    Dim lngRtnCd    As Long
    
    lngRtnCd = SetWindowPos(Me.hWnd, _
                            HWND_NOTOPMOST, _
                            0, _
                            0, _
                            0, _
                            0, _
                            SWP_NOSIZE Or SWP_NOMOVE)
                            
    Set xlsApp = New Excel.Application
    xlsApp.Visible = True
    
    strFname = xlsApp.GetOpenFilename("Excel File (*.xls), *.xls")
    If strFname = "False" Then
        xlsApp.Quit
        Set xlsApp = Nothing
        Exit Sub
    End If
    
    Set wbDt = xlsApp.Workbooks.Open(strFname)
    wbDt.Worksheets(1).[A1].Value = " "
    ' 最前面表示
    lngRtnCd = SetWindowPos(Me.hWnd, _
                            HWND_TOPMOST, _
                            0, _
                            0, _
                            0, _
                            0, _
                            SWP_NOSIZE Or SWP_NOMOVE)
End Sub

投稿時間:2005/08/10(Wed) 18:52
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: エクセルのメッセージをフックしたい
第二引数・第七引数を変えて試してみるとか(逆引きヘルプ参照) HWND_NOTOPMOST

投稿時間:2005/08/11(Thu) 09:11
投稿者名:YK
Eメール:
URL :
タイトル:
Re^2: エクセルのメッセージをフックしたい
こんにちは。
レス有り難う御座います。
第2、7引数、を色々変えてみたのですが
思うようにいきません。

詳しく書きますと、エクセルのシート上にフォームを表示して
フォームの入力データをエクセルに送っています。
又、エクセルの情報をフォームに与えていますので
両方の画面が表示された状態で作業をしています。
フォームを最前面表示にしないと画面の切替を手動でしなければ
ならなく、又、あっちへ行ったり、こっちへ来たりであまり宜しく
ありません。
その為にフォームを最前面表示にしています。

最初にSetWindowPosは2回目以降
エクセルのGetOpenFilenameを開ける為に
HWND_TOPMOSTを解除しています。
それで開いたあとでHWND_TOPMOSTに設定しています。

>それで、エクスプローラー等で同じファイルをクリックして
>開こうとするとエクセルのメッセージが出ます。
>"xxxx.xls は既に開いています。・・・・・・・" 等
>(普通はしないと思いますがヤル人がいるのです。)
>
>ところが Form のサイズが大きい為、このメッセージボックスが
>フォームの後ろに隠れてしまいます。
>このメッセージボックスを最前面表示させるか、
>フォームをミニマムにしたいのですがどのようにしたら良いのでしょうか。

という質問になりました。
エクセルのメッセージが出た時に捕まえられればなんとかなりそうですが、
手法がわかりません。
宜しくお願いします。

投稿時間:2005/08/12(Fri) 05:13
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: エクセルのメッセージをフックしたい
> 詳しく書きますと、エクセルのシート上にフォームを表示して
> フォームの入力データをエクセルに送っています。
> 又、エクセルの情報をフォームに与えていますので
> 両方の画面が表示された状態で作業をしています。
> フォームを最前面表示にしないと画面の切替を手動でしなければ
> ならなく、又、あっちへ行ったり、こっちへ来たりであまり宜しく
> ありません。
> その為にフォームを最前面表示にしています。

 ExcelとVBのフォームを切り替えて使うという設計がよくないのでは?

> エクセルのメッセージが出た時に捕まえられればなんとかなりそうですが、
> 手法がわかりません。

 VBでは、できないと思いますので、タイマーでEXCELのメッセージボックス
(ダイアログボックスでチェックしているので他のウィンドウも引っかかるかも
しれませんが)が表示されたら、最小化します。WindowsのAPIの定義は、
APIビューアから拾ってきてください。

Private Sub Timer1_Timer()
Dim lngReturnValue As Long
Dim lngHwnd As Long
Dim lngHwndOwner As Long
Dim strClassName As String
        
    lngHwnd = FindWindowEx(GetDesktopWindow, lngHwnd, "#32770", vbNullString)
    Do While lngHwnd <> 0
        lngHwndOwner = GetWindow(lngHwnd, GW_OWNER)
        strClassName = Space(256)
        lngReturnValue = GetClassName(lngHwndOwner, strClassName, Len(strClassName))
        strClassName = Left(strClassName, InStr(strClassName, Chr(0)) - 1)
        If strClassName = "XLMAIN" Then
            Me.WindowState = vbMinimized
            Timer1.Enabled = False
        End If
        lngHwnd = FindWindowEx(GetDesktopWindow, lngHwnd, "#32770", vbNullString)
    Loop

End Sub

投稿時間:2005/08/17(Wed) 07:44
投稿者名:YK
Eメール:
URL :
タイトル:
Re^4: エクセルのメッセージをフックしたい
こんにちは。
亀レスですみません。


>  VBでは、できないと思いますので

そうですね。グローバルフックになるみたいですね。
Starfishさんのを参考に考えます。
有り難う御座いました。