プロが教える店舗&オフィスのセキュリティ対策術

EXCEL2013を使用しています。
B列に販売計画、C列に販売実績が表示されています。
B列の販売計画が0であり、かつC列の販売実績が0の商品の行をオートフィルターを使い非表示にするVBAを教えて下さい。

詳細は下記画像をご参照願います。
商品G、商品Iは販売計画と販売実績が0なのでオートフィルターを掛け非表示にしています。
他の商品はすべて表示したままです。

この操作をEXCEL VBAで実行するコードをご教授願います。
宜しくお願い致します。

「EXCELVBAを使用し、複数列に0があ」の質問画像

A 回答 (7件)

こんにちは!


色々やり方はあると思いますが、オートフィルタをご希望だというコトですので
一例です。

E列を作業用の列として使用しています。

Sub Sample1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range(Cells(2, "E"), Cells(lastRow, "E")).Formula = "=IF(AND(C2=0,D2=0),1,"""")"
Range("A1").AutoFilter field:=5, Criteria1:="<>1"
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
コードを貼り付け使用しました。
希望通り複数行に(C列、D列)に0のある行のみ非表示になりました。
E列に1を代入しない方法があればより良いです。

お礼日時:2015/08/10 22:47

これでいかがでしょうか?



標準モジュールに以下をコピペして下さい。
シート名などの指定はありませんでしたので、現在開いているシートで動作するマクロです。

Sub sample001()
'
Range("A1").AutoFilter Field:=3, Criteria1:=0
Range("A1").AutoFilter Field:=4, Criteria1:=0

End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
私の設定の仕方が悪いのか、複数行に(C列、D列)に0のある行のみ表示されてしまいます。

お礼日時:2015/08/10 22:49

すいません。


質問とは逆に両方0のみを表示になってました。
訂正します。

Sub sample001()
'
Range("A1").AutoFilter Field:=3, Criteria1:="<>0"
Range("A1").AutoFilter Field:=4, Criteria1:="<>0"


End Sub
    • good
    • 0
この回答へのお礼

ご回答の修正版ありがとうございました。
この方法で実行したのですが、0のある行すべてが非表示になってしまいます。

お礼日時:2015/08/10 22:52

私には、補助列なしでは、今の段階ではオートフィルタでは出来ませんでした。



この条件は「両列ともに、そのセルが0ではない」「片方の0は許す」ということですね。数式の部分を書き換えれば、いろんな応用が利きます。  "=OR(C2<>0,D2<>0)"

以下、ダブルクリック・イベントによる、抽出マクロです。
イベント・ドリブン型ではなく、ボタンにするなら、Target を、ActiveCell に書き換えて、ボタンのコード部分に入れてください。

シートタブを右クリックして、[コードの表示] をクリック
そして以下を貼り付けます。

データのある場所で、ダブルクリックすれば、ご希望通りなります。

もし、元に戻したければ、同じくデータのある所で、ダブルクリックすれば戻ります。クライテリアは、データのない所なら、任意の場所に可能ですが、記述は残しません。


'//
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Cancel = True
 Dim Rng As Range
 Dim mCrit As Range
 If Target.Value <> "" Then
  Set Rng = Target.CurrentRegion
  On Error Resume Next
  ThisWorkbook.Names("Criteria").Delete
  On Error GoTo 0
  'クライテリアは残りませんが、この場所がまずければ、別の場所を設けてください
  Set mCrit = Range("AA1:AA2") '必ず上下のセルが必要
 End If
 If ActiveSheet.FilterMode = False Then
  mCrit.Cells(2, 1).FormulaLocal = "=OR(C2<>0,D2<>0)"
  Rng.AdvancedFilter Action:=xlFilterInPlace, _
  CriteriaRange:=mCrit, Unique:=False
  mCrit.Clear 'クライテリアを消す
 Else
  Rng.AdvancedFilter 1, mCrit, , 0
 End If
End Sub
'///
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
初心者で知識がなく、うまく設定できませんでした。

お礼日時:2015/08/10 23:01

先の回答大変失礼致しました。



オートフィルタ機能では計算列を使用しない限り難しいようです。
行の非表示でも宜しければ、以下のコードで可能です。
非表示にする場合は、「Sub 非表示()」を
再表示したい場合は、「Sub 表示()」を実行して下さい。


Sub 非表示()
Dim n As Long, i As Long
n = Range("C:D").Find("*", , , , xlByRows, xlPrevious).Row
For i = 1 To n
If Range("C" & i) = "0" And Range("D" & i) = "0" Then
Rows(i).EntireRow.Hidden = True
End If
Next i
End Sub


Sub 表示()
Dim n As Long, i As Long
n = Range("C:D").Find("*", , , , xlByRows, xlPrevious).Row
For i = 1 To n
If Range("C" & i) = "0" And Range("D" & i) = "0" Then
Rows(i).EntireRow.Hidden = False
End If
Next i
End Sub
    • good
    • 0
この回答へのお礼

何度もご回答ありがとうございます。
非表示、表示とも、うまく機能しました。

お礼日時:2015/08/12 22:18

#4の回答者です。


>初心者で知識がなく、うまく設定できませんでした。
本来は、マクロがなくても十分に可能なのです。ご質問のご要望から、VBAにしたまでなのですが……。

添付画像では、波線の上は、今回のフィルターオプションの仕組みを書きました。
その下は、マクロの取り付け方です。(まず、シートタブを右クリックするところから始まります。左から右へ)それでも分からなかったら、マクロの入門編のサイトを探してください。
「EXCELVBAを使用し、複数列に0があ」の回答画像6
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございました。
図入りで分かりやすかったです。

お礼日時:2015/08/12 22:19

No.1です。



>E列に1を代入しない方法があればより良いです。
ということですので、No.5さんと同じようなやり方になりますが・・・
(今回はフィルタではありません)

Sub 非表示()
Dim c As Range, myRng As Range, myArea As Range
Dim myFirst As Range, myFound As Range
With ActiveSheet
Set myFound = .Range("C:C").Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = .Range("C:C").FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
For Each c In myRng
If c.Offset(, 1) = 0 Then
If myArea Is Nothing Then
Set myArea = c.Offset(, 1)
Else
Set myArea = Union(myArea, c.Offset(, 1))
End If
End If
Next c
If Not myArea Is Nothing Then
myArea.EntireRow.Hidden = True
End If
End If
End With
End Sub

※ 非表示を解除するコードも必要かと思います。
↓のコードを追加しておいてください。
(再表示のコードです)

Sub 再表示()
ActiveSheet.Rows.Hidden = False
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2015/08/12 22:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!