[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームが最前面にならない』(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.