エクセルVBA Gotoで移動!シート非表示ソフトのコード解説

sheethiddeneyecatch003

エクセルVBAのIf~Gotoで処理分岐します。シート非表示VBAソフトのコードの紹介です。

コントロールのイベント処理は、間違い防止のため、条件付き実行にしています。

 

今回は、エクセルシート非表示VBAソフトのコードの説明を行います。

こんにちは、じゅんぱ店長(@junpa33)です。

 

Gotoステートメントは、多用するとコードの流れが複雑で訳が分からなってしまう事もあります。

Gotoの使用は、コードの可読性も悪くなりバグの発生や発見についても非常に不利に働く可能性が高くなります。

そのため、あまり使わないようにするというのが共通認識です。

しかし敢えて、

今回は敢えて作ってみました。Gotoの多用でコードがビュンビュン飛んでいます。If条件文で分岐もいっぱいです。

何の参考にもならないという話もありますが、そこはチャレンジ精神で作ってみました。

基本、Gotoを標準モジュールを使う場合は、コードを書くごとに「ステップイン」でチェックしながら行うのが吉です。

(今回の場合はイベントですので使えません。)

 

プチなVBAコードシリーズは他にこのようなもの↓があります。

「プチなVBAコード」の記事一覧を開く

 

シート非表示VBAソフト作成のコンセプト

 

  • 条件分岐のコードはGotoでジャンプで移動処理していきます。
  • ソフトの起動にはイベントで鍵を付けます。
  • 今あるエクセルファイルにも導入できるようなツール的ソフトにします。
  • 多種多様なシート名にも使えるようにします。
  • 「非表示解除できるタイプと出来ないタイプ」の2種類の非表示にも対応します。
  • ユーザーフォームからの操作で、VBAコードの記述はフォームモジュールだけにします。
  • コンパクトに納めるため、このソフト用のための、新たなシート、標準モジュールを使いません。

 

ユーザーフォームにコントロールを配置します

 

このユーザーフォームを作ります。

sheethidden007

ユーザーフォーム全体にコントロールの「フレーム」を敷いています。

コントロールの配置

 

sheethidden008

 

他にチェックボックスの名称「強化Ver.」はラベルで作成しています。

 

UserForm

sheethidden009

①Frame1

sheethidden010

④CheckBox

sheethidden011

オブジェクト名 シート表示 オブジェクト名 Frame1
Caption (空欄)
オブジェクト名 強化保護
Caption (空欄)

 

②コマンドボタン

sheethidden012

③トグルボタン

sheethidden012

オブジェクト名 非表示シート名
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」のイベントが発生しなければこのプロシージャーを終了させます。

 

Else
  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 Va = Worksheets.Count And Va = 1 Then
    MsgBox “表示シート数が1つでは非表示機能は使えません。”, vbOKOnly + vbExclamation, “非表示警告”
    シート表示.表示操作 = False
    シート表示.表示操作.Caption = “非表示OFF”
    シート表示.表示操作.BackColor = &H8000000F
    key1 = False
  Exit Sub
  End If

シート数が1枚のみ表示のエクセルBOOKの設定の場合、エクセルの仕様で非表示にはできません。

アラートウインドウを出してこのプロシージャーを終了します。

メッセージボックスの使い方については、こちらが参考になります。

メッセージボックス MsgBox実際の使い方を最速に理解

 

  If Worksheets.Count – Vb = 1 Then
    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

チェックボックス「強化保護」がクリックされた時、されなかった時のコードです。

 

MEMO

一次元配列変数の使い方について詳しくはこちらです。

エクセルVBA 1次元配列変数の利用法を最速に理解

 

  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に飛んできたときの処理です。

非表示にできるシート数が残っているかを区別し、

  1. 残っていなければ、プロシージャーを終了します。
  2. 残っていれば、エクセル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」の場合は終了します。

 

step1:
  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
If~Gotoでstep1に飛んできたときの処理です。
インプットボックスで非表示にするシート名を入力させます。
「空欄」・「NO」・「シート名」の場合に処理が分岐されます。
「シート名」が入力された場合のみstepAに飛びます。
stepB:
      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に戻ります。

  ElseIf シート表示.表示操作 = False Then
    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コード組み立てのまとめ

 

シートモジュールに記述するコード

sheethidden016

 

ブックモジュールに記述するコード

sheethidden017

 

 

 

ユーザーフォームモジュールのイベントコードコード全体はこのようになります。

sheethidden013a

色枠はそれぞれの「If条件文」の範囲です。

sheethidden015b

「メッセージボックス」でY・Nのボタンを作るごとに分岐処理が増えてきます。

YES/NOの分岐を減らせば階層も深くなり過ぎずにコードを組み立てることが出来ると思います。

どこまで細かく選択条件を作るか、これは、利用者側の使い勝手にもかかわる部分になってくると思います。

作る側としては、判断が迷う部分にもなります。

 

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAを独学で習得するためのポイントは?良書との出会いは重要

 

エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。
エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

 

このテーマの最初の記事に戻るにはこちら↓になります。

無料DL!エクセルシートの非表示ソフト。VBAで簡単ボタン操作

 

業務効率を上げて行くのにエクセルVBAを使って、始めのうちに知っておきたい内容を纏めています。

「VBA最速理解」の記事一覧を開く

 

今回の記事はここまでです。   最後までご覧いただき有難うございました。

 

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません