Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
オートフィルタの直下の行番号の取得方法
投稿日時: 19/02/12 14:21:28
投稿者: taigernotora

オートフィルタで検索させた後の直下の行番号を値で取得する方法がありましたら教えてください。
 
Rows("1:1").Select
Selection.AutoFilter
ActiveSheet.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="田中"
 
上記のコードの後に、田中がいる先頭セルの行番号を変数に代入したいのですが、方法が思いつきません…。(例えば5行目に田中がいたら5の値を取得したいというものです。Offsetでできるかと思ったのですが、田中のいる行ではなく2行目の2が返ってきてしまいました…)
 
VBA初心者につき初歩的な質問かもしれませんが、どうぞよろしくお願いします。

回答
投稿日時: 19/02/12 16:57:51
投稿者: Suzu

こんにちは。
サンプルです。
 
Sub sample()
  Dim rng As Range
  Dim i As Long
 
  Range("A1").AutoFilter
  Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="田中"
  i = 0
  For Each rng In ActiveSheet.Range("B:B").SpecialCells(xlCellTypeVisible)
    i = i + 1
    If i = 2 Then MsgBox rng.address & vbTab & rng.Value2: Exit Sub
  Next
End Sub

投稿日時: 19/02/12 20:36:09
投稿者: taigernotora

サンプルコードありがとうございます。
大変参考にさせていただいたのですが、解を求めることができませんでした…
 
※補足
SpecialCells(xlCellTypeVisible)を用いて
i = Range("A1").Offset(1, 0).SpecialCells(xlCellTypeVisible).Row
でできないものかとやってみたのですができませんでした…

回答
投稿日時: 19/02/12 20:51:16
投稿者: ピンク

>田中がいる先頭セルの行番号を変数に代入したいのですが
AutoFilter は要らないのでは
Sub Test()
    MsgBox Application.Match("田中", Columns(2), 0)
End Sub

回答
投稿日時: 19/02/12 22:30:20
投稿者: WinArrow
投稿者のウェブサイトに移動

ピンク さんの引用:
>田中がいる先頭セルの行番号を変数に代入したいのですが
AutoFilter は要らないのでは
Sub Test()
    MsgBox Application.Match("田中", Columns(2), 0)
End Sub

 
横からごめんなさい。
Suzu さんの提案のコードをきちんと理解するようにしましょう。
おいしそうなところだけ・・・つまみ食いしても決しておいしくはない。
 

回答
投稿日時: 19/02/13 04:24:04
投稿者: もこな2

遅レスだけど私も考えてみるとというか、やってみたら案外難しかった・・・
なんか考え違いをしているのかも。

Sub サンプル()
    'Rows("1:1").Select   ←いらない
    'Selection.AutoFilter ←いらない

    Dim MyRNG As Range
    Dim tmp As Range, c As Long

    With ActiveSheet
        .Range("A1").AutoFilter Field:=2, Criteria1:="田中"

        Set MyRNG = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)

        '▼これでいけるとおもったが失敗(MyRNGに"B1,B4,B10"が入っているときになぜか"B2"が返る)
        If MyRNG.Count > 1 Then Debug.Print "失敗 " & MyRNG.Cells(2).Address(0, 0)

        '▼苦肉の策
        For Each tmp In MyRNG
            If c = 1 Then Exit For
            c = c + 1
        Next tmp
        Debug.Print "成功 " & tmp.Address(0, 0)

    End With
End Sub

ただ、実際に私も処理するなら、ピンクさんと同じように、オートフィルタの結果は使わないかも。

回答
投稿日時: 19/02/13 06:07:05
投稿者: simple

"田中"の位置を調べることが目的でオートフィルタを使っているなら、
ピンクさんの指摘があたっていますね。(私はそんな気がしています)
 
一方、一般的な話として、オートフィルタの結果を出発点にして、
最初の可視セルの行番号を得るという話なら、
こんな書き方もあるでしょう。
 

   (前略)
    Set rng = ActiveSheet.AutoFilter.Range
    Set body = Intersect(rng, rng.Offset(1))
    Debug.Print body.SpecialCells(xlCellTypeVisible).Row

変数はいずれもRange型です。

トピックに返信