- ベストアンサー
エクセルのマクロでシートを表示させる
マクロ初心者です。 1つのブックに20シート入っているのですが、 チェックBOXにチェックを付け、該当するシートのみを表示させるマクロを教えてください。 sheet1以外の下記のシートA~Dは非表示になっており sheet1にはシート名 A B C D というチェックBOXがあり、 例えば、Bにチェックを入れるとBのシートが表示され、 AとDなど複数チェックが入るとチェックしたシートが表示される様な マクロがありましたら、教えてください。 マクロの記録で読み込ませているのですが、複数シートの為、限界を感じております。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>例えば、Bにチェックを入れるとBのシートが表示され、 >AとDなど複数チェックが入るとチェックしたシートが表示される様な 1)チェックボックスを1つクリックするだけでシートがON/OFFするようなら、表示メニューの ツールバー⇒コントロールツールボックスの中のチェックボックス v sheetB v sheetC Private Sub CheckBox1_Click() If CheckBox1.Value Then Worksheets("Sheet2").Visible = True Else Worksheets("Sheet2").Visible = False End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value Then Worksheets("Sheet3").Visible = True Else Worksheets("Sheet3").Visible = False End If End Sub 2)チェックボックスをいくつか用意した後にボタンで全部をON/FFするようなら、表示メニューの ツールバー⇒フォームの中のチェックボックス と、ツールバー⇒コントロールツールボックスの中のボタンの組合せ v sheetB v sheetC [実行ボタン] Private Sub CommandButton3_Click() If Range("E13") = True Then Worksheets("Sheet2").Visible = True Else Worksheets("Sheet2").Visible = False End If If Range("E17") = True Then Worksheets("Sheet3").Visible = True Else Worksheets("Sheet3").Visible = False End If End Sub 後は努力しだい。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 最初、標準モジュールとクラスモジュールに貼りつけます。 このマクロの使い方は、最初に、SettingCheckBoxes で、CheckBoxにインスタンスを設けます。後は、自動的に組み込まれています。ただし、一旦設定されたCheckBox は、マクロを変更したりすると、設定が壊れることがあります。その場合は、再設定をしてください。シートの数が多くなっても、CheckBoxに組み込まれます。 Sheet1 もしくは、最初のシートに、CheckBox を置いてください。そのシート自体は、表示・非表示は出来ません。後は、CheckBoxの数とシートの数を合わせてください。そうしないと、エラー検出モードでは、設定は出来ません。 もし、シートの数とCheckBox の数を合わせないようでしたら、SettingCheckBoxes の ErrorFree のところに、True を入れてください。 Const ErrorFree As Boolean = False 'エラー検出モード 一旦設定されたら、シート等を変更しない限りは、再設定は不要です。 '------------------------------------------- '標準モジュール Public myClass() As Class1 Sub Auto_Open() Call ShVisibleRetrieval Call CheckBoxesClsssSetting End Sub Sub CheckBoxesClsssSetting() 'Class 設定 Dim cnt As Variant Dim i As Long For Each cnt In ActiveSheet.OLEObjects On Error Resume Next If TypeOf cnt.Object Is MSForms.CheckBox Then ReDim Preserve myClass(i) Set myClass(i) = New Class1 Set myClass(i).Chk = cnt.Object i = i + 1 End If Next On Error GoTo 0 End Sub Sub ShVisibleRetrieval() 'シートの状態をチェックボックスに反映 Dim i As Long Dim cnt As Variant Dim n As String i = 1 On Error Resume Next For Each cnt In ActiveSheet.OLEObjects If TypeOf cnt.Object Is MSForms.CheckBox Then n = cnt.Object.Caption If Worksheets(n).Visible <> xlSheetVisible Then cnt.Object.Value = False Else cnt.Object.Value = True End If End If If Err.Number > 0 Then Exit Sub Next On Error GoTo 0 End Sub '========================================= Sub SettingCheckBoxes() 'チェックボックスの設定 'シート名をチェックボックス名に反映 Dim i As Long Dim shCnt As Long Dim cnt As Variant Dim e As Integer Const ErrorFree As Boolean = False 'エラー検出モード 'チェックボックスを置いたシートは連動しない shCnt = ThisWorkbook.Worksheets.Count i = 1 On Error Resume Next For Each cnt In ActiveSheet.OLEObjects If TypeOf cnt.Object Is MSForms.CheckBox Then Do Until ActiveSheet.Index <> i: i = i + 1: Loop cnt.Object.Caption = Worksheets(i).Name i = i + 1 End If If Err.Number > 0 Then e = Err.Number: GoTo EndLine Next On Error GoTo 0 EndLine: If ErrorFree = False Then If shCnt > (i - 1) Then MsgBox "コントロールの数が足りません。" & vbCrLf & _ "コントロールを増やしてやり直したほうがよいです。", vbQuestion ElseIf shCnt < (i - 1) Then MsgBox "コントロールを残して、終了しました。" & vbCrLf & _ "不要なコントロールを削除してください。", vbInformation Else Call Auto_Open MsgBox "設定が終わりましたので、使用できます。", vbInformation End If Else If e = 9 Then Call Auto_Open MsgBox "コントロールの数が多すぎますが、設定されました。", vbExclamation ElseIf e > 0 Then Call Auto_Open MsgBox "エラーが発生しているので、不具合があるかもしません。", vbExclamation Else Call Auto_Open MsgBox "設定が終わりました。", vbInformation End If End If End Sub '========================================= '------------------------------------------- 'クラスモジュール Public WithEvents Chk As MSForms.CheckBox Private Sub Chk_Click() ThisWorkbook.Worksheets(Chk.Caption).Visible = IIf(Chk.Value, xlSheetVisible, xlSheetHidden) End Sub
- mt2008
- ベストアンサー率52% (885/1701)
シート上に置く事が出来るチェックボックにはコントロールボックスとフォームの2種類がありますがどちらでしょう? とりあえず、コントロールボックスの方だと仮定して回答いたしますが、チェックボックのコメントがそのままシート名になっているのでしたら、↓こんな感じでどうでしょう。 Private Sub CheckBox1_Click() Sheets(CheckBox1.Caption).Visible = CheckBox1.Value End Sub 「CheckBox1」の部分は適当に修正してください。
お礼
お返事遅くなりました。 おかげさまでイメージ通りのものができました。 ありがとうございました。