Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3702 / 13646 ツリー ←次へ | 前へ→

【60599】オートフィルター こまつ 09/3/4(水) 11:39 質問[未読]
【60600】Re:オートフィルター Jaka 09/3/4(水) 11:46 発言[未読]
【60601】Re:オートフィルター Jaka 09/3/4(水) 11:54 発言[未読]
【60603】Re:オートフィルター こまつ 09/3/4(水) 15:19 質問[未読]
【60605】Re:オートフィルター Jaka 09/3/4(水) 15:41 発言[未読]
【60606】Re:オートフィルター こまつ 09/3/4(水) 16:04 質問[未読]
【60607】Re:オートフィルター Jaka 09/3/4(水) 16:15 発言[未読]
【60608】Re:オートフィルター こまつ 09/3/4(水) 16:38 お礼[未読]
【60609】Re:オートフィルター こまつ 09/3/4(水) 19:54 お礼[未読]
【60610】Re:オートフィルター Jaka 09/3/5(木) 9:27 発言[未読]
【60619】Re:オートフィルター こまつ 09/3/5(木) 11:37 質問[未読]
【60627】Re:オートフィルター Jaka 09/3/5(木) 16:40 発言[未読]
【60632】Re:オートフィルター こまつ 09/3/5(木) 20:07 お礼[未読]

【60599】オートフィルター
質問  こまつ  - 09/3/4(水) 11:39 -

引用なし
パスワード
   Sub 空コード抽出_Click()
  Rows("1:1").Select
  Selection.AutoFilter
  Selection.AutoFilter Field:=2, Criteria1:="="
  Range("B2").Select
End Sub

上記の文はオートフィルターが設定されていない場合のみ有効に
働きます。

オートフィルターが既に設定されている状態で実行しても、
なにもしてくれません。

IF文で、オートフィルターが設定されていなければ、
Rows("1:1").Select
  Selection.AutoFilter
Selection.AutoFilter Field:=2, Criteria1:="="
  Range("B2").Select

設定されていれば、
Selection.AutoFilter Field:=2, Criteria1:="="
  Range("B2").Select

というような事はできないでしょうか?

もしくは、他に良案があればお願いします。

【60600】Re:オートフィルター
発言  Jaka  - 09/3/4(水) 11:46 -

引用なし
パスワード
   ▼こまつ さん:
>Sub 空コード抽出_Click()
>  Rows("1:1").AutoFilter Field:=2, Criteria1:="="
>  Range("B2").Select
>End Sub
これだけですむと思いますけど。
ただ、行で指定した場合うまく行かない場合があったので、
Range("A1").AutoFilter・・・
明確に指定した方が良いと思います。
(明細の左に当たる部分1つ。)

【60601】Re:オートフィルター
発言  Jaka  - 09/3/4(水) 11:54 -

引用なし
パスワード
   あ、そうかすでに抽出してある状態ということですね。

目安箱
【160】オートフィルタ解除とずべて表示
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=160;id=FAQ


【60603】Re:オートフィルター
質問  こまつ  - 09/3/4(水) 15:19 -

引用なし
パスワード
   ▼Jaka さん:
ありがとうございます。

行でオートフィルターをしていたのを、range("A1")でオートフィルターしたところ
妥協していますが、欲しい結果に近いものが得られました。

もうひとついいでしょうか?
Sub データ削除_Click()
  
'IF オートフィルターが掛かっていたら、
'MsgBox "削除できません。オートフィルターを解除してください。"
  
Application.ScreenUpdating = False
Range("A1").CurrentRegion.Offset(1, 1).Select
  Selection.ClearContents
On Error GoTo ErrorTrap
  Selection.QueryTable.Delete
  Range("B2").Select
  MsgBox "削除完了"
Exit Sub   ' プロシージャを抜け出る。
ErrorTrap:
  Resume Next  ' エラー発生行の次から実行
Application.ScreenUpdating = True
End Sub

【質問内容】
オートフィルターが掛かっていた場合は、削除できなくしたいのです。
どのように書いたらいいでしょうか?

【60605】Re:オートフィルター
発言  Jaka  - 09/3/4(水) 15:41 -

引用なし
パスワード
   >オートフィルターが掛かっていた場合は
これの意味が微妙なんですが、フィルタモードになっているかどうか知りたいのか、
または、
フィルタモード中のどれか1列が抽出状態になっているのを知りたいのかでコードが変わってきます。
上で書いた目安箱を見ていただければ、応用が利くんじゃないかと思います。
(説明文書いてないけど。)

【60606】Re:オートフィルター
質問  こまつ  - 09/3/4(水) 16:04 -

引用なし
パスワード
   ▼Jaka さん:
>>オートフィルターが掛かっていた場合は
>これの意味が微妙なんですが、フィルタモードになっているかどうか知りたいのか、
>または、
>フィルタモード中のどれか1列が抽出状態になっているのを知りたいのかでコードが変わってきます。
>上で書いた目安箱を見ていただければ、応用が利くんじゃないかと思います。
>(説明文書いてないけど。)

フィルターモードの抽出状態だった場合にデータ削除をさせたくないのです。
目安箱のプログラムは拝見致しましたが、まだ理解できておりません。

宜しくお願いします。

【60607】Re:オートフィルター
発言  Jaka  - 09/3/4(水) 16:15 -

