• 締切済み

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

タイトル通りですが、選択範囲の中を 単にEach でループすると 隠れている部分のCellまでみているようです。 フィルターで表にある部分だけを対象に処理はできないものでしょうか? Excel2003 SP3 Windows XP SP3

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 オートフィルタの位置がはっきりしていないのですが、確か、前回では、単に、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
質問者

補足

データが大量なので入れ物はAccessにしています。 入力もAccessにしようと思ったのですが、Excel の方がオートフィルターとかフィルとか補助機能が 充実しているのでこちらにしてくれ、ということに なりました。 とりあえず、データの開始行から終了行までを ループし変更フラグの立っている行でIDをフィルタ にしたSQLで全列を書き換えています。 IDのない行は新規ということでaddnewしています。 ばたばたしていて教えていただソースみれていませんが、 これから試させていただきたいと思います。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 前回の質問も見ていましたが、最終的に何をしたいのでしょうか? テクニックだけを聞いても、最後まで詰め切れないなら、また、別の疑問が出てきてしまいます。 >Filterがかかっている状態でさらに選択している範囲の行番号を取得したい ワークシート上で、それぞれの行番号というような、数値を取得するようなことは、めったにありませんし、その数値で、ひとつずつコピーでもするのでしょうか?一般的に、必要なものは、あくまでも、行やRange のオブジェクトはずです。 それと、前回の質問からすると、フィルタではなくて、AutoFilter のことのようです。フィルターというのは、オートフィルタ、フィルタ・オプション、リストなどに存在します。フィルタとオートフィルタでは、シート・プロパティが違います。 >隠れている部分のCellまでみているようです。 AutoFilter.Range で、確かに、それぞれループすれば、隠れているセルまで見るけれども、それで、どうするかが問題です。まさか、c.Hidden =True と判定する必要もないと思うのです。 例えば、コピーするなら、1行目のタイトル行(フィールド行)を抜けば、Copy して、Paste すれば、隠れている行は省かれます。(ただし、Excelが故障しているのか、トラブルがある場合は別です) 最終行の取り方はもう回答が出ているはずですから、上部の左端のひとつ下を選択して、その二点を、Rangeで囲めば、それで範囲は取れます。隠れているセルは無視されます。

tss_jp
質問者

補足

材料の加工先の振り分けをしているのですが、 加工先によって対応可能不可能があります。 まず、加工先でフィルターをかけ、その中か らさらに材料を選択しています。納期とか その他の条件で選択行に値を設定しています。 最終的にMDBに書き込みたいのですが、その際に 変更のあった行のみを書き込みたいのですが、 変更のあった行のみA列にフラグたてようとして います。

すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

>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