[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『【VBA】フィルタ後の一行目のセルから値を取得したい』(あん)
VBAを勉強し始めたのですが分からない箇所があるため質問させてください。 4列目までが項目のタイトルで、5列目からレコードが記入されている表があります。 そこからオートフィルタで条件が絞られた後、絞られた条件の一番上の行(見た目上は5行目)の2列目のセルの値を変数Yに取得したいと思っています。
オートフィルタで絞る条件は毎回違うため 6行目 10行目 11行目… という風に表示されたり 8行目 9行目 11行目… と表示されたりとまちまちですが常に一番上の行から値を取得したいのです。
単純に5行目の2列目を取得しようとしたら無理でした。 変数に値を取得するときの記述方法を教えてください。 お願いします。
Y=Cells(5,2).Value こういう事ですか? (にん)
これだと普通に5行目2列目を取得してしまうのではないでしょうか? もしフィルタで5行目が表示されていなかったら取得できずにエラーになったりしませんかね? 実際の5行目2列目ではなくてフィルタがかかったあとの表示上の5行目2列目を取得したいのです。 フィルタがかかるので実際は何行目が上から5列目に表示されるかはそのとき次第ということです。 分かりにくかったり、 Y=Cells(5,2).Valueについてこちらが理解しきれていなかったらすみません。
標準モジュールに
'=============================================================== Option Explicit Sub test() Dim auf As AutoFilter Dim g0 As Long Dim rng As Range With ActiveSheet If .AutoFilterMode Then Set auf = .AutoFilter With auf.Range On Error Resume Next Set rng = .Range("a2").Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then MsgBox "フィルタ領域の1行目2列目のデータは " & rng.Cells(1, 2).Value End If On Error GoTo 0 End With End If End With End Sub
既にオートフィルタにてフィルタがかかっているシートをアクティブにした状態で 上記testを実行してみてください。
フィルターセル範囲の1行目2列目のデータを表示します。
ichinose
スレ主ではありませんが.... ichinoseさんのコードを オー!! これは便利 と使おうとした所 時々違う値を返すときが有るようです
A B C 4 朝食 昼食 夕食 5 ご飯 ヤキソバ ハンバーグ 6 パン 弁当 焼肉 7 卵 牛丼 カレー 8 ミルク サンドイッチ ラーメン 9 味噌汁 おにぎり すき焼き 10 ご飯 弁当 焼肉 11 ミルク おにぎり カレー
こういう表がありオートフィルタで、ミルクを絞り込むと
A B C 4 朝食 昼食 夕食 8 ミルク サンドイッチ ラーメン 11 ミルク おにぎり カレー
となった状態で >MsgBox "フィルタ領域の1行目2列目のデータは " & rng.Cells(1, 2).Value の場合 サンドイッチを返してくれます。これをチョっといじって ,,,,,,,,,,,, ,,,,,, >MsgBox "フィルタ領域の2行目3列目のデータは " & rng.Cells(2, 3).Value として カレー を返してほしかったのですが、なぜか すき焼き が返って来ます なぜでしょう? わたしの使い方がおかしいのでしょうか。お教え下さい 宜しくお願いします (ゴンタ)
>MsgBox "フィルタ領域の2行目3列目のデータは " & rng.Cells(2, 3).Value >として カレー を返してほしかったのですが、なぜか すき焼き が返って来ます >なぜでしょう? わかりやすい記述ですね!!
rng.Cells(1, 2).Value これで正常な値を返す場合は、あくまでも1行目だけなんです。 提示された例で検証すると、この状態で変数rngが取得しているセル範囲は、 $A$8:$C$8,$A$11:$C$11 rng.Cells(1, 2).Valueは、rng.areas(1).cells(1,2)と同じです。 一番目の領域 $A$8:$C$8に対して、1行目の2列目ですから、B8(サンドイッチ)の値を返しますが、
rng.Cells(2, 3).Valueとなると、rng.areas(1).cells(2,3)と同値ですから、 一番目の領域 $A$8:$C$8に対して、2行目の3列目ですから、C9(すき焼き)の値を返します。 (cells(x,y)は、親オブジェクトの範囲を超えたら、超えたセルアドレスを返します。)
作業シートを設けて、
Rng.Copy worksheets("作業シート").range("a1") 等とすれば、worksheets("作業シート").Cells(2,3).Value で取得できますけどね!!私なら、たぶんこれ、余り考えなくて良いから・・・。 作業シートを使わないとすると・・・、
Option Explicit '===================================================================== Sub test() Dim auf As AutoFilter Dim g0 As Long Dim rng As Range With ActiveSheet If .AutoFilterMode Then Set auf = .AutoFilter With auf.Range On Error Resume Next Set rng = .Range("a2").Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then MsgBox "フィルタ領域の2行目3列目のデータは " & get_find_rng(rng, 2, 3).Value End If On Error GoTo 0 End With End If End With End Sub '========================================================================= Function get_find_rng(rng As Range, rw As Long, col As Long) As Range Dim arng As Range Dim crng As Range Dim g0 As Long Set get_find_rng = Nothing g0 = 0 For Each arng In rng.Areas If rw <= arng.Columns(1).Rows.Count + g0 Then Set get_find_rng = arng.Columns(1).Cells(rw - g0, col) Exit For End If g0 = g0 + arng.Columns(1).Rows.Count Next End Function
ichinose
えっと。。。衝突しちゃったので この部分だけ。
フィルタがかかっている利点があまり無いですが 行の状態(表示か・非表示か)を見ながら 数えて行っても、目的のデータは得られそうに思います。
Sub 一行ずつ() Dim i As Long, cnt As Long With ActiveSheet If .AutoFilterMode Then With .AutoFilter.Range For i = 2 To .Count If Not .Rows(i).Hidden Then cnt = cnt + 1 If cnt = 2 Then '←ここが行 MsgBox .Cells(i, 3).Value Exit For '~ここが列 End If End If Next End With End If End With End Sub
ただ、これなら フィルタを利用せず 「A列が××って成っている2番目の行」 の様に指定して検索させた方が、はやいかも知れません。
簡単なのは、ichinoseさんが書いて居られる >作業シートに貼り付けて >worksheets("作業シート").Cells(2,3).Value と思います。
(HANA)
ichinoseさんHANAさん有難うございます。 どちらも希望どおり カレー が返って来ます コード中の >If .AutoFilterMode Then >ActiveSheet.AutoFilter.Range など、私にとっては初めて見る記述で、ステップインしながらイミディエイトウインドゥで なるほど〜 と頷いている所です。(いままでオートフィルタ状態の表をマクロで操作する事が無かったため) これから どんどん活用させていただきます。 スレ主の(あん)さん お邪魔しました (ゴンタ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.