プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になります

今、Userform1からSendKeyを使って簡単な図面を描いています
同じ小さな図面を繰り返し描きたいのですがUserFormのコントロールが思ったように出来ませんので教えてください

ウェブの記事を参考にしながら下記のように作りましたが
最後のShow.Meで前面に出てきません

Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private 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
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&

Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Me.StartUpPosition = 1

   (処理)

Me.Hide
'...Excelを最小化
Application.WindowState = xlMinimized

   (処理)

Me.Show


以上、よろしくお願いいたします

A 回答 (2件)

> WP_NOMOVE が変数が定義されていなというエラーになりました


写し間違えでした。 SWP_NOMOVE です。すみません。

>常に前面ではなく、一度”Me,Hide”してCadの処理が終わったら再び前面に表示したいのですが
Hide しないのでしたら、TOPMOST は関係しますが、Hideするのでしたら、隠れてしまうのだから、その場にはUserFormのZオーダーの位置関係は影響はありません。その部分でのコードを特に変える必要はないと思います。

Private Sub CommandButton1_Click()
  Me.Hide
End Sub

'  ↓
'Excel側から、
Sub ボタン2_Click()
   UserForm1.Show 'ここではMeは使えません。
End Sub

とする場合です。状況によっては変わるかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます
いろいろお手数をお掛けしました

なかなか思ったような動きになりません
難しいですね
また、いろいろ試してみます

お礼日時:2018/04/26 18:46

こんにちは。



私自身、ちょっと変えて試してみました。

「UserFormを前面に出力してから処理後にももう一度前面に出したい」
タイトルのリクエストとは違い、これは、常に最前面に出ています。コード自体は、そのような要求になっている「ような」気がしました。ただし、質問では、GetForegroundWindow が生きていませんから、はっきりしません。

'----'標準モジュール------
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

''Public Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Public Declare Function SetWindowPos Lib "user32.dll" (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

Public Const HWND_TOPMOST As Long = -1
Public Const SWP_NOSIZE As Long = &H1&
Public Const SWP_NOMOVE As Long = &H2&

Sub ボタン1_Click()

'...Excelを最小化
Application.WindowState = xlMinimized
UserForm1.Show 0
End Sub

''-----UserForm モジュール --------

Private Sub UserForm_Activate()
Call settingForeGround
End Sub
Private Sub UserForm_Initialize()
Call settingForeGround
End Sub

Sub settingForeGround()
Dim hWnd As Long
Dim Ret As Long
  hWnd = FindWindow("ThunderDFrame", vbNullString)
  Ret = SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, WP_NOMOVE Or SWP_NOSIZE)
 Me.StartUpPosition = 1
End Sub
    • good
    • 0
この回答へのお礼

いつもお世話になります

早速ご回答ありがとうございます
試してみました
すみません、常に前面ではなく、一度”Me,Hide”してCadの処理が終わったら再び前面に表示したいのですが

また、Sub settingForeGround()で
 WP_NOMOVE が変数が定義されていなというエラーになりました
Optionを外してテストしましたが、定義する場合のタイプは何になるのですか? もしかしたらSWP_NOSIZE もそうかも知れませんね

すみません、ご教授頂いているのに申し訳ございません
よろしくお願いいたします

お礼日時:2018/04/26 16:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A