Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12649 / 13644 ツリー ←次へ | 前へ→

【9145】VBEウインドウ上にUserFormを表示するには mbi2 03/11/19(水) 14:33 質問
【9148】Re:VBEウインドウ上にUserFormを表示するには INA 03/11/19(水) 15:13 回答
【9166】Re:VBEウインドウ上にUserFormを表示するには bykin 03/11/19(水) 20:54 回答
【9167】Re:VBEウインドウ上にUserFormを表示するには ichinose 03/11/19(水) 22:25 発言
【9168】Re:VBEウインドウ上にUserFormを表示するには INA 03/11/19(水) 22:55 回答
【9177】Re:VBEウインドウ上にUserFormを表示するには mbi2 03/11/20(木) 13:05 質問
【9178】Re:VBEウインドウ上にUserFormを表示するには INA 03/11/20(木) 14:11 回答
【9193】Re:VBEウインドウ上にUserFormを表示するには mbi2 03/11/20(木) 18:51 発言
【9195】Re:VBEウインドウ上にUserFormを表示するには bykin 03/11/20(木) 22:02 回答
【9199】Re:VBEウインドウ上にUserFormを表示するには mbi2 03/11/20(木) 23:47 発言
【9206】Re:VBEウインドウ上にUserFormを表示するには bykin 03/11/22(土) 17:44 回答
【9412】Re:VBEウインドウ上にUserFormを表示するには mbi2 03/12/3(水) 12:39 お礼

【9145】VBEウインドウ上にUserFormを表示するには
質問  mbi2  - 03/11/19(水) 14:33 -

引用なし
パスワード
   次のようなマクロを実行すると

Sub test1()
 UserForm1.Show
End Sub

EXCELウインドウ上にUserFormに表示されますが、
たとえば、VBEからメニュー-実行-Subの実行
で、test1を実行した場合、VBEウインドウ上にUserFormを表示したいのです。
方法はありませんか?

【9148】Re:VBEウインドウ上にUserFormを表示する...
回答  INA  - 03/11/19(水) 15:13 -

引用なし
パスワード
   無いと思います。

【9166】Re:VBEウインドウ上にUserFormを表示する...
回答  bykin  - 03/11/19(水) 20:54 -

引用なし
パスワード
   こんばんわ。

●方法1(めっちゃ簡単)

 エクセルのメイン画面をアイコン化しておく。(コードはそのまま)

●方法2(コードで設定する)

Sub test1()
  Application.WindowState = xlMinimized
  UserForm1.Show
End Sub

試してみてな。
ほな。

【9167】Re:VBEウインドウ上にUserFormを表示する...
発言  ichinose  - 03/11/19(水) 22:25 -

引用なし
パスワード
   皆さん、こんばんは。

>●方法1(めっちゃ簡単)
>
> エクセルのメイン画面をアイコン化しておく。(コードはそのまま)
>
>●方法2(コードで設定する)
>
>Sub test1()
>  Application.WindowState = xlMinimized
>  UserForm1.Show
>End Sub
bykinさんの方法で既に事足りていると思いますが、
VBEオブジャクトを探っていたらこんなイベントがあったので・・・。
イベントプロシジャーが記述できるモジュールに(例えば、Thisworkbookのモジュール)、
'===============================================================
Private WithEvents cme As CommandBarEvents
Sub run_cmd_event()
  Dim cmc As CommandBarControl
  Set cmc = Application.VBE.CommandBars("Run").Controls(1)
  Set cme = Application.VBE.Events.CommandBarEvents(cmc)
End Sub
'==================================================================
Private Sub cme_Click(ByVal CommandBarControl As Object, Handled As Boolean, CancelDefault As Boolean)
  Application.WindowState = xlMinimized
End Sub
として下さい。
尚、参照設定で「Microsoft Visual Basic For Applications Extensbility 5.3」
にチェックして下さい。

これでプロシジャー「run_cmd_event」を実行後に
VBEからメニュー-実行-Subの実行を行ってみて下さい。
どこまで実用化できるかは??ですが・・・。
それとこのコードを実際には、どこに置くかも考えないと・・・。

【9168】Re:VBEウインドウ上にUserFormを表示する...
回答  INA  - 03/11/19(水) 22:55 -

引用なし
パスワード
   そうか、最小化すればいいんだ。
てっきりユーザーフォームも最小化されるんだと決めつけてた・・。

mbi2さん。ごめんなさい (^∧^)

【9177】Re:VBEウインドウ上にUserFormを表示する...
質問  mbi2  - 03/11/20(木) 13:05 -

引用なし
パスワード
   INAさん、bykinさん、ichinoseさん 有難うございます。
最小化ですか。できますね。
しかしウインドウの状態は変えたくありません。

考えているのはVBE操作のツールで、VBEのメニューにコマンドを追加し、
メニューをクリックするとUserFormを表示するものです。
VBE上に表示されないので、そこでつまずいています。

ウインドウの親子関係の処理なのでAPIとかで簡単に
出来るのではと思っていたのですが?
WEBで調べてはいるのですが...

【9178】Re:VBEウインドウ上にUserFormを表示する...
回答  INA  - 03/11/20(木) 14:11 -

引用なし
パスワード
   難しそうなプログラムを作っているのですね。
なにか補助機能のようなものでしょうか?

VBEの制御であれば、EXCELシートは見えなくても良さそうに思えますが・・

【9193】Re:VBEウインドウ上にUserFormを表示する...
発言  mbi2  - 03/11/20(木) 18:51 -

引用なし
パスワード
   こんばんは。

>なにか補助機能のようなものでしょうか?
VBEツールでモジュールのコピーとかコードのマージン設定印刷などです。
機能自体のマクロはほぼできていて、VBEメニューに組込もうとしています。

