★ExcelVBA ~ ユーザーフォームだけの表示にして、他のExcelファイルを開いても最前面に固定する方法
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
ユーザーフォームだけの表示にして最前面に固定する方法
● (01)Sheet1「にActiveXコントロールとして」のコマンドボタンを作成
※間違った、「フォームコントロールとして」のコマンドボタンを作らないでください。
(ほんとはどっちでもいいのですが、とりあえず。)
名前はいじらず。
つまりオブジェクト名は「CommandButton1」のまま。
ボタンのプロパティのCaptionを「CommandButton1」から「フォームを開く」に変更する。
そのボタンのコードは以下。
1 2 3 4 5 6 7 8 9 |
' ' Private Sub CommandButton1_Click() UserForm1.Show End Sub ' ' |
● (02)ユーザーフォームを作成してコマンドボタンを2つ作成。
新規のユーザーフォームを作成して、そこにコマンドボタンを2つ作成します。
1つ目のボタンは
オブジェクト名は「CommandButton1」のままにします。
Captionは「このフォームを閉じる」に変更します。
2つ目のボタンは、
オブジェクト名を「CommandButton2」に変更。
Captionを「Excelファイルを開く」に。
ユーザーフォームのモジュールに以降のコードたちを単純に全部コピペ。
一応念のために、
デザイン画面でそれぞれのコマンドボタンをダブルクリックして、
コードが「ちゃんとボタンと紐付け状態にあるか?」だけ確認します。
ダブルクリックしてそれぞれのコードが見えたら紐付けされてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
' ' Option Explicit #If VBA7 And Win64 Then Private 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 Private Declare PtrSafe Function _ FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr #Else Private Declare Function FindWindow Lib "user32.dll" _ Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) 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 #End If Private Const HWND_TOPMOST As Long = -1 Private Const SWP_NOSIZE As Long = &H1& Private Const SWP_NOMOVE As Long = &H2& Private URL As String Private IE As Object Private OBJ As Object Private Sub CommandButton1_Click() Application.Visible = True Unload Me End Sub Private Sub CommandButton2_Click() Set o_OtherApp = CreateObject("Excel.Application") o_OtherApp.Visible = True o_OtherApp.Workbooks.Open "D:\1\test7890.xlsm" End Sub Private Sub UserForm_Activate() Dim hwnd As LongPtr hwnd = FindWindow(vbNullString, Me.Caption) Call SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) End Sub Private Sub UserForm_Initialize() Application.Visible = False End Sub ' ' |
● (03)「Private Sub CommandButton2_Click()」の内容変更。
o_OtherApp.Workbooks.Open "D:\1\test7890.xlsm"
のコードの
"D:\1\test7890.xlsm"
を、自分が開きたいファイルパスに書き換えます。
将来的には、ダイアログボックスやドロップダウンでファイルを指定する形に変えればいいと思います。
なお、本サンプルでは、このボタンからファイルを開かないとダメです。
ダブルクリックで直接他のExccelファイルを開いてしまうと、
質問者さまが言うところの、「ユーザーフォームのThisWorkbook」が表示されてしまいますので。
● (04)標準モジュールを作成して以下のコードをコピペ
以下の2行だけでいいです。
1 2 3 4 5 6 |
' ' Option Explicit Public o_OtherApp As Excel.Application ' ' |
ひとまず以上で、作成完了です。
● 使い方
いったんファイルを上書きして閉じて、再度開いてみてください。
Sheet1の「フォームを開く」を押します。
ユーザーフォームが「最前面で固定」で開きます。
ユーザーフォームの「Excelファイルを開く」でExcelファイルを開きます。
ユーザーフォームが常に最前面に固定されて、後で開いたExcelファイルを編集できます。
閉じるときは注意が必要です。
後で開いたExcelファイルは普通に閉じていいですが、
ユーザーフォームのブックは必ず「このフォームを閉じる」を押して
ThisWorkbookの表をしてから普通に閉じます。
でないと、ロックがかかったままおかしなことになります。