アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルデーターベースで、職員の勤務表管理をしています。
ある条件によってF列に”○”、”△”、”×”などの記号が入力されています。
この中で”○”だけを抜出、抜き出したものをすべて別シートに貼り付けたいのです。


Selection.AutoFilter Field:=6, Criteria1:="○"
Range("a1").CurrentRegion.Copy Destination:=Range("maru!a4")


本を見て、以上のようなマクロを書いてみたのですが、”maru”シートはずっと空白のままです。

どうすれば良いのでしょうか?
データーを抽出する日によって、”○”の数は変わるので、セル数字を入れずにその時の最後の○表示のセルまでを、コピーするようにしたいのです。

いつもこちらに頼ってすみません。
どうぞよろしくお願いします。

A 回答 (4件)

おはようございます。



> 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
    • good
    • 2

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
抜き出し表ですぐ下の行に次に書き込む準備
    • good
    • 0

最後の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")
    • good
    • 0

オートフィルタを使ったほうが簡単に思います。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!