人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

EXCELのVBAのある列をRange.Find("文字列").rowで行数を求める処理を作っています。
その文字列は処理対象の最終行をあらわすサインなのですがオートフィルタが設定された場合Findに引っかからなくなるようで困っています。

ActiveSheet.AutoFilterMode = False

でオートフィルタの解除は出来ると思ったら

ActiveSheet.AutoFilterMode = True

とは書けないといわれて困り果てています。
何かうまくオートフィルタを解除・設定(復活)する方法があれば教えてください。
あるいは最終行をもっとうまい方法で汎用性のある形で設定できる方法を教えていただけるのでもよいです。
よろしくお願いします。

●質問者: matttsu
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:Excel VBA うまい サイン フィルタ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● SALINGER
●20ポイント

AutoFilterは次のマクロで解除できると思います。

Sub test()
 If ActiveSheet.AutoFilterMode Then
 ActiveSheet.Range("A1").AutoFilter
 End If
End Sub
◎質問者からの返答

解除するのは上記の方法でもできたのですが…


2 ● devichan
●20ポイント

私が以前やっていたのですが、行数を以下のように求めていました


・必ず何かデータが入っている場所

→項番などがある場所

・ヌルもしくは空白をサーチ


これで、最終行を判断していました。

◎質問者からの返答

やはりそういう方法しかないのでしょうか…。空白は既にいくつもあるし項番は行が追加された場合に対応できないので避けたかったんですが。参考にします。ありがとうございます。


3 ● 黒ひよこ
●20ポイント

自分の場合は、間に空白セルが入る場合の最終行は、

SpecialCellsで最後のセルから取得していますね。

要するに次の通りです。

数値変数=シート.UsedRange.SpecialCells(xlCellTypeLastCell).Row


4 ● airplant
●50ポイント

フィルタ有効状態で、下記のどちらまでを対象にするかで違ってきます。

A.フィルタして見えている最終行まで

B.フィルタで見えなくなっていてもデータがあるところまで

B.の場合だけ、フィルタのオン/オフが必要です。

●サンプル

A.の場合

Range("C65535").End(xlUp).Row
'又は、
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

B.の場合

フィルターのオフはできますが、同じ条件で再度表示する方法はないようです。

再度フィルターをするしか無さそうです。

一度フィルター条件を消してから上記Aと同じ方法で最終行を持ってきます。

復活は条件を保存しておいて、再度条件を指定するしか無いようです。

AutoFilterオブジェクトとAutoFilterメソッドのヘルプをご覧ください。

'解除(条件は消える)
ActiveSheet.AutoFilterMode = False
'又は
Selection.AutoFilter  '設定されていることが分かっている場合

'設定(復活)
Range("A1").AutoFilter
'又は
Selection.AutoFilter
'以前の条件を残したままの解除と復活例(条件はCriteria1のみ、列は10個まで)
'解除
 Dim sSave(10) As Variant
 Dim objfilter, i As Integer
 i = 1
 For Each objfilter In ActiveSheet.AutoFilter.Filters
 If objfilter.On Then
 sSave(i) = objfilter.Criteria1
 End If
 i = i + 1
 Next
 ActiveSheet.AutoFilterMode = False

'設定(復活)selectionのところはRange("A1")でもOK。単一セルがselectされた状態であれば、どこでも関係なし
 Selection.AutoFilter
 For i = 1 To ActiveSheet.AutoFilter.Filters.Count
 If sSave(i) <> "" Then
 Selection.AutoFilter field:=i, Criteria1:=sSave(i)
 End If
 Next
◎質問者からの返答

なんかできそうな感じでかなり期待大で実行してみたんですが

Selection.AutoFilterで

実行時エラー '1004'

Range クラスの AutoFilter メソッドが失敗しました。

が出てしまいますねぇ…。


5 ● ardarim
●50ポイント

サンプルです。

Sub test()

 Dim af_range As Range
 Dim af_col As Long
 Dim af_criteria1 As String
 Dim af_criteria2 As String
 Dim af_operator As XlAutoFilterOperator

 Set af = ActiveSheet.AutoFilter

 If af Is Nothing Then
 Exit Sub
 End If

 Set af_range = ActiveSheet.AutoFilter.Range

 For i = 1 To af.Filters.Count
 With af.Filters(i)
 If .On Then
 af_col = i
 af_criteria1 = .Criteria1
 af_operator = .Operator
 If af_operator <> 0 Then
 af_criteria2 = .Criteria2
 End If
 End If
 End With
 Next i

 ActiveSheet.AutoFilterMode = False

 ' ここでオートフィルター解除後の処理を実行

 ' オートフィルター復元
 af_range.AutoFilter field:=af_col, Criteria1:=af_criteria1
 If af_operator <> 0 Then
 ActiveSheet.AutoFilter.Operator = af_operator
 ActiveSheet.AutoFilter.Criteria2 = af_criteria2
 End If
 
End Sub
◎質問者からの返答

やっぱりダメでした?。

af_range.AutoFilter field:=af_col, Criteria1:=af_criteria1

のところで

Range クラスの AutoFilter メソッドが失敗しました。

ですね。もうオートフィルタで一軒でもフィルタさせているとダメって言う処理に挫折しようかとしてます…。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