エクセルVBAのIf~Gotoで処理分岐します。シート非表示VBAソフトのコードの紹介です。
コントロールのイベント処理は、間違い防止のため、条件付き実行にしています。
今回は、エクセルシート非表示VBAソフトのコードの説明を行います。
こんにちは、じゅんぱ店長(@junpa33)です。
Gotoステートメントは、多用するとコードの流れが複雑で訳が分からなってしまう事もあります。
Gotoの使用は、コードの可読性も悪くなりバグの発生や発見についても非常に不利に働く可能性が高くなります。
そのため、あまり使わないようにするというのが共通認識です。
しかし敢えて、
今回は敢えて作ってみました。Gotoの多用でコードがビュンビュン飛んでいます。If条件文で分岐もいっぱいです。
何の参考にもならないという話もありますが、そこはチャレンジ精神で作ってみました。
基本、Gotoを標準モジュールを使う場合は、コードを書くごとに「ステップイン」でチェックしながら行うのが吉です。
(今回の場合はイベントですので使えません。)
プチなVBAコードシリーズは他にこのようなもの↓があります。
コンテンツ
シート非表示VBAソフト作成のコンセプト
- 条件分岐のコードはGotoでジャンプで移動処理していきます。
- ソフトの起動にはイベントで鍵を付けます。
- 今あるエクセルファイルにも導入できるようなツール的ソフトにします。
- 多種多様なシート名にも使えるようにします。
- 「非表示解除できるタイプと出来ないタイプ」の2種類の非表示にも対応します。
- ユーザーフォームからの操作で、VBAコードの記述はフォームモジュールだけにします。
- コンパクトに納めるため、このソフト用のための、新たなシート、標準モジュールを使いません。
ユーザーフォームにコントロールを配置します
このユーザーフォームを作ります。
ユーザーフォーム全体にコントロールの「フレーム」を敷いています。
コントロールの配置
他にチェックボックスの名称「強化Ver.」はラベルで作成しています。
UserForm | ①Frame1 | ④CheckBox |
オブジェクト名 シート表示 | オブジェクト名 Frame1 Caption (空欄) |
オブジェクト名 強化保護 Caption (空欄) |
②コマンドボタン | ③トグルボタン |
オブジェクト名 非表示シート名 Caption 非表示シート名 |
オブジェクト名 表示操作 Caption 非表示OFF |
Gotoでジャンプするコードを組み立てる
ユーザーフォームモジュールへイベントコードを記述していきます。
変数の宣言
記述の先頭で、変数の宣言を行います。変数をモジュールレベルとします。
Dim UVS, ANSa, ANSb, ANSc, ANSd, MsUV
Dim ws As Worksheet
Dim FL As Boolean, key1 As Boolean
Dim WSN(1 To 500)
Dim i As Long, s As Long, Va As Long, Vb As Long
Dim TYPa As String, TYPb As String
変数の宣言をする場所で、変数の有効範囲を替えることが出来ます。
こちらの「エクセルVBA 変数の適用範囲を宣言方法でコントロールする」の記事を参考にしてください。
Frame1のイベントコード
「Frame1」がダブルクリックされたときにイベントを発生させます。クリックされたときにkey1をTrueにします。
Private Sub Frame1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
key1 = True
End Sub
CheckBox「強化保護」のイベントコード
クリックをしたかどうかの条件分岐を行います。
key1がTrueでなければ、プロシージャーを実行しません。
Private Sub 強化保護_Click()
TYP = “”
If key1 = False Then
強化保護.Value = False
Exit Sub
Else
If 強化保護.Value = True Then
TYPa = xlSheetVeryHidden
TYPb = xlSheetVisible
Else
TYPa = xlSheetHidden
TYPb = xlSheetVisible
End If
End If
End Sub
コマンドボタン「非表示シート名」のイベントコード
非表示には「VeryHidden」と「Hidden」の2種類がありますのでその両方で調べます。
ここでは「Frame1」のイベントの発生とは無関係にします。
Private Sub 非表示シート名_Click()
MsUV = “”
UVS = “”
For Each ws In Worksheets
If ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
MsUV = ws.Name
UVS = UVS & MsUV & “ を非表示中です。” & vbCrLf
End If
Next ws
MsgBox UVS, vbOKOnly + vbInformation, “非表示チェック”
End Sub
「For Each~Next」の使い方については、
「VBA 回数不定のループ処理はDo LoopとFor Each」を参考にしてください。
「If条件文」の使い方については、
「エクセルVBA 「If条件文」を最速に理解。条件の絞り方」を参考にしてください。
トグルボタン「表示操作」のイベントコード
少々混み入っていますので、順番に区切って説明します。
Private Sub 表示操作_Click()
If key1 = False Then
Exit Sub
「Frame1」のイベントが発生しなければこのプロシージャーを終了させます。
Va = 0
Vb = 0
For Each ws In Worksheets
If ws.Visible = True Then
Va = Va + 1
ElseIf ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
Vb = Vb + 1
End If
Next ws
「表示シート」数と「非表示シート」数をカウントします。
MsgBox “表示シート数が1つでは非表示機能は使えません。”, vbOKOnly + vbExclamation, “非表示警告”
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = False
Exit Sub
End If
シート数が1枚のみ表示のエクセルBOOKの設定の場合、エクセルの仕様で非表示にはできません。
アラートウインドウを出してこのプロシージャーを終了します。
メッセージボックスの使い方については、こちらが参考になります。
「メッセージボックス MsgBox実際の使い方を最速に理解」
MsgBox “非表示にできる最大シート数に達しました。” & vbCrLf & “これ以上は不可能です。”, vbOKOnly + vbExclamation, “非表示警告”
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
ANSd = MsgBox(“非表示を解除しますか?”, vbYesNo, “確認”)
If ANSd = vbYes Then
For s = 1 To Worksheets.Count
Worksheets(s).Visible = True
Next s
MsgBox “シートはすべて表示します。” & vbCrLf & “シートの非表示はありません。”, vbOKOnly, “非表示”
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = Fals
Exit Sub
Else
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
key1 = False
Exit Sub
End If
End If
「非表示シート」が最大数(全シート数ー1)になった時の処理です。
If 強化保護.Value = True Then
TYPa = xlSheetVeryHidden
TYPb = xlSheetVisible
Else
TYPa = xlSheetHidden
TYPb = xlSheetVisible
End If
チェックボックス「強化保護」がクリックされた時、されなかった時のコードです。
If シート表示.表示操作 = True Then
GoTo step1
stepA:
Va = 0
Vb = 0
For Each ws In Worksheets
If ws.Visible = True Then
Va = Va + 1
ElseIf ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
Vb = Vb + 1
End If
Next ws
If Worksheets.Count – Vb = 1 Then
MsgBox “非表示にできる最大シート数に達しました。” & vbCrLf & “これ以上は不可能です。”, vbOKOnly + vbExclamation, “非表示警告”
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
key1 = False
Exit Sub
End If
FL = False
For i = 1 To Worksheets.Count
WSN(i) = Worksheets(i).Name
If WSN(i) = UVS Then
FL = True
GoTo stepB
End If
Next i
If~GotoでstepAに飛んできたときの処理です。
非表示にできるシート数が残っているかを区別し、
- 残っていなければ、プロシージャーを終了します。
- 残っていれば、エクセルBOOKにその「シート名」があるかを調べ、あればstepBに飛びます。
Gotoステートメントの基本的な使い方については、
「Gotoステートメントの利用法を最速に理解。毒コードと薬コード」を参考にしてください。
If FL = False Then
ANSc = MsgBox(UVS & “シートは存在しません!!” & vbCrLf & ” 続けますか?”, vbYesNo, “確認”)
If ANSc = vbYes Then
GoTo step1
Else
For Each ws In Worksheets
If ws.Visible = False Then
MsUV = ws.Name
End If
Next ws
If MsUV = “” Then
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = False
Exit Sub
Else
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
key1 = False
Exit Sub
End If
End If
End If
その「シート名」がエクセルBOOKになかった時の処理です。更に条件分岐で、
「YES」操作を続ける場合は、If~Gotoでstep1に戻します。「NO」の場合は終了します。
mymsg1 = “非表示にするシート名を入力”
mytitle1 = “非表示シート”
UVS = Application.InputBox(prompt:=mymsg1, Title:=mytitle1, Type:=2)
If UVS = “” Then
ANSa = MsgBox(“終了しますか?”, vbYesNo, “確認”)
If ANSa = vbYes Then
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = False
Exit Sub
Else
GoTo step1
End If
ElseIf UVS = False Then
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = False
Exit Sub
Else
GoTo stepA
Worksheets(UVS).Visible = TYPa
MsgBox UVS & “シートを非表示にしました!!”, vbOKOnly, “非表示”
ANSb = MsgBox(“他に非表示にするシートがありますか?” & vbCrLf & ” 続けますか?”, vbYesNo, “確認”)
If ANSb = vbYes Then
GoTo step1
Else
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
key1 = False
Exit Sub
End If
End If
If~GotoでstepBに飛んできたときの処理です。
入力した「シート名」を非表示にします。続ける場合はstep1に戻ります。
For s = 1 To Worksheets.Count
Worksheets(s).Visible = True
Next s
MsgBox “シートはすべて表示します。” & vbCrLf & “シートの非表示はありません。”, vbOKOnly, “非表示設定”
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
key1 = False
End If
End If
End Sub
トグルボタンを「ON」から「OFF」にした時のコードです。
ユーザーフォームを表示するためのVBA
シートモジュールに記述するコード
Sheet1のシートモジュールに記述します。
Bookのシートの表示状態を調べて、トグルボタンの状態を設定します。
Private Sub Worksheet_Activate()
If シート表示.Visible Then Exit Sub
シート表示.Show vbModeless
Dim ws As Worksheet
Dim MsUV As Variant
For Each ws In Worksheets
If ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
MsUV = ws.Name
End If
Next ws
If MsUV = “” Then
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
Exit Sub
Else
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
Exit Sub
End If
End Sub
ブックモジュールに記述するコード
ThisWorkbookのブックモジュールに記述します。
Private Sub Workbook_Open()
If シート表示.Visible Then Exit Sub
シート表示.Show vbModeless
Dim ws As Worksheet
Dim MsUV As Variant
For Each ws In Worksheets
If ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
MsUV = ws.Name
End If
Next ws
If MsUV = “” Then
シート表示.表示操作 = False
シート表示.表示操作.Caption = “非表示OFF”
シート表示.表示操作.BackColor = &H8000000F
Exit Sub
Else
シート表示.表示操作.Caption = “非表示ON”
シート表示.表示操作.BackColor = &H80000010
Exit Sub
End If
End Sub
VBAコード組み立てのまとめ
シートモジュールに記述するコード
ブックモジュールに記述するコード
ユーザーフォームモジュールのイベントコードコード全体はこのようになります。
色枠はそれぞれの「If条件文」の範囲です。
「メッセージボックス」でY・Nのボタンを作るごとに分岐処理が増えてきます。
YES/NOの分岐を減らせば階層も深くなり過ぎずにコードを組み立てることが出来ると思います。
どこまで細かく選択条件を作るか、これは、利用者側の使い勝手にもかかわる部分になってくると思います。
作る側としては、判断が迷う部分にもなります。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAを独学で習得するためのポイントは?良書との出会いは重要
エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。
エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。
このテーマの最初の記事に戻るにはこちら↓になります。
無料DL!エクセルシートの非表示ソフト。VBAで簡単ボタン操作
業務効率を上げて行くのにエクセルVBAを使って、始めのうちに知っておきたい内容を纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。