引用なし
パスワード
   すみません。
勘違いしていたようです。
って、もう返信が入ってますが。

フィルターモードの抽出状態
MsgBox ActiveSheet.FilterMode

フィルター状態になっているかなっていないか。
Dim aa As Variant
On Error Resume Next
aa = ActiveSheet.AutoFilter.Range.Address
If Len(aa) = 0 Then
  MsgBox "普通の状態(フィルタの影も形もない状態"
Else
  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
End If

【60608】Re:オートフィルター
お礼  こまつ  - 09/3/4(水) 16:38 -

引用なし
パスワード
   ▼Jaka さん:
>すみません。
>勘違いしていたようです。
>って、もう返信が入ってますが。
>
>フィルターモードの抽出状態
>MsgBox ActiveSheet.FilterMode
>
>フィルター状態になっているかなっていないか。
>Dim aa As Variant
>On Error Resume Next
>aa = ActiveSheet.AutoFilter.Range.Address
>If Len(aa) = 0 Then
>  MsgBox "普通の状態(フィルタの影も形もない状態"
>Else
>  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
>End If
こちらこそ、説明がうまくなく申し訳ないです。
ありがとうございます!!
欲しい結果が得られました。
まだ内容は理解できておりませんが・・・。

感謝します。

【60609】Re:オートフィルター
お礼  こまつ  - 09/3/4(水) 19:54 -

引用なし
パスワード
   ▼Jaka さん:
>すみません。
>勘違いしていたようです。
>って、もう返信が入ってますが。
>
>フィルターモードの抽出状態
>MsgBox ActiveSheet.FilterMode
>
>フィルター状態になっているかなっていないか。
>Dim aa As Variant
>On Error Resume Next
>aa = ActiveSheet.AutoFilter.Range.Address
>If Len(aa) = 0 Then
>  MsgBox "普通の状態(フィルタの影も形もない状態"
>Else
>  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
>End If

上記内容の理解ができました!!
オートフィルタの設定されているアドレスの文字数が0なら、
オートフィルタがなく、0以外なら、設定されていると、
条件分岐してるのですね。

ご丁寧に教示頂き感謝致します。

【60610】Re:オートフィルター
発言  Jaka  - 09/3/5(木) 9:27 -

引用なし
パスワード
   >上記内容の理解ができました!!
>オートフィルタの設定されているアドレスの文字数が0なら、
>オートフィルタがなく、0以外なら、設定されていると、
>条件分岐してるのですね。
今回は、そうして見ましたけど。
こういうエラートラップでも良いし、
エラートラップのやり方は色々あるので、好みで...。
覚えておくと他にも応用が利きます。

1、
Dim aa As Range
On Error Resume Next
Set aa = ActiveSheet.AutoFilter.Range
If aa Is Nothing Then
  MsgBox "普通の状態(フィルタの影も形もない状態"
Else
  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
End If
Set aa = Nothing

2、
Dim aa As Range
On Error Resume Next
Set aa = ActiveSheet.AutoFilter.Range
Set aa = Nothing
If Err Then
  MsgBox "普通の状態(フィルタの影も形もない状態"
Else
  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
End If

【60619】Re:オートフィルター
質問  こまつ  - 09/3/5(木) 11:37 -

引用なし
パスワード
   ▼Jaka さん:
>>上記内容の理解ができました!!
>>オートフィルタの設定されているアドレスの文字数が0なら、
>>オートフィルタがなく、0以外なら、設定されていると、
>>条件分岐してるのですね。
>今回は、そうして見ましたけど。
>こういうエラートラップでも良いし、
>エラートラップのやり方は色々あるので、好みで...。
>覚えておくと他にも応用が利きます。
>
>1、
>Dim aa As Range
>On Error Resume Next
>Set aa = ActiveSheet.AutoFilter.Range
>If aa Is Nothing Then
>  MsgBox "普通の状態(フィルタの影も形もない状態"
>Else
>  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
>End If
>Set aa = Nothing
>
>2、
>Dim aa As Range
>On Error Resume Next
>Set aa = ActiveSheet.AutoFilter.Range
>Set aa = Nothing
>If Err Then
>  MsgBox "普通の状態(フィルタの影も形もない状態"
>Else
>  MsgBox "フィルタ状態(シートに三角ボタンがある状態)"
>End If

ありがとうございます!!
上記1、2の方が私にはわかり易いかもしれないです。

最後に一つだけいいでしょうか?
最終的にaaを開放してると思うのですが、開放しないと後々まずいのでしょうか?
初歩的な質問ですいません。

【60627】Re:オートフィルター
発言  Jaka  - 09/3/5(木) 16:40 -

引用なし
パスワード
   ブックの場合、解放しないとエクセルが掴んだままの時があるって、
前に見たことがあるので、解放した方が良いのでは。
メモリ上で、どうなるのか解りませんけど、きっぱりと断ち切った方が
気分的にも良いですし。

自分の部屋のことを棚に上げると、きちんと後始末をした方が良いのでは。

【60632】Re:オートフィルター
お礼  こまつ  - 09/3/5(木) 20:07 -

引用なし
パスワード
   ▼Jaka様
なるほど。
もう少し調べてみます。
ありがとうございました!!

3702 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free