[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA もしセルが空白なら複数シート削除』(未知の世界)
いつもお世話になっております。
また躓いてしまいました。
【シート名】入力・シート1・シート2・シート3・シート4・シート5
のように6つのシートがあるとします。
【入力シート】A9,A11,A13,A15,A17のセルにある番号を記入していきます。
条件1。A11,A13,A15,A17のセルが空白なら、シート1のみ残す(シート2〜5はシート削除)
条件2。A13,A15,A17のセルが空白なら、シート2のみ残す(シート1,3,4,5はシート削除)
条件3。A15,A17のセルが空白なら、シート3のみ残す(シート1,2,4,5はシート削除)
条件4。A17のセルが空白なら、シート4のみ残す(シート1,2,3,5はシート削除)
条件5。A9,A11,A13,A15,A17セルが全部空白でなかったら、シート5のみ残す(シート1,2,3,4はシート削除)
Sub test()
Dim sh As Worksheet
Set sh = Worksheets("入力")
If sh.Range("A11", "A13", "A15", "A17") = "" Then Application.DisplayAlerts = False Worksheets(Array("シート2", "シート3", "シート4", "シート5")).Select ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True
ElseIf sh.Range("A13", "A15", "A17") = "" Then Application.DisplayAlerts = False Worksheets(Array("シート1", "シート3", "シート4", "シート5")).Select ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True
・
・
・
End Sub
など上のコードは途中ですが、うまくいきません。
セレクトケースの方がいいのかな?と思って
そっちでも自分なりに作ったのですがうまくいきません。
初心者で申し訳ありませんがどなたご教授お願い致します。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
不要なものを削除、必要なものを残す 2つの方法がありますが、前者で。 なお、「空白」とは、本当の空白という前提。(式などで "" になっている見かけの空白は空白とみなしません)
Sub Test() '指定シートを削除 Dim v As Variant Dim r As Range
With Sheets("入力")
If GetBlankCell(Range("A9,A11,A13,A15,A17")) = 0 Then v = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4") ElseIf GetBlankCell(Range("A11,A13,A15,A17")) = 4 Then v = Array("Sheet2", "Sheet3", "Sheet4", "Sheet5") ElseIf GetBlankCell(Range("A13,A15,A17")) = 3 Then v = Array("Sheet1", "Sheet3", "Sheet4", "Sheet5") ElseIf GetBlankCell(Range("A15,A17")) = 2 Then v = Array("Sheet1", "Sheet2", "Sheet4", "Sheet5") ElseIf IsEmpty(Range("A17")) Then v = Array("Sheet1", "Sheet2", "Sheet3", "Sheet5") End If
If IsArray(v) Then Application.DisplayAlerts = False On Error Resume Next Sheets(v).Delete On Error GoTo 0 Application.DisplayAlerts = True End If
End With
End Sub
Private Function GetBlankCell(r As Range) As Long Dim c As Range For Each c In r If IsEmpty(c) Then GetBlankCell = GetBlankCell + 1 Next End Function
(β) 2015/07/06(月) 17:00
残すべきシートを残すパターンもあげておきます。 GetBlankCell はアップ済みのものを使います。
Sub Test2() '残すシートを特定 Dim v As Variant Dim r As Range Dim sh As Worksheet Dim z As Variant
With Sheets("入力")
If GetBlankCell(Range("A9,A11,A13,A15,A17")) = 0 Then v = Array("入力", "Sheet5") ElseIf GetBlankCell(Range("A11,A13,A15,A17")) = 4 Then v = Array("入力", "Sheet1") ElseIf GetBlankCell(Range("A13,A15,A17")) = 3 Then v = Array("入力", "Sheet2") ElseIf GetBlankCell(Range("A15,A17")) = 2 Then v = Array("入力", "Sheet3") ElseIf IsEmpty(Range("A17")) Then v = Array("入力", "Sheet4") End If
If IsArray(v) Then Application.DisplayAlerts = False For Each sh In Worksheets If IsError(Application.Match(sh.Name, v, 0)) Then sh.Delete Next Application.DisplayAlerts = True End If
End With
End Sub
(β) 2015/07/06(月) 19:45
上の段のを入れてみました。思う通りに動きました!
下の段はまだ試していませんが、上の段がまだ理解できなくて少し教えてください(>_<)
・GetBlankCellというのは…?
・後、Private Functionのところを簡単でいいので、どうか教えてください。
調べても、なかなか理解できずに…すみませんがどうかお願いいたします。
(未知の世界) 2015/07/07(火) 11:41
たとえばシート関数に COUNTBLANK というものがありますね。領域の中の空白セルの数を求めます。 VBAでもこの関数は WorksheetFunction.CountBlank(Range(なんたら)) として使うことができるのですが 残念なことに、連続した領域指定しかできません。(今回のような とびとびの領域のチェックができない)
しょうがないので(?)複数とびとび領域指定可能な空白セルカウントの関数を自前で作りました。
それが、GetBlankCell という関数で、VBA内で GetBlankCell(複数領域) と書くことにより、 その領域内の空白の数を返します。このような関数を、ユーザー定義関数と呼びます。
今、Private Function GetBlankCell(・・・ と記述しましたが、Private を取り除いて Function GetBlankCell(・・・ と直しておけば、シート上で =GETBLANKCELL("A9,A11,A13") といった使い方もできます。 (できるはずです)
「ユーザー定義関数」あるいは「ファンクション プロシジャ」でネット検索すると、解説ページがたくさんでてきますので 是非、目を通しておいてください。
(β) 2015/07/07(火) 14:53
上記2つの検索ワードで検索してみて、今少しですが見てみました。
こちらの検索ワードを教えてくださり、とっっっっても助かります。
ぜひとも、時間あるときにいろんなところに目を通してみます。
本当にありがとうございました。<m(__)m>
(未知の世界) 2015/07/07(火) 16:11
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.