VBAで特定のシート(7シート目)以降からセルに#REFのあるシートを見つけてそのシートを削除する方法がわかりません。
特定のシート名やセルならばis error関数を使えばできることは分かったのですがブック全体から探し出す方法はありますでしょうか?
7シート以降のシート数やシート名は固定ではありません。
どなたか教えて頂ければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
今回ぐらいの処理ならDo...LoopよりFor文の方が好みなのでFor文版を。
containsRefError
関数は中身が入っていないので適宜埋めてください。
vba
1Sub Sample() 2 3 ' 処理対象のブック 4 Dim targetBook As Excel.Workbook 5 Set targetBook = ThisWorkbook 'マクロの書かれているブック 6 'Set targetBook = ActiveWindow '最前面にあるブック 7 'Set targetBook = Workbooks.Item("ブックの名前") '特定の名前のブック 8 9 10 'シート一覧 11 '質問内容からワークシートのみと断定できなかったため、Sheetsプロパティを使用 12 Dim tgtSheets As Excel.Sheets 13 Set tgtSheets = targetBook.Sheets 14 15 Excel.Application.DisplayAlerts = False 16 17 '何シート目以降から処理をしたいか 18 Const SheetIndexLBound = 7 19 '末尾のシートから、SheetIndexLBound番目のシートまでループ 20 Dim sheetIndex As Long 21 For sheetIndex = tgtSheets.Count To SheetIndexLBound Step -1 22 23 If TypeOf tgtSheets.Item(sheetIndex) Is Worksheet Then 24 Dim ws As Excel.Worksheet 25 Set ws = targetBook.Sheets.Item(sheetIndex) 26 Else 27 '現在のシートがワークシート以外なら次へ 28 GoTo Continue 29 End If 30 31 'シートのセルに、REFのエラーが含まれていたら 32 If containsRefError(ws.UsedRange) Then 33 ws.Delete 34 End If 35 36Continue: 37 Next sheetIndex 38 39 Excel.Application.DisplayAlerts = True 40 41End Sub 42 43Function containsRefError(targetRng As Excel.Range) As Boolean 44 Dim refErr As Variant 45 refErr = CVErr(XlCVError.xlErrRef) 46 47 'TODO:targetRngにREFエラーが含まれているかどうか探す処理 48 49 '含まれている場合は 50 containsRefError = True 51 52 '含まれていない場合は 53 containsRefError = False 54 55 'とする 56End Function 57
投稿2018/07/23 12:25
総合スコア2166
0
それだとサンプルに書いている通り、任意のインデックスをアクティブにして、それを削除すればいいですよ。
Set ws = Sheets(i) 'インデックス番号からシートオブジェクト取得
ws.Activate '任意のシートをアクティブにする
If 判定式 Then
ActiveSheet.Delete 'アクティブシートの削除
wcnt = wcnt - 1 '削除した場合は上限ワークシート数を減らしておくこと
このあたりが、その処理になります。
投稿2018/07/23 03:04
総合スコア3635
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/23 08:37
2018/07/23 08:51
2018/07/23 09:03
2018/07/23 23:47
0
ベストアンサー
パターンを分けて検索してみたらいかがでしょうか?
任意のブックに対し、巡回処理を行う
1:- 任意のブックに対し、全シートを巡回する手順を調べる。
全てのシートをループして処理する方法
2:特定のシートから処理を行う方法を調べる。→各シートのインデックスを調べる。
シートのインデックス番号を取得する(Indexプロパティ)
今回は7シート目からという条件があるので、Foreach ではなく、Do while ~ Loopを使って、インデックスの初期値を7にしておくといいでしょう。
引き続き…
アクティブシート内の処理を行う。
3: 走査範囲を取得
4:判定文を作成
5:任意のシートを削除する。
3から5は大丈夫のようなので、1と2のアドバイスをするとこんな感じです。
これを応用(走査範囲が部分的じゃないので、ループ処理となります)すれば、いけると思います。
VBA
1Dim s As String 2Dim ws 3Dim i, wcnt, idx As Integer 4Application.DisplayAlerts = False 5wcnt = Worksheets.Count 'ワークシート数 6i = 7 '処理を行うシートのインデックス' 7Do While i <= wcnt 8 Set ws = Sheets(i) 'インデックス番号からシートオブジェクト取得 9 ws.Activate '任意のシートをアクティブにする 10 If 判定式 Then 11 ActiveSheet.Delete 12 wcnt = wcnt - 1 '削除した場合は上限ワークシート数を減らしておくこと 13 End If 14 i = i + 1 15Loop 16Application.DisplayAlerts = True 17End Sub
投稿2018/07/23 02:48
編集2018/07/23 02:50総合スコア3635
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/23 03:01
2018/07/23 03:06 編集
0
特定シートを対象とした方法が分かっているのなら、対象シートそれぞれについて、繰り返せば良いだけでは?
どこに困難があるのか分かりません。
投稿2018/07/23 02:05
総合スコア84555
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/23 23:45