• 締切
  • すぐに回答を!

Filterがかかっている状態でさらに選択している範囲の行番号を取得したい

  • 質問No.5620535
  • 閲覧数225
  • ありがとう数0
  • 回答数3

お礼率 46% (21/45)

タイトル通りですが、選択範囲の中を 単にEach でループすると
隠れている部分のCellまでみているようです。

フィルターで表にある部分だけを対象に処理はできないものでしょうか?


Excel2003 SP3
Windows XP SP3

回答 (全3件)

  • 回答No.3

ベストアンサー率 57% (3570/6233)

こんにちは。

オートフィルタの位置がはっきりしていないのですが、確か、前回では、単に、A列からだったと思います。

>最終的にMDBに書き込みたいのですが、その際に変更のあった行のみを書き込みたいのですが、
ずいぶん、難しいことを考えていらっしゃるのですね。Excelから、この方式で、ADODBを使うなどしても、この状態からでは、かなり複雑になってしまいます。そうすると、回答者側も、そのレベルを維持できないままになってしまうことがあります。その目的ですと、たぶん、全体を書き換える必要があるかもしれません。

一旦、臨時のシートなどにコピーしてから、MDBに移すか、Access があれば、Access からインポートさせた方が楽なような気がします。

ただ、それは今回は質問外のことですから、Rangeオブジェクトを取得する部分もつけておきました。(★)一通りのエラー処理はしています。標準モジュールでもシートモジュールでも可能です。シートモジュールなら、ActiveSheet は必要ありませんが、With ステートメントを外さなくてはなりません。

コメントブロックの「'」が一つのものは解説です。
'-------------------------------------------
Sub Test1()
Dim c As Range
Dim i As Long
Dim sh As Worksheet
Dim sKENSAKU As String
''検索値
''=========================================
sKENSAKU = "B"  'セルからなら、= Range("F1").value 'とします。
''=========================================
  Set sh = ActiveSheet
  With sh
    'AutoFilter モードになっているかどうか、チェック
    '-------------------------------------------
    If .AutoFilterMode Then
      .ShowAllData
    End If
    If sKENSAKU = "" Then Exit Sub
    ''フラッグの削除
    .Range("A2").Resize(.AutoFilter.Range.Rows.Count - 1).ClearContents
    'Field:=2 B列を検索対象
    '誤動作する場合は、Range("A1:E200") やCurrentRegion を使う
    .Range("A1").AutoFilter Field:=2, Criteria1:=sKENSAKU
    '-------------------------------------------
    With .AutoFilter.Range
      ''検索値が見つからない場合
      If WorksheetFunction.Subtotal(3, .Columns(2)) = 1 Then
       MsgBox sKENSAKU & ":は見つかりません", vbExclamation
       Exit Sub
      End If
      For Each c In .Columns(1).SpecialCells(xlCellTypeVisible)
        i = c.Row
        If c.Row > 1 Then
          'True を書き込む
          c.EntireRow.Cells(1, 1).Value = True '同じ行ならどこの列でも可能
          '★以下は、フラグを抜いた行のオブジェクトの取得
          .Rows(i).Resize(, .Columns.Count - 1).Offset(, 1).Select
        End If
      Next c
    End With
  End With
End Sub
補足コメント
tss_jp

お礼率 46% (21/45)

データが大量なので入れ物はAccessにしています。
入力もAccessにしようと思ったのですが、Excel
の方がオートフィルターとかフィルとか補助機能が
充実しているのでこちらにしてくれ、ということに
なりました。

とりあえず、データの開始行から終了行までを
ループし変更フラグの立っている行でIDをフィルタ
にしたSQLで全列を書き換えています。

IDのない行は新規ということでaddnewしています。

ばたばたしていて教えていただソースみれていませんが、
これから試させていただきたいと思います。

ありがとうございます。
投稿日時:2010/01/30 13:51
  • 回答No.2

ベストアンサー率 57% (3570/6233)

こんばんは。

前回の質問も見ていましたが、最終的に何をしたいのでしょうか?

テクニックだけを聞いても、最後まで詰め切れないなら、また、別の疑問が出てきてしまいます。
>Filterがかかっている状態でさらに選択している範囲の行番号を取得したい

ワークシート上で、それぞれの行番号というような、数値を取得するようなことは、めったにありませんし、その数値で、ひとつずつコピーでもするのでしょうか?一般的に、必要なものは、あくまでも、行やRange のオブジェクトはずです。

それと、前回の質問からすると、フィルタではなくて、AutoFilter のことのようです。フィルターというのは、オートフィルタ、フィルタ・オプション、リストなどに存在します。フィルタとオートフィルタでは、シート・プロパティが違います。

>隠れている部分のCellまでみているようです。

AutoFilter.Range で、確かに、それぞれループすれば、隠れているセルまで見るけれども、それで、どうするかが問題です。まさか、c.Hidden =True と判定する必要もないと思うのです。

例えば、コピーするなら、1行目のタイトル行(フィールド行)を抜けば、Copy して、Paste すれば、隠れている行は省かれます。(ただし、Excelが故障しているのか、トラブルがある場合は別です)

最終行の取り方はもう回答が出ているはずですから、上部の左端のひとつ下を選択して、その二点を、Rangeで囲めば、それで範囲は取れます。隠れているセルは無視されます。
補足コメント
tss_jp

お礼率 46% (21/45)

材料の加工先の振り分けをしているのですが、
加工先によって対応可能不可能があります。


まず、加工先でフィルターをかけ、その中か
らさらに材料を選択しています。納期とか
その他の条件で選択行に値を設定しています。

最終的にMDBに書き込みたいのですが、その際に
変更のあった行のみを書き込みたいのですが、
変更のあった行のみA列にフラグたてようとして
います。
投稿日時:2010/01/25 01:37
  • 回答No.1

ベストアンサー率 50% (379/747)

>Filterがかかっている状態でさらに選択している
この選択状態の時に、下記のマクロを実行してください

Sub test()
Dim rng
Selection.SpecialCells(xlCellTypeVisible).Select
For Each rng In Selection
MsgBox rng.Address & "=" & rng.Value
Next rng
End Sub

以上参考まで
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