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にしろ、
フィルター状態だとうまく張り付かないことにはご注意ください。
必ずフィルターをクリアしてから実行しましょう。