★ExcelVBA ~ ユーザーフォームだけを表示して、アプリケーションウィンドウを非表示にする方法(簡易版=NoAPI)
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
参考URL→https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_070.html
★1つのExcelファイルしか開かない場合
【方法その1】
単純に「Application」をVisibleにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
' ' 'よくよくWebページを読んでみると・・・、 ' Private Sub CommandButton1_Click() Application.Visible = True Unload Me End Sub Private Sub UserForm_Initialize() Application.Visible = False End Sub ' '・・・だけでも行けるみたいです。 ' '2 つ目のExcelファイルは普通のウィンドウの状態で開きました。 'でも、最初のファイルのユーザーフォームを閉じないと、 'あとから開いたファイルを閉じることができませんでした。 '最初のユーザーフォームをモーダレス(Modal=False)にするといいみたいです。 'ただそうすると、前面にユーザーフォームが来なくなります。 '後から開くExcelファイルをオートメーションでNewするとどうなるのか??? 'APIでアクセスのようなことができないか? ' ' |
【方法その2】
Applicationを標準のままにして、ユーザーフォームの後ろに「隠す」。
かつ「ユーザーフォームの後ろに隠しながら、Applicationを移動」する。
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 |
' ' Option Explicit 'Excelファイルを1つだけしか開かない場合しか使えないです。 '参考→https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_070.html Const OriginalWidth As Integer = 800 'もとに戻したいウィンドウの横の長さ Const OriginalHeight As Integer = 500 'もとに戻したいウィンドウの縦の長さ Private Sub CommandButton1_Click() '閉じるボタンを押すと、アプリケーションウィンドウが 'それなりの大きさに戻るようにする。 ActiveWindow.Left = 10 ActiveWindow.Top = 10 ActiveWindow.Width = OriginalWidth ActiveWindow.Height = OriginalHeight Unload Me End Sub Private Sub UserForm_Layout() 'ドラッグ移動したときも、フォームの後ろにアプリケーションウィンドウが隠れます。 Call UserForm_MouseMove(1, 1, 1, 1) '呼び出すときの引数のこの「1」は↑、ダミーの値です。 'コードのメンテをしやすくするために、 '「UserForm_MouseMove」の内容を流用するために使いました。 '今のところ大丈夫みたいですが、 '将来これでおかしな挙動になるかもしれないので、 'もしそうなったら、「UserForm_MouseMove」イベントと 'まったく同じ内容に書きかえればいいと思います。 End Sub Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Application.WindowState = xlNormal ActiveWindow.Left = Me.Left + 3 ActiveWindow.Top = Me.Top + 2 ActiveWindow.Width = 200 ActiveWindow.Height = 175 End Sub ' ' |
★2つ以上のExcelファイルを開く場合
【方法その1】
これも、単純に「Application」をVisibleにする。
つまり、『 ★1つのExcelファイルしか開かない場合 』の『【方法その1】』の方法でもなんとかやれるっぽい?
ただし、ユーザーフォームのShowModalを「False」にしておかないと、2つめ以降のファイルが(開くだけで)操作できない。
また、ユーザーフォームのShowModalを「False」にしても、2つ目のファイルの動きがなめらかに動くわけではなく、なんとなく挙動不審。
2つ目のファイルが開くのもすごく遅いし。
ユーザーフォームの動きを変えたい時は、場合によっては目的を達成できなさそう。
【その2】(アイディアのみ)
AccessだとAPIでできるかもしれないので、それを参考にすればやれるかも?です。
『 Accessウィンドウを表示しない方法 Access2007以降版 』
https://hatenachips.blog.fc2.com/blog-entry-389.html
このサンプルは、32bitAccess用なので、64bitのAccessの場合は、全ての(赤くなってしまってる)、
「Private Declare Function・・・」
を
「Private Declare PtrSafe Function・・・」
に書き換える必要があります。
当方では動き、2つめのAccessファイルは普通のウィンドウ状態で開きました。
2つめのファイルの動きが制限されることは一応はありませんでした。
最前面にするのもAPIでできるはずなので、参考になるかも?しれません。
Excelのユーザーフォームだとダメかもしれませんが・・・
でも、できるかも?しれません。
これをベースに、Excelに転用できないか、新しくご質問を立てるのもよいかも?しれません。
- 投稿タグ
- ExcelVBA, Excel連携VBA, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ユーザーフォーム, 独学, 自動化