和風スパゲティのレシピ

日本語でコーディングするExcelVBA

14本目:社外秘シート削除

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:社外秘シート削除

#VBA100本ノック 14本目
客先へ送付するブックを作成します。
シート名に「社外秘」の文字が含まれるシートを削除してください。
他のシートは計算式を消して値だけにしてください。
※シート間参照の数式あり。
※条件付き書式・入力規則は未使用。
※対象はアクティブブックで構いません。

社外秘シートサンプル

◇ 出題ページはこちら

ソースコード

メインモジュール

Option Explicit

' 100本ノック014:社外秘シート削除
Sub 社外秘シートを削除して全シートの数式を値にする()
        
    Dim wb対象ブック As Workbook
    Set wb対象ブック = ActiveWorkbook
    Dim シート As Object ' ← グラフシート用にWorksheet型にしない
    
    
    ' 非表示シートがひとつでもあれば実行しない仕様とする
    For Each シート In wb対象ブック.Worksheets
        If シート.Visible <> True Then
            MsgBox "非表示シートがあるブックには実行できません。"
            Exit Sub
        End If
    Next
    
    ' 社外秘シートを削除(グラフシート含む)
    For Each シート In wb対象ブック.Sheets
        If InStr(シート.Name, "社外秘") > 0 Then
            Application.DisplayAlerts = False
            シート.Delete
            Application.DisplayAlerts = True
        End If
    Next
    
    ' 関数を切って値に
    For Each シート In wb対象ブック.Sheets
        Call フィルターをクリアする(シート)
        シート.UsedRange.Copy
        シート.UsedRange.Cells(1).PasteSpecial Paste:=xlPasteValues
    Next
    
    ' A1セルを選択して第1シートを表示
    For Each シート In wb対象ブック.Worksheets
        シート.Activate
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
        Range("A1").Select
    Next
    wb対象ブック.Sheets(1).Activate

End Sub

汎用関数モジュール

Option Explicit

' フィルターのクリア
' ◆ ブログ未掲載
Sub フィルターをクリアする(対象シート As Worksheet)
    If 対象シート.AutoFilterMode = True Then
        If 対象シート.AutoFilter.FilterMode = True Then
            対象シート.AutoFilter.ShowAllData
        End If
    End If
End Sub

解説

社外秘のシートを削除する問題でした。

処理自体は簡単ですが、本家神髄先生のページを見ると、
実務上の気遣いが出来るかどうかも大事な問題のようです。


ひとまず非表示シートは事故の元なので、
ひとつでも非表示シートがあれば実行できない仕様にしました。


あとはグラフシートが社外秘という罠にも一応対応しています。


コード上で注意すべき点としては、値貼り付けのコードです。

普段は.Value = .Valueで行うのですが、
データの規模が分からないためCopyメソッドを用いました。

.Valueは配列が大きすぎるとメモリ不足になりますので、
回数がそんなでもないならCopyメソッドを使用するのも手です。


あとはCopyにしろValueにしろ、
フィルター状態だとうまく張り付かないことにはご注意ください。

必ずフィルターをクリアしてから実行しましょう。