[[20100630123941]] 『ユーザーフォームが最前面にならない』(kyuu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームが最前面にならない』(kyuu)
 エクスプローラからtest2.vbsをダブルクリックしExcelを起動するようにしていますが、
 ExcelのOpenイベントでShowしたユーザーフォームがエクスプローラの背面に表示されます。
 最前面にする方法はありませんか。(Excelは非表示)
 Excel2000では最前面になりますが2007/Vistaでは最前面になりません。

 [test2.vbs]
Dim exApp
Set exApp = CreateObject("Excel.Application")
exApp.Workbooks.Open "D:\Users\xxx\My Documents\test2.xls"
CreateObject("WScript.Shell").AppActivate exApp.Caption
Set exApp = Nothing

 [test2.xls]
'ThisWorkbookモジュール
Private Sub Workbook_Open()
  UserForm1.Show
  Application.Visible = True
End Sub
 [Excel2007 / Windows Vista]


 2007がないから、全く確認できず。これ以上は解りません。

 Application.Visible = True
 AppActivate Application.Caption
 UserForm1.Show

 かなぁ???

 あ、先ほどのexApp.Captionは、ブックを開く前にしておいた方がいいかも。
 BJ


 .Visible = True にすれば、
 先の『Excelが最前面にならない』で解決しているのですが、
 エクセルを一切表示させず、ユーザーフォームを先に表示したいのです。
 引き続きよろしくお願いいたします。
 (kyuu)


 Visible を falseにしたらどうでしょうか?
 2003だとこれでいけるみたいですけど。
 BJ

 Dim exApp
 Set exApp = CreateObject("Excel.Application")
 exApp.Visible = false
 CreateObject("WScript.Shell").AppActivate exApp.Caption
 exApp.Workbooks.Open "D:\Users\xxx\My Documents\test2.xls"
 Set exApp = Nothing

 BJさん ありがとうございます。
 示されたコードですがExcel2007/Vistaでは前面になりません。

 始めに示したコードでExcel2000〜2003/XP までは前面になります。
 どうやらExcel2007 or Vista 或いはExcel2007 and Vistaの環境で背面になるようです。
 (kyuu)


 Excel2007 も Vista もないので、これ以上解りません。(試せない。)
 BJ


 Windows7、Excel2007 で最後のコードを試してみました。

 Form が表示されますが、アクティブになっていないみたいです。

 exApp.Visible = true にするとアクティブになります。

 (kazu)

 >exApp.Visible = true にするとアクティブになります。
 すみません。質問はVisibleはtrueにしないでユーザーフォームを前面にする事です。(Excelは非表示)
 (kyuu)

 (1) なぜ、VBS でExcel を起動なのでしょうか?
 (2) なぜ、Excel を非表示で起動なのでしょうか?

 (kazu)


 モードレスにしてみるとか(未確認)

 Private Sub Workbook_Open()
 UserForm1.Show 0
 End Sub

 フォームモジュール
 Private Sub UserForm_Activate()
 Application.OnTime Now(), "pepe"
 End Sub

 標準モジュール
 Sub pepe()
 UserForm1.Show 0
 End Sub

 たぶん。
 1、マクロ有効無効のアラートを出ないようにしたい。
 2、アプリケーションみたいで、格好が良い。
   使う人にエクセルを触らせたくないなどなど。

 これで本当にお手上げ。
 BJ

 私も Excel2007 Vistaの環境がないので試せませんが、以下のコードを試してみてください。

 vbs側

 Dim exApp
 dim exbk
 Set exApp = CreateObject("Excel.Application")
 set exbk=exApp.Workbooks.Open(replace(wscript.scriptfullname,wscript.scriptname,"") & "\book1.xls")
 exApp.run exbk.name & "!auto_open"
 exbk.close false
 exapp.quit
 set exbk=nothing
 Set exApp = Nothing

 book1.xls側
 ただし、vbsファイルとbook1.xlsは、同じフォルダ上に存在するとします。

 方法1
 thisworkbookのモジュールのWoworkbook_Openは、やめて(削除して)、
 標準モジュールに

 Sub auto_open()
    UserForm1.Show
    Application.Visible = True
 End Sub

 Userform1のモジュールに

 '===========================================================================
 Option Explicit
 Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
 Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
 Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
 Private Declare Function GetForegroundWindow Lib "user32" () As Long
 Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
 '===================================================================================
 Public Sub form_activate()
    Dim lngRet              As Long
    Dim hWndActive          As Long
    Dim hThreadActive       As Long
    Dim CThreadActive       As Long
    Dim hwnd As Long
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    hWndActive = GetForegroundWindow()
    hThreadActive = GetWindowThreadProcessId(hWndActive, ByVal 0&)
    CThreadActive = GetCurrentThreadId
    Call AttachThreadInput(CThreadActive, hThreadActive, 1&)
    Call SetForegroundWindow(hwnd)
    Call AttachThreadInput(CThreadActive, hThreadActive, 0&)
 End Sub
 '=====================================================================
 Private Sub UserForm_Activate()
    call form_activate
 End Sub

 方法2
 thisworkbookのモジュールのWoworkbook_Openは、やめて(削除して)、
 標準モジュールに

 '========================================================================
 Option Explicit
 Sub auto_open()
    UserForm1.Show
    Application.Visible = True
 End Sub
 '========================================================================
 Sub call_from_out()
    UserForm1.form_activate
 End Sub

 Userform1のモジュールに

 '==============================================================================
 Option Explicit
 Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
 Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
 Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
 Private Declare Function GetForegroundWindow Lib "user32" () As Long
 Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
 Public Sub form_activate()
    Dim lngRet              As Long
    Dim hWndActive          As Long
    Dim hThreadActive       As Long
    Dim CThreadActive       As Long
    Dim hwnd As Long
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    hWndActive = GetForegroundWindow()
    hThreadActive = GetWindowThreadProcessId(hWndActive, ByVal 0&)
    CThreadActive = GetCurrentThreadId
    Call AttachThreadInput(CThreadActive, hThreadActive, 1&)
    Call SetForegroundWindow(hwnd)
    Call AttachThreadInput(CThreadActive, hThreadActive, 0&)
 End Sub
 '=============================================================================
 Private Sub UserForm_Activate()
    Application.OnTime Now(), "call_from_out"
 End Sub

 どっちかで作動すればよいのですが・・・・。
 試せないので一度、試行してみてください。

 ichinose


 kazuさん、BJさん、ichinoseさん ありがとうございます。

 >(1) なぜ、VBS でExcel を起動なのでしょうか?
 >(2) なぜ、Excel を非表示で起動なのでしょうか?

 まったくBJさんの示された通りです。ちょっと独立したアプリなので...
 ↓
 >たぶん。
 >1、マクロ有効無効のアラートを出ないようにしたい。
 >2、アプリケーションみたいで、格好が良い。
 >  使う人にエクセルを触らせたくないなどなど。

 >モードレスにしてみるとか(未確認)

 モードレスにしてもユーザーフォームは前面になりませんでした。

 >どっちかで作動すればよいのですが・・・・。
 > 試せないので一度、試行してみてください。

 ichinoseさんの2つの方法を試してみましたがユーザーフォームは前面になりませんでした。
 (kyuu)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.