[[20201008154606]] 『自ブックを最前面にする』(ポン太2号) ページの最後に飛ぶ

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

 

『自ブックを最前面にする』(ポン太2号)

 いつも参考にさせていただいております。
 最前面表示について質問させて下さい。

 指定した時刻にマクロを実行するファイルで、
 自動実行時にそのエクセルファイルとメッセージを前面に表示させたいと思っています。
 メッセージは最前面表示になるのですが、
 エクセルファイルが思うように表示されません(※)。

 ご教示宜しくお願いします。

 '============================================================
 Option Explicit

 Dim YYMMDD_HHMMSS As Date
 Dim Message_SW As Integer

 '自動消去メッセージ
 #If VBA7 And Win64 Then
     Private Declare PtrSafe Function MessageBoxTimeoutA Lib "user32" ( _
         ByVal hwnd As Long, _
         ByVal lpText As String, _
         ByVal lpCaption As String, _
         ByVal uType As VbMsgBoxStyle, _
         ByVal wLanguageID As Long, _
         ByVal dwMilliseconds As Long) As Long
 #Else
     Private Declare Function MessageBoxTimeoutA Lib "user32" ( _
         ByVal hwnd As Long, _
         ByVal lpText As String, _
         ByVal lpCaption As String, _
         ByVal uType As VbMsgBoxStyle, _
         ByVal wLanguageID As Long, _
         ByVal dwMilliseconds As Long) As Long
 #End If

 '最前面表示
 [[20100129171023]]
 #If Win64 Then
     Public Declare PtrSafe Function SetWindowPos Lib "user32" _
         (ByVal hwnd As LongPtr, _
          ByVal hWndInsertAfter As LongPtr, _
          ByVal X As Long, ByVal Y As Long, _
          ByVal cx As Long, ByVal cy As Long, _
          ByVal wFlags As Long) As Long
 #Else
     Public Declare Function SetWindowPos Lib "user32" _
         (ByVal hwnd As Long, _
          ByVal hWndInsertAfter As Long, _
          ByVal X As Long, ByVal Y As Long, _
          ByVal cx As Long, ByVal cy As Long, _
          ByVal wFlags As Long) As Long
 #End If

 Public Const walways = -1 '常に手前にセット
 Public Const wreset = -2  '解除
 Public Const wdisp = &H40 '表示する
 Public Const w_SIZE = &H1 'サイズを設定しない
 Public Const w_MOVE = &H2 '位置を設定しない

 '=========================================================================
 Sub AlarmMessage()

 Dim ALARM_JIKANN As String
 Dim ALARM_FUN As String
 Dim ALARM_BYO As String   

     ALARM_FUN = ThisWorkbook.Sheets("ああ").Range("アラーム分") & "分"
     ALARM_BYO = ThisWorkbook.Sheets("ああ").Range("アラーム秒") & "秒"

     ALARM_JIKANN = "ファイルを閉じて下さい"
     If ALARM_FUN = "0分" Then
         ALARM_JIKANN = "ファイルを閉じて下さい"
     End If
     If ALARM_BYO = "0秒" Then
         ALARM_JIKANN = "ファイルを閉じて下さい"
     End If        

         '■■■ThisWorkbook以外を作業している場合の対処■■■
         Dim hwnd As Long
         hwnd = Application.hwnd

      '自ブック(予約表.xlsm)を最前面表示にする
      Windows("予約表.xlsm").Activate
      With ThisWorkbook.Sheets("ああ")
          .Parent.Activate
          .Activate
          .Range("B1").Select
      End With

       [[20100129171023]]
       'Excelを常に手前に設定
           Call SetWindowPos(hwnd, walways, 0, 0, 0, 0, wdisp Or w_SIZE Or w_MOVE)

           'Excelを常に手前の設定解除
           Call SetWindowPos(hwnd, wreset, 0, 0, 0, 0, wdisp Or w_SIZE Or w_MOVE)

 '※エクセルを複数開いている場合、最後にアクティブだったファイルが表示される。
 '「AppActivate」はPC環境により、タスクバーが点滅するだけだった。
 '実行前、エクセル以外のアプリケーションがアクティブの可能性もあり。

             '■■■メッセージ表示■■■
             MessageBoxTimeoutA 0&, _
                                 ALARM_JIKANN, _
                                 Application.Name, _
                                 vbInformation, _
                                 0, _
                                 50000

             Message_SW = 1
 End Sub

 '=========================================================================
 Sub Auto_open()

 Dim ALARM_JIKANN As String
 Dim ALARM_FUN As String
 Dim ALARM_BYO As String

     Message_SW = 0

     ALARM_FUN = Right("0" & Sheets("ああ").Range("アラーム分"), 2)
     ALARM_BYO = Right("0" & Sheets("ああ").Range("アラーム秒"), 2)
     ALARM_JIKANN = "00:" & ALARM_FUN & ":" & ALARM_BYO

     '編集で開いている場合のみ実行
     If ThisWorkbook.ReadOnly = False Then

         ThisWorkbook.Sheets("ああ").Range("アラーム時刻") = Now + TimeValue(ALARM_JIKANN)
         YYMMDD_HHMMSS = ThisWorkbook.Sheets("ああ").Range("アラーム時刻")        

             '指定時間になったら実行
             Application.OnTime YYMMDD_HHMMSS, "AlarmMessage"
     End If
 End Sub

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


APIで実現可能かと。
SetForegroundWindow
で検索してみてください。
(tkit) 2020/10/08(木) 16:52

2013よりSDIになったので、ウィンドウハンドルがそれぞれ異なることななりました。、
 hwnd = Application.hwnd は、
thisworkbook.activateの後に行って下さい。

(kazuo) 2020/10/08(木) 16:53


 tkit様
 kazuo様

 ご教示ありがとうございます。

 kazuo様のを実行したところ、ほぼ上手くいきました。
 ありがとうございます。

 tkit様のSetForegroundWindowも、これから勉強して試してみます。
 また質問することがあるかもしれませんが、
 その際は宜しくお願いします。

(ポン太2号) 2020/10/09(金) 16:43


コメント返信:

[ 一覧(最新更新順) ]


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