[[20190909165457]] 『フォームのみ表示で、Excelをタスクバーから消さax(しば) ページの最後に飛ぶ

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

 

『フォームのみ表示で、Excelをタスクバーから消さないようにするには』(しば)

いつもお世話になっています。

Excel起動時にユーザーフォームをAuto_Openで開かせる際、Excel本体をApplication.Visible = Falseで非表示にしているのですが、
このときタスクバーからExcelが消えてしまいます。

フォームのみ表示の状態で、Excelをタスクバーから消さないようにするにはどうすればいいでしょう?

Sub Auto_Open()

Application.Visible = False
form.Show
Application.ShowWindowsInTaskbar = True

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 非表示にしないで、最小化すればいいのでは?

 Application.WindowState = xlMinimized

 ユーザーフォームの挙動については、検証してませんが・・・

(渡辺ひかる) 2019/09/09(月) 17:35


あ、かぶりました。

 Sub Auto_Open()

  Application.WindowState = xlMinimized

  UserForm1.Show

 End Sub

 最小化すると、ユーザーフォームも後ろにいっちゃうので、
 UserFormの最初に、

 Private Sub UserForm_Initialize()
   AppActivate Application.Caption
 End Sub

 とかしておくといいようです。
(´・ω・`) 2019/09/09(月) 17:47

ちょっと強引技なぞ。

通常はExcelがUserFormを表示する際、タスクバー表示を無くしてしまうので、UserFormを表示しきる前に、マクロでタスクバー表示付きで表示させてしまいます。 このとき、モーダルにしておけば、事後にExcelがShowを完了させようとしてもエラーになって、スタイルを変えられなくなります。

 【標準モジュール】
 Sub Auto_Open()
    On Error Resume Next
    UserForm1.Show
    On Error GoTo 0
 End Sub

 【UserForm1】
 Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 Private Declare Function ShowWindow Lib "User32" (ByVal Hwnd As Long, ByVal nCmdShow As Long) As Long
 Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
 Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

 Private Const GWL_EXSTYLE As Long = -20
 Private Const SW_SHOWNORMAL = 1
 Private Const WS_EX_APPWINDOW As Long = &H40000

 Public Sub UserForm_Initialize()
    Dim Hwnd As Long
    Hwnd = FindWindow("ThunderDFrame", UserForm1.Caption)
    SetWindowLong Hwnd, GWL_EXSTYLE, GetWindowLong(Hwnd, GWL_EXSTYLE) Or WS_EX_APPWINDOW
    ShowWindow Hwnd, SW_SHOWNORMAL
    Application.Visible = False
 End Sub

 Private Sub UserForm_Terminate()
    Application.Visible = True
 End Sub
(???) 2019/09/09(月) 18:39

渡辺ひかるさん(´・ω・`) さんありがとうございます。
最小化の方法でいけたのですが、最初のAuto_Openの時だけ実行時エラー5':が起きてしまいます…

???さんの方法も試したのですがこちらもエラーが起きます。私には正直難しいです、すいません。
(しば) 2019/09/10(火) 16:39


調べていてわかったのが、フォーム側のイニシャライズにつけた
AppActivate Application.Caption
が原因でエラーが起きているようです。

(しば) 2019/09/10(火) 17:12


私のコードは、かなり綱渡りな事をしているので、まずは余計なコードは追加せずに動かしてみてください。

それに、Application.CaptionはExcel本体のウィンドウタイトル文字列だし、Excel本体は非表示にしているのだから、アクティブにはできないでしょう。 隠したいのかアクティブにしたいのか、矛盾させないように。
(???) 2019/09/10(火) 17:38


 >最初のAuto_Openの時
 最初だけっていうのはよくわかりませんが、最初というのはどういうことでしょう
 ファイル作成したあとということでしょうか。
 セキュリティの警告関係ではないのかなぁ?

   AppActivate Application.Caption

 の場所は、UserForm_Initialize じゃなくて、Auto_Openの 
 Application.WindowState = xlMinimized
 の直後のほうかいいかもしれません。

 Auto_Open じゃ無くて、Workbook_Openイベントの方だとどうなんでしょうね。

 ???さん 
 >隠したいのかアクティブにしたいのか、矛盾させないように。

 私の回答に対するクレームのようですが、実際に試されてからのお言葉ですか

 以下、AppActivateのヘルプからの抜粋です。

   AppActivate ステートメントは、指定したアプリケーションやウィンドウにフォーカスを
   移します。このとき、フォーカスが移っても指定したウィンドウの状態は変化しません。
   たとえば、最小化されているウィンドウにフォーカスを移しても、そのウィンドウは最小
   化されたままです。

 最小化状態のまま、フォーカスが移ります。
(´・ω・`) 2019/09/10(火) 17:52

´・ω・`さんの方法を検証しました。
が、いずれも、しばさんの検証と同様実行時エラー'5':が起きます。win10 excel2016
最小化で良いのなら(???さんの方法と違い、excel自体は手作業でアクティブに出来てしまいます)。

Private Declare Function ShowWindow Lib "User32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long
Private Const SW_SHOWMINIMIZED As Long = 2 'ウィンドウをアクティブにして、最小化する。

Sub Auto_Open()

  ShowWindow Application.Hwnd, SW_SHOWMINIMIZED
  UserForm1.Show
  Application.WindowState = xlNormal
End Sub

(kazuo) 2019/09/10(火) 21:33


 すみませんでした。

 Excel2010でやってました。
 Excel2013で試したところ、AppActivate で実行時エラーになることを確認しました。

 2013以降でWindow管理がかわった影響なのか、2013以降ではうまくいかないようです。
(´・ω・`) 2019/09/10(火) 22:45

 こういうこと? 2007まで・・・?

 標準モジュール
 Sub auto_open()
    Application.WindowState = xlMinimized
    Application.Visible = False
    UserForm1.Show
 End Sub

 ユーザーフォーム
 Private Sub UserForm_Activate()
    Application.Visible = True
    AppActivate UserForm1.Caption
 End Sub
(BJ) 2019/09/11(水) 00:41

 これも書いておいた方が良かったかな?

 Private Sub UserForm_Terminate()
   Application.WindowState = xlMaximized  '最大化
 End Sub
(BJ) 2019/09/11(水) 00:48

BJさんのやり方でうまくいきました。ありがとうございました。

また質問で申し訳ないのですが、、
最小化された状態でタスクバーボタンを押すとExcel本体が表示されますが、
フォームが開いている間はタスクバーボタンを押してもExcelが表示されないようにする方法はありますでしょうか?
(しば) 2019/09/11(水) 09:05


コメント返信:

[ 一覧(最新更新順) ]


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