• ベストアンサー

[ExcelVBA] Application.Dialogs(xlDialogPrint).Show とユーザーフォームについて

[環境] WinXpHomeSP2 Excel2002SP3 Excelのユーザーフォーム上にあるコマンドボタンをクリックすると、アクティブになっているシートを印刷するプログラムを作成しています。 印刷前に印刷ダイアログを表示し、プリンタの設定およびプレビューを可能にしたいため、 Application.Dialogs(xlDialogPrint).Show を使用しています。 ユーザーフォームはその直前でいったんHideし、上記コードの直後に再度Showしています。 表示された印刷ダイアログの「プレビュー」ボタンをクリックすると、Hideしたはずのユーザーフォームがプレビュー画面の前面に表示されてしまい、プレビュー画面、ユーザーフォーム画面のどちらのボタンも効かなくなって制御不能となってしまいます。 プレビューしてもユーザーフォームが立ち上がってこなくなる方法を教えてください。

  • q_ta
  • お礼率64% (65/101)

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

再度の登場 onlyromです。 >UserForm1をいったんHideした後にまたShowするため、※1が実行され その後は新しくUserForm1が立ち上がったのと同じ動作をします。 Showすれば必ずActivateイベントが発生します。 その処理は、 UserForm_Initializeイベントに書くと拙いのですか? Initializeイベントであれば、HideしてShowしても そこを通りませんので実行されません。 絶対Activateイベントに書かなければならないコードであり、 かつ、今回のように場合によっては、Activateイベントのコードを 実行させたくない時は 実行させるかさせないか判断させるための変数を モジュール変数としてとっておきそれを利用する手もあります。 それから、 >このUserForm1が閉じられた後、※2を実行してしまうため、エラーになってしまいうまくいきません。 これは、Showの前で、※2を実行すればいいのではありませんか? '--------------------------------------   Dim MyFlag as Boolean '-------------------------------------- Private UserForm_Activate()   If MyFlag = True then Exit Sub     ーーー処理ーーー End Sub '-------------------------------------- Private Sub CommandButton1_Click   Dim blResponse AS Boolean    :(帳票出力準備) ●● MyFlag = True  ●●   UserForm1.Hide   blResponse = Application.Dialogs(xlDialogPrint).Show    :(帳票出力後始末)   If blREsponse Then     MsgBox "出力終了"   End If ▲▲   : (※2)  ▲▲       UserForm1.Show ●● MyFlag = False ●● End Sub '-------------------------------------------------- UserformActivateイベントで何をしてるのか (※2) で何をしてるのか分かりませんので これくらいのアドバイスしかできませんが、 さらに言うと UserForm.Showの後に、(※2)のように何かの処理をさせるコードを書くことはありません。 書くとすれば、UserFormをYesNoのMsgBoxのように使う場合です。 また上記アドバイスでは、UserFormの使い方が不明でしたので (※2)とShowを入れ替えていますが、 通常、UserFormが閉じられたときの処理は、 UserForm_QueryClose などに書きます。   Activateイベントの処理内容、(※2)の処理内容が分かれば もっと的確な回答が寄せられるでしょう。      

q_ta
質問者

お礼

ご回答ほんとうに感謝いたします。 ご教示いただいたことをもとに、以下のように修正しました。 1.ActivateイベントからInitializeに書き直した。 2.CommandButton1_Clickの流れ全体を見直し、UserForm.Showの後にあった処理をその前に持ってきた。 No4さんの回答を参考にさせていただき、結局UserForm.Showはなくなりましたが、全体にコードがすっきりしました。 情報不足の中、的確なご回答をいただき、ほんとうにありがとうございました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