>VBEの制御であれば、EXCELシートは見えなくても良さそうに思えますが・・
見えなくてもいいのですが...
ユーザーインターフェイスはごく自然なかたちにしたいのです。
利用者からみて、あるコマンドを実行したら、他のウインドウが勝手に
最小化したら変に思いますよね。

【9195】Re:VBEウインドウ上にUserFormを表示する...
回答  bykin  - 03/11/20(木) 22:02 -

引用なし
パスワード
   こんばんわ。

>ユーザーインターフェイスはごく自然なかたちにしたいのです。
あんまり凝らんでもええと思うねんけど・・・
VBEのユーティリティなんて使うのはそこそこスキルのある人やろうから
あらかじめ説明しておけば済むような気ぃすんねんけどな。

ま、どーしてもってことやったら、こんなんかな?

'(標準モジュール)
Private CB As New Class1

Public Declare Function FindWindow Lib "user32" _
            Alias "FindWindowA" _
            (ByVal lpClassName As String, _
            ByVal lpWindowName As String) As Long

Public Declare Function SetParent Lib "user32" _
            (ByVal hWndChild As Long, _
            ByVal hWndNewParent As Long) As Long

Sub TestMacro()
  Load UserForm1
  UserForm1.Show
  Unload UserForm1
End Sub

Sub CreateCommandbar()
  On Error Resume Next
  With Application.VBE
    .CommandBars("TEST").Delete
    With .CommandBars.Add(Name:="TEST", Temporary:=True)
      With .Controls.Add
        .Style = msoButtonCaption
        .Caption = "マクロ起動ボタン"
      End With
      .Visible = True
    End With
    Set CB.CBE = .Events.CommandBarEvents(.CommandBars("TEST").Controls(1))
  End With
End Sub

'(クラスモジュール−Class1)
Public WithEvents CBE As CommandBarEvents

Private Sub CBE_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
  TestMacro
End Sub

'(フォームモジュール−UserForm1)
Private Sub UserForm_Initialize()
  Dim hWndFrm As Long
  Dim hWndVBE As Long
  Dim Ret As Long
  
  hWndFrm = FindWindow("ThunderDFrame", vbNullString)
  hWndVBE = FindWindow("wndclass_desked_gsk", vbNullString)
  Ret = SetParent(hWndFrm, hWndVBE)
End Sub

フォームが1個しかないんやったら、API宣言はフォームモジュールに
移動させてPrivate宣言してもかまいまへん。
CreateCommandbar()を実行するとVBEにコマンドバーが追加されるので、
そこのボタンを押すとフォームが表示されます。

VBかOfficeDeveloperでCOMアドイン(DLL)作るのが本筋とも思うけど・・・
ま、お暇やったら試してみてな。
ほな。

【9199】Re:VBEウインドウ上にUserFormを表示する...
発言  mbi2  - 03/11/20(木) 23:47 -

引用なし
パスワード
   bykinさん こんばんは
さすが、comアドインのbykinさん! 有難うございます。

じつはWEB検索で以下をみつけ、試していたところでした。
http://www.excel-center.com/mailing/067299h.htm

同じコードなんですが、for excel2000
'標準モジュール
Sub test1()
 UserForm1.Show
End Sub

'フォームモジュール
Private Declare Function FindWindowA Lib "user32" _
 (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetParent Lib "user32" _
 (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Sub UserForm_Initialize()
 Call SetParent(FindWindowA("ThunderDFrame", Me.Caption), _
  Application.VBE.MainWindow.hWnd)
End Sub

そこで、たぶん隠しプロパティ発見?。hWndプロパティ?
Application.VBE.MainWindow.hWnd

SetParent関数で目的は達したかに思えたのですが、
なんと、VBEのウインドウから外に動かせない。
Excel上と同じように自由に動かせたらベストなんですが?

>VBかOfficeDeveloperでCOMアドイン(DLL)作るのが本筋とも思うけど・・・
おっしゃる通りです。
COMアドインならこんな余計な処理は無用ですね。
アドイン(xla)でも動かして見たかった、ということで。

【9206】Re:VBEウインドウ上にUserFormを表示する...
回答  bykin  - 03/11/22(土) 17:44 -

引用なし
パスワード
   こんにちわ。

>さすが、comアドインのbykinさん! 有難うございます。

おおっ!お客はんでしたか!毎度おおきに〜(笑)

>SetParent関数で目的は達したかに思えたのですが、
>なんと、VBEのウインドウから外に動かせない。

ほんまやねー。いつも最大化してるんで、そこまで気ぃつきまへんでした。
SetWindowLongとか使っていろいろ試してみたけど、どうも上手いこといかへんね。

やっぱし最初に戻ってエクセルのメイン画面を操作したほうが簡単なんとちゃうかな?
最小化するんやのうて、非表示にして↓こんな方法でやるとか・・・

・前回のコードのうち、API宣言は全部削除。Private Sub UserForm_Initialize()も削除。
・TestMacroを下記のように変更する。

Sub TestMacro()
  Load UserForm1
  Application.Visible = False
  UserForm1.Show
  Application.Visible = True
  Unload UserForm1
End Sub

これやったら非表示前のWindowStateを保存しておく必要もあらへんし・・・
ご希望とは異なるんやけど、まぁいっぺん試してみておくれやす。

>そこで、たぶん隠しプロパティ発見?。hWndプロパティ?
>Application.VBE.MainWindow.hWnd

おおっ!これは・・・貴重な情報をおおきにです。
COMアドインでも使えそうな感じです。

あーりがーとさんっ!
ほなっ!

【9412】Re:VBEウインドウ上にUserFormを表示する...
お礼  mbi2  - 03/12/3(水) 12:39 -

引用なし
パスワード
   こんにちは。
有難うございました。

12649 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free