• 締切済み

Excel VBAでユーザーフォームだけ表示したい

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 シートを非表示というオーダーですが、 ブック内のすべてのシートを非表示にすることは不可能ですから、 代りにブックのウィンドウを非表示にします。 (※ブックが複数のウィンドウをもっている場合もあります。   その場合はすべてのウィンドウを非表示にするようループさせてください) ウィンドウがひとつであれば、   Me.Windows(1).Visible = False という記述で非表示に、   Me.Windows(1).Visible = True で再表示されます。 因みに、ウィンドウを非表示にした状態で、ブックを保存すれば、 次に開いた時にも非表示の状態は維持されますのでWorkbook_Openイベントからの ブックのウィンドウを非表示にする処理は、設計次第では必要ない場合もあるのかも知れません。 しかし、Excelメニューの[表示]タブから簡単に[再表示]出来てしまいますから、 見られては困る内容ならば、ブックの保護を組み合わせた方がよいのかも知れません。 その場合のサンプルとしては以下のような書き方になります。 後述の本題のコードではブックの保護を扱っていませんので、 必要なら.Windows(1).Visible = の前後の行に追加修正してください。 その際は、記述の順番を間違えないように注意することと、 ActiveWorkbookとしては捉えられない(=非表示の)ブックオブジェクトが対象ですから、 ThisWorkbook、とか、(ThisWorkbook モジュールに書く場合は)Me、とか、明示的に指定してください。 Sub ブックのウィンドウ非表示()   Me.Windows(1).Visible = False   Me.Protect Password:="1234", Structure:=True, Windows:=True End Sub Sub ブックのウィンドウ再表示()   Me.Unprotect Password:="1234"   Me.Windows(1).Visible = True End Sub また、そもそもシートを表示させないブックということなら、 アドインブック(*.xla、*.xlam)として保存しておくのが一般的なので、 通常のマクロ有効ブックを開いてシートが見えないのは、 慣れた人でも驚いてしまうかも知れませんから、理解を得るよう工夫した方が好いとも思います。 ' ' /// お望みのものとは違うかも知れませんが、 直接的な返答として現状に役立ちそうな記述を以下並べてみます。 ' ' /// ' ' ThisWorkbook モジュール  '  8521223 Private Sub Workbook_Open() ' '  Application.Visible = False '★   Me.Windows(1).Visible = False '◆   myForm.MultiPage1.Value = 0 'マルチページ構成のため '◆ 必要ない気もしますが、この記述が先でないと意味ないです。   myForm.Show '★ モーダル表示の場合は、myForm を閉じるまで次の行に進みません。 End Sub ' ' /// ' ' myForm モジュール  '  8521223 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) '========== [×]ボタン,[Alt]+[F4]キーを無効にする ==========   Dim msg As String, title As String   msg = "[画面を閉じて終了する]ボタンから終了してください。"   title = "終了方法"   Dim res As Integer '  Select Case CloseMode '  Case vbFormControlMenu ' フォームの閉じるボタンから閉じようとした場合は  ◎ '    res = MsgBox(msg, vbOKOnly + vbCritical, title) '    Cancel = True '  End Select   If CloseMode <> vbFormCode Then '◆ コード(自作のボタンのイベント)からUnLoadした場合以外は  ◎     res = MsgBox(msg, vbOKOnly + vbCritical, title)     Cancel = True     Exit Sub '◆ 以降の行の処理を実行したくないという意図だと思うのですが、その場合の記述。   End If '◆ ''  ActiveWorkbook.Save '★ ? この記述で何をしたいのかはこちらでは判りません   Dim wbk As Workbook   For Each wbk In Workbooks '◆ Workbooks総当たり     If Not (wbk.Name = ThisWorkbook.Name Or UCase(wbk.Name) Like "PERSONAL.XLS*") Then Exit For   Next   If wbk Is Nothing Then '◆ ThisWorkbook以外にWorkBookが開かれていなければ ''    Application.Visible = True '★     Application.Quit '★ Applicationを終了   Else '◆ ThisWorkbook以外にWorkBookが開かれていれば     Set wbk = Nothing     With ThisWorkbook '◆ ThisWorkbookについて       .Windows(1).Visible = True '◆ Windowを再表示する       .Close SaveChanges:=True '◆ 閉じる。上書き保存したくない場合はFalse     End With '◆   End If End Sub ' ' /// 他、 > (1)を実行できた場合に、再度コードを編集する時はどうしたらExcelの画面が表示できるのか教えて下さい。 >  ※それとも表示できないのでしょうか? ユーザーフォームをモーダル(排他的)表示した場合は、 コマンドバーのボタン(又はクイックアクセスツールバー)に頼るぐらいしか無いのではないかと。 それでは心許ない、というか、カスタマイズされた環境でしか出来ないことになってしまいます。 ブックのウィンドウを再表示するコード自体は前述のように至って簡単ですが、 権限によって再表示の可否を制限する必要があるなら、以下のような感じにします。 この例では、仮に、CommandButton99 を クリックした場合、のイベントプロシージャに書いていますが、 UserForm_QueryClose イベント内の記述、res = MsgBox()を工夫して、 resの値で条件分岐してみるのもいいかも知れません。 (ユーザー目線で、パスワードを探りたくなるような目立つ設計を奨めるつもりではありませんけれど。) ブックの保護と関連付ける場合は前述のサンプルを参考にして下さい。 ' ' /// Private Sub CommandButton99_Click()   Dim vRtn   Const ADMIN_PASS = "1234" '◆ ぱすわーど任意に指定   vRtn = Application.InputBox(Prompt:="パスワードを入力", Title:="管理者用編集モード")   If vRtn <> ADMIN_PASS Then Exit Sub   ThisWorkbook.Windows(1).Visible = True   Me.Hide End Sub ' ' /// 因みに、パスワードを扱うなら、 VBAProjectを保護しておくのが、比較的簡単でより堅くなるとは思います。 以上です。