修正 割り込み失礼しました。   ↓ 割り込み失礼します。 でした。(^^;

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 割り込み失礼しました。 Excel2002SP3という条件なら、 >ユーザーフォームがプレビュー画面の前面に表示されてしまい、プレビュー画面、ユーザーフォーム画面のどちらのボタンも効かなくなって制御不能となってしまいます。 私の読み違えでなかったら、それは、Zオーダーの前面に来る来ないは別にして、Modalモード(=ShowModal または、.Show ) が、Trueにしてあるからではありませんか? 単に、False にすれば、Hide にしなくてもよいと思います。 あえて、UserForm が邪魔というなら、以下のようなコードにすればよいと思います。 ただ、UserForm のプロパティの 「ShowModal : False または、.Show(False)」には変わりありません。 ---------------------------------------------------------------------- Private Declare Function CloseWindow Lib "user32.dll" _ (ByVal hWnd As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _     (ByVal lpClassName As String, _     ByVal lpWindowName As String) As Long Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _     (ByVal hWnd As Long, _     ByVal nIndex As Long, _     ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _     (ByVal hWnd As Long, _     ByVal nIndex As Long) As Long Private Declare Function DrawMenuBar Lib "user32.dll" _     (ByVal hWnd As Long) As Long Private Const GWL_STYLE As Long = -16 Private Const WS_THICKFRAME As Long = &H40000 Private Const WS_MINIMIZEBOX As Long = &H20000 Private Sub CommandButton1_Click() Dim strClassName As String Dim hWnd As Long Dim ret As Long strClassName = "ThunderDFrame" '97:ThunderXFrame" hWnd = FindWindow(strClassName, Me.Caption) ret = CloseWindow(hWnd) Application.Dialogs(xlDialogPrint).Show End Sub Private Sub UserForm_Initialize() Dim strClassName As String Dim hWnd As Long Dim lngNewLong As Long Dim ret As Long strClassName = "ThunderDFrame" '97:ThunderXFrame" hWnd = FindWindow(strClassName, Me.Caption) lngNewLong = GetWindowLong(hWnd, GWL_STYLE) ret = SetWindowLong(hWnd, GWL_STYLE, _           lngNewLong Or _           WS_THICKFRAME Or _           WS_MINIMIZEBOX) ret = DrawMenuBar(hWnd) End Sub ----------------------------------------------------------------------

q_ta
質問者

お礼

コードまで書いていただき、ほんとうにありがとうございます。 早速そのまま使わせていただきました。 結果、かなり理想に近い動作に仕上がり、あと一息で完成となりそうです。 どうもありがとうございました。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

  何はともあれ、実際のコードをアップしてみてください。 Private Sub CommandButton1_Click()  ● ここのコードをアップ ● End Sub    

q_ta
質問者

補足

ありがとうございます。 最初は下記のようにコードを記述していました。 Private Sub UserForm_Activate    : End Sub Private Sub CommandButton1_Click    :   UserForm1.Hide   Application.Dialogs(xlDialogPrint).Show   UserForm1.Show    : End Sub 質問した後、ANo1様のアドバイスをもとに、以下のようにコードを変更しました。 UserForm1は印刷する、しないにかかわらず必ず表示させておきたいのです。 Private Sub UserForm_Activate    : (※1) End Sub Private Sub CommandButton1_Click   Dim blResponse AS Boolean    :(帳票出力準備)   UserForm1.Hide   blResponse = Application.Dialogs(xlDialogPrint).Show    :(帳票出力後始末)   If blREsponse Then     MsgBox "出力終了"   End If   UserForm1.Show    : (※2) End Sub 上記のように変更し、一見うまくいったように見えましたが、UserForm1をいったんHideした後にまたShowするため、※1が実行され、その後は新しくUserForm1が立ち上がったのと同じ動作をします。 このUserForm1が閉じられた後、※2を実行してしまうため、エラーになってしまいうまくいきません。 UserForm1を表示させたままでxlDialogPrintが使えれば良いのですが...。

  • nekoron07
  • ベストアンサー率37% (69/184)
回答No.1

Application.Dialogs(xlDialogPrint).Show の後に If response = ok Then   UserForm1.Show    ←ユーザーフォームの名称 End If とすれば、印刷OKのボタンを押したときにユーザーフォームが現れると思います。

q_ta
質問者

お礼

ダイアログの結果を受け取る方法はわかりました。 Dim response As Boolean response = Application.Dialogs(xlDialogPrint).Show If response = true Then ですね。 ありがとうございました。

q_ta
質問者

補足

ご教示ありがとうございます。 If response = ok Then ... としてみましたが、 コンパイルエラー 変数が定義されていません。 となってしまいます。

関連するQ&A

  • ユーザーフォームのHide,showメソッド

    ExcelのVBAでユーザーフォームをHideメソッドで非表示にして、 showで再表示すれば、状態が保存されたまま表示されるはずですが、 ユーザーフォーム表示中またはHideメソッドで隠した後に コマンドボタン等が配置されたシートを削除したときは、showで再表示しても、 ユーザーフォームの状態が保存されていません。 これはどうしてでしょうか? また解決策等ありましたら、教えてください。

  • ユーザーフォーム

    シート1にユーザーフォーム1を、シート2にユーザーフォーム2をそれぞれ表示しておいてHideで非表示にして画面を切り替えて使用してますが、片方のフォームを表示しておくのを忘れたりHideでなくUnroadで終了していたのを忘れていたりしてエラーにしてしまいます。Hideで非表示でなかったらフォームを開かないしShowでもエラーにならないようにするにはどうしたらよろしいでしょうか。VBAは素人ですのでやさしく教えてください。宜しくおねがいします。

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • エクセルのユーザーフォームについて

    現在、ワークシートの内容を見やすくするためにユーザーフォームを使用し表示させています。印刷は、ユーザーフォームにコマンドボタンを配置し、ワークシートを印刷しています。 せっかくユーザーフォームで見やすいレイアウトにしているので、表示させた内容をユーザーフォームごと印刷できればと考えています。 画面のハードコピーとかではなくて、コマンドボタンをクリックすることで印刷したいのですが、どなたか教えてください。

  • ExcelVBAでユーザーフォームが勝手に閉じてしまいます。

    ExcelVBAでユーザーフォームが勝手に閉じてしまいます。 ExcelVBAを独学で始めてまだ2週間足らずの超初心者です。 Excelワークシートにコマンドボタン配置してそのコマンドボタンを押すとユーザーフォーム1が開き、ユーザーフォーム1に配置してあるリストボックスからリストをダブルクリックで選択すると、ユーザーフォーム2が開くように設定しています。ただ、ユーザーフォーム1のリストをダブルクリックして選択した時点でユーザーフォーム1が勝手に閉じてしまいます。ユーザーフォーム1を勝手に閉じさせないでコマンドボタンで閉じるようにしたいのですがどうしたらよいのでしょうか。レベルの低い質問かもしれませんが困っています。宜しくお願い致します。

  • ExcelVBA ユーザーフォームのコードがない

    いつもお世話になっています。 Excel vbaで質問させてください。 あるExcelブック(test.xlsとします)を開くと、ユーザーフォーム(と思う)が表示されます。 (この時、Excelアプリケーションは「表示」されていてモーダルの状態です) ユーザーフォームで日付を選び、「これでOK」ボタンをクリックすると 新規ブックとして「text_0614.xls」が出来て、これが表示ブックとなります。 (元のtest.xlsは閉じられています) vbaコードの修正がしたくて、VBEから作業しようとしたところ ユーザーフォームモジュールも、標準モジュールも何も見当たりません。 Thisworkbookのイベントも何も書いてありません。 プロジェクトにパスワードがかかっているのかと思いましたが、もしそうだとしても プロジェクトウィンドウに、「フォーム」というフォルダは表示されると思いますし、 また、ダブルクリックしてもパスワードを求められることがありませんので パスワードがかかっているようには見えません。 これはExcelVBAのユーザーフォームじゃないのでしょうか?(VB?) または、もし、この「フォーム」フォルダごと、ユーザーに見せないやり方があるのでしょうか? どなたかご存知の方いらっしゃいましたらご教示ください! WinXP SP3 Excel2003 SP3 使用です。 どうぞよろしくお願いします。

  • ExcelVBAのユーザーフォームの起動

    いつもすみません。 ExcelVBAで作成したユーザーフォームの画面をファイルを開いた直後に表示させることは可能でしょうか? ちなみに、ユーザーフォームが表示される前に、「マクロを有効にする」というボタンをクリックするぐらいのことはOKなのですが、、、 要は、ファイルを開いてからマクロの実行を手動で実行したくないということなのです。 (ボタンとか、ツールバーのメニューというのもダメなのです。) わがままなお願いですが、ご教授お願いします。

  • エクセルVBA ユーザーフォーム追加オプション表示

    皆さんこんにちは。 エクセル2013を使用しています。 エクセルのユーザーフォームを半分、非表示/表示って出来ますか? 印刷設定画面などでフォーム上に〇の中に「>」マークのボタンが載っていて そのボタンを押すとフォームが右にびよ~んと伸びて 追加オプションが表示される・・・ っていうのをたまに見るんですけど それをエクセルのユーザーフォームでも出来るのでしょうか。 これが出来るなら、とあるオプションボタンを押した時だけ 追加オプションが表示されるVBAが出来るな、と企んでいるのですが 検索の仕方が悪いのか、ネット上で該当するものが見つかりません。 VisualBasic画面のツールボックスにもそのようなボタンがないので ひょっとしたらコントロールの追加ダイアログで対応すれば 出来るのかしら?と思うのですが あの〇の中に「>」のマークの名称も分からず つまづいております。 うまく説明出来ずに申し訳ないのですが あのびよ~んと伸びるユーザーフォームが出来るのであれば どなたかご教示いただけないでしょうか。

  • ExcelVBA ユーザーフォームのオブジェクト名

    ExcelVBA ユーザーフォームのオブジェクト名について質問です。 Excel2003で、あるユーザーフォームのオブジェクト名を「ユーザーフォーム表示中」とし、 ユーザーフォーム表示中.Showで表示するように記述しました。 何度かテストを済ませ、他のプログラムも含めて完成したと思ったのですが、他のPCでエラー報告があり、コードを確認したところ、なぜか、ユーザーフォーム表示.Show(中の字が消えている)になっていました。 もちろん誰かが記述を変更することは考えられません。 以前、自分のPC内でも同じようなことがあり、いくら原因を探しても見つからず、ユーザーフォームのオブジェクト名を削除された記述に合わせて対処したことがあります。 これは何が原因なのでしょうか。 文字数制限か何かあるのでしょうか。

  • ユーザーフォームが表示前にエラーになります。

    お世話になります。 Excelのシート上にコマンドボタンを配置して それをクリックするとユーザーフォームが表示されるようにしたいのですが、下記のコードだと「フォーカスがありません」と1行目でエラーで止まってしまいます。 解決方法を教えてください。 Private Sub コマンドボタン_Click() ユーザーフォーム.Show End Sub よろしくお願いします!