- ベストアンサー
フィルター後、可視セル一部データ参照 VBA
- Excel2003を使用しております。フィルターを掛けたあと、範囲を別シートにコピーするプログラムを組みましたが、一部分だけ持っておきたい場合、どのようにすれば良いか分からない。現在は全範囲選択してコピーしているが、やりたいことと違うため解決策を探している。
- テスト2の内容だけをコピーしてSheet2のA1に貼り付けることができるか分からない。現在はAとBを範囲指定してコピーし、テスト3も範囲指定してコピーしている。
- 可視セルの指定行(A2:?)の一部の可視セルを取り出したい。良いサイトや方法があれば教えてほしい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ご質問の内容が解釈しきれませんでしたので、以下の回答でヒントになるかわかりませんが。 No1でのURL内「サンプル 1」の説明になります。 >これのFilterRowが・・・…? 以下の箇所がご不明かとおもいます。 For Each FilterRow In Worksheets("Sheet1").Range("A1"). _ CurrentRegion.Resize(, 1).SpecialCells(xlVisible) (1)Worksheets("Sheet1").Range("A1").CurrentRegion Sheet1のA1セルのアクティブセル領域 (A1セルを選択後Ctrl+*(テンキー)をした範囲) →A1:B10 (2)Resize(, 1) (1)で対象とする範囲の行数をそのままに、列数を1に変更 →A1:A10 (3)SpecialCells(xlVisible) xlVisibleはSpecialCellsのヘルプファイルでいうとこのxlCellTypeVisibleであり、すべての可視セルになります。 AutoFilterでフィルターが適用されていますので可視セルの範囲が取得されます →A1、A3、A6、A7 For Eachで上記(3)で取得されたセルの数だけFilterRow(Rangeオブジェクトの変数)にセットしながら ループしますので、4周します。 FilterRow.Rowの 1週目Range("A1").Rowと同様であり、1が返ります 2週目Range("A3").Rowと同様であり、3が返ります 3週目Range("A6").Rowと同様であり、6が返ります 4週目Range("A7").Rowと同様であり、7が返ります この返り値が1以外(1は1行目のタイトル行なので除外している)の場合に MsgBox FilterRow.Row でフィルターで可視化された行番号を表示しています。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>全範囲選択してコピー…ということはやりたいことと違う そうすれば今フィルタされて見えてる範囲だけを抜き出してコピーできますが、それで一体何が問題なのかな? 少なくとも「可視セルを選んでコピー」とかは、まったく必要ありません。 今そもそも「何がしたい」のか、「言葉の説明」とか「サンプルマクロ」とかが全然ちぐはぐなんですが、想像すると… >たとえば、フィルター後の内容が : >とあったとして、テスト2の内容だけをコピーし >Sheet2のA1にコピーする sub macro1() range("A:D").autofilter field:=どこかの列, criteria1:=何かの条件 range("C2:C" & range("C65536").end(xlup).row).copy destination:=worksheets("Sheet2").range("A1") end sub のように「全体をコピー」すればご希望の通りになります。 騙されたと思って、まず一回実際にあなたのエクセルでやってみてください。
お礼
回答ありがとうございました。 やりたいことを考え直し、 もう一度質問をあげたいと思います。
補足
回答ありがとうございます。 色々と説明不足で申し訳ありません。 可視セルの、Cの上から3行目のみを抜き出したいのです。 フィルタされている可視セルのみをコピーする方法は 今の所出来ているのですが…
- eden3616
- ベストアンサー率65% (267/405)
http://support.microsoft.com/kb/401692/ja が参考になりませんか。
お礼
回答ありがとうございます。 んー、この場合ですと、Forで全行のリストを出してしまうので もう少し良い方法がないかな?と思ってしまいます。 For Each FilterRow In Worksheets("Sheet1").Range("A1"). _ CurrentRegion.Resize(, 1).SpecialCells(xlVisible) If FilterRow.Row <> 1 Then RowCount = RowCount + 1 End If Next FilterRow MsgBox RowCount End Sub これのFilterRowが・・・…? とりあえず、FilterRowをMsgboxで出力してみましたが 何だか良く分かりませんでした。 Forの内部でExit For 抜けようとしましたが…
お礼
回答ありがとうございました。 希望通りのものを出すことができました!(Exit For でループ抜けて) ただ、自分の中でやりたいことがごちゃごちゃになっているため、 考え直し、もう一度質問をあげたいと思います。 ありがとうございました^^
補足
回答頂きありがとうございます。 プログラムの内容は理解しておりました。 フィルター後、見かけ上D列上から3番目?を 取得できないかと考えておりました。 その場合はOffsetでしょうか…? 1週目Range("A1").Rowと同様であり、1が返ります これで終了させたいので、 If文にして Exit for で 終了させれば良いのでしょうか?