[[20110304135719]] 『vbsでユーザーフォームのみを表示させたとき最前磨x(zawa) ページの最後に飛ぶ

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

 

『vbsでユーザーフォームのみを表示させたとき最前面にならない』(zawa)
 vbsでExcelを非表示で起動し、ユーザーフォームのみを表示させたいのですが
 他のwindowが開いていた場合に最前面になりません。
 どのように対処したらいいのでしょうか?
'vbs
With CreateObject("Excel.Application")
  .Workbooks.Open "D:\Users\xxx\デスクトップ\Book1.xls"
End With

 'Book1.xlsのThisWorkbookモジュール
Private Sub Workbook_Open()
  UserForm1.Show
End Sub

 Excel2007、Windows Vista


 ここで書いた事をやってないし。
[[20110302150502]]『vbsでExcelを起動すると最前面にならない』(zawa)

 VBS側で制御するような事ではないから、エクセル側の問題ですね。
 あ、2007だとうまくいかないようなことも聞いたことがあるような?
 (Jaka)


 >ここで書いた事をやってないし。
 前スレはExcel表示なので上手くいきました。
 今回は試してみて、Excel2007&Windows Vistaや Excel2010、Windows 7 の環境ではうまくいかないので質問しました。

 Excelを非表示で起動し、ユーザーフォームのみを表示させたいのですが
 他のwindowが開いていた場合に最前面になりません。
(zawa)

 環境がないので私のほうで確認はできませんが・・・。

 Userform1のモジュールに

 Option Explicit
 Private Declare Function FindWindow Lib "USER32" _
       Alias "FindWindowA" (ByVal lpClassName As String _
                    , ByVal lpWindowName As String) As Long
 Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal st As Long, _
        ByVal x As Long, ByVal y As Long, ByVal w As Long, ByVal h As Long, ByVal uFlags As Long) As Long
 Private Sub UserForm_Activate()
      Call SetWindowPos(FindWindow("ThunderDFrame", Me.Caption), -1, 0, 0, 0, 0, 3)
       DoEvents
      Call SetWindowPos(FindWindow("ThunderDFrame", Me.Caption), -2, 0, 0, 0, 0, 3)
      DoEvents
      Call SetWindowPos(FindWindow("ThunderDFrame", Me.Caption), 0, 0, 0, 0, 0, 3)

 End Sub

 このようなAPIを追加でどうですか?

 ichinose


 2003だとこんな感じなんですが、2007だとダメかも。
 (Jaka)

 VBS

 Dim ExlApp,pasF

 pasF = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\表示.xls"

 On Error Resume Next
 Set ExlApp = GetObject(, "Excel.Application" ) 
 If ExlApp Is Nothing Then
   Set ExlApp = CreateObject("Excel.Application")
 End IF
 On Error Goto 0

 ExlApp.Workbooks.Open pasF

 CreateObject("WScript.Shell").AppActivate ExlApp.Caption
 ExlApp.WindowState = -4143

 On Error Resume Next
 ExlApp.Run ("'" & pasF & "'!Auto_Open")
 On Error Goto 0

 Set ExlApp = Nothing

 標準モジュール

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

 フォーム(なくても良いですが、次回エクセル起動の事を考えて入れてあります。)

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 Application.Visible = True
 Windows(ThisWorkbook.Name).Visible = True
 End Sub

 >このようなAPIを追加でどうですか?
 ichinoseさん 有難うございます。
 前面に表示はされましたが、アクティブにはなりません。
 一回ユーザーフォームをクリックするとアクティブになりキー操作が出来ます。

 >2003だとこんな感じなんですが、2007だとダメかも。
 Jakaさん 有難うございます。
 2007だと前面になりません。
 2003だと何もしなくても前面になります。

 前面でアクティブになる方法はないでしょうか?出来るならAPIを使わないほうがいいです。
 (zawa)

 VBS側

 dim bk1,app
 set app=createobject("excel.application")
 app.WindowState = -4140
 app.visible=true
 set bk1=app.workbooks.open("D:\Users\xxx\デスクトップ\Book1.xls")
 bk1.close false
 app.quit

 BOOK1.XLS側

 Thisworkbook

 Private Sub Workbook_Open()
    UserForm1.Show
 End Sub

 UserForm1

 Private Sub UserForm_Activate()
   AppActivate Me.Caption
   Application.Visible = False
   Application.WindowState = xlMaximized
 End Sub

 繰り返しますが、環境がないので確認はしていません。

 ichinose

コメント返信:

[ 一覧(最新更新順) ]


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