• ベストアンサー

エクセルデーターベース 抽出したものだけを別シートに張る方法を教えてください。

エクセルデーターベースで、職員の勤務表管理をしています。 ある条件によってF列に”○”、”△”、”×”などの記号が入力されています。 この中で”○”だけを抜出、抜き出したものをすべて別シートに貼り付けたいのです。 Selection.AutoFilter Field:=6, Criteria1:="○" Range("a1").CurrentRegion.Copy Destination:=Range("maru!a4") 本を見て、以上のようなマクロを書いてみたのですが、”maru”シートはずっと空白のままです。 どうすれば良いのでしょうか? データーを抽出する日によって、”○”の数は変わるので、セル数字を入れずにその時の最後の○表示のセルまでを、コピーするようにしたいのです。 いつもこちらに頼ってすみません。 どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

おはようございます。 > Range("maru!a4") これはこれで大丈夫です。ただし、推奨できる書き方ではありません。 AutoFilter は使う前に、一度初期化した方が良さそうですね。ときおり、 不安定です。また、このマクロは、   「元データがあるシートをアクティブにしてから実行」 する必要があります。理由は、Selection が使われているからです。 Selection というのは、酷く曖昧です。Selection とは、マクロの実行時に  ・選択していたセル(単一とは限らず複数のセル範囲であることも)  ・選択していたシェープなどのオブジェクト などの様にユーザーがその時選択していたモノを表しますから、不定です。 したがって、例えば、元データのシート以外を選択中にこのマクロを実行 した場合、意図しない場所にオートフィルターが設定されてしまう可能性 があります。 これを回避するなら、オートフィルターを設定するセルを明示的に指定した コードを書くようにして下さい。こんな感じです。 Sub Sample()   With ThisWorkbook.Sheets("元データのシート名").Range("A1")     .AutoFilter 'オートフィルターの初期化     .AutoFilter Field:=6, Criteria1:="○"     .CurrentRegion.Copy Destination:= _       ThisWorkbook.Sheets("maru").Range("A4")   End With End Sub

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

VBAをマクロというような初心者は、なぜかコピーに拘るようだが、初めは代入のコードを使うう方が良い(書式等が移らないが、移す手もある)。技量があがってからコピーを使う方法を検討すると良い。 下記は別の課題でも応用が広いはず。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--- d = sh1.Range("A65536").End(xlUp).Row k = 1 For i = 1 To d If sh1.Cells(i, "F") = "○" Then sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, "B") sh2.Cells(k, "C") = sh1.Cells(i, "C") sh2.Cells(k, "D") = sh1.Cells(i, "D") sh2.Cells(k, "E") = sh1.Cells(i, "E") sh2.Cells(k, "F") = sh1.Cells(i, "F") k = k + 1 End If Next i End Sub ーーーー 解説 Set sh1 = Worksheets("Sheet1") ()内を今の基データシートのシート名に変えること Set sh2 = Worksheets("Sheet2") ()内を抜き出し後のシート名に替えること。manu? d = sh1.Range("A65536").End(xlUp).Row A列の最終行番号数を捉えている 抜き出し後シートの、抜き出しデータの記入スタート行番号 For i = 1 To d 第1行目からd行まで繰り返し。 見出し行があって、デー行が3行目から始まっていると、 For i = 3 To d If sh1.Cells(i, "F") = "○" Then 基シートのF列が○だったら sh2.Cells(k, "A") = sh1.Cells(i, "A") 基シートのA列データを抜き出しシートのA列に代入 以下同じ。列数だけ繰り返し   For j = 1 To 6 sh2.Cells(k, j) = sh1.Cells(i, j) Next j とすると多列の場合コード行数が少なくて済む。 k = k + 1 抜き出し表ですぐ下の行に次に書き込む準備

回答No.2

最後のRange("maru!a4")のところが問題じゃないかと思います。 Destination:=Worksheets("maru").Range("A4")に書き換えて実行してみて下さい。 それでもダメなら、私が使っているコードを利用してみて下さい。 シート名と抽出条件は変えて下さいね。 Worksheets("sheet1").Range("A1").AutoFilter field:=1, Criteria1:="東京都" Worksheets("sheet1").Range("A2").CurrentRegion.Copy _ Destination:=Worksheets("sheet2").Range("A2")

  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.1

オートフィルタを使ったほうが簡単に思います。 ○データのある一番上のひとつ上のセルを選択して, メニューのデータ→オートフィルタ でドロップダウンボックスがでますから, そこで○なら○を選択すると○の入力されている行だけの表になります。 その状態で選択して,別のシートに貼り付ければOKです。 ちょっと目的と違いますかね?

関連するQ&A