• ベストアンサー

フィルタオプションとコピーペーストについて

質問です。シフト表の中の対象の氏名を抽出し(当日)、別シートにコピペする方法です。 sheet1A列に氏名が並んでいます。B1セルからC1、D1・・・・と日付が1日から31日まで記載されています。 それぞれの氏名の右側にはAやB、C、D、欠、遅、早・・・などのシフトが記載されております。その中で、当日の"欠""遅""早"だけを抽出し、その氏名をsheet2のA列にペーストする方法を教えて下さい。ペーストは日々実施するため、値の一番下に貼り付けていくイメージでお願いします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.1です! 補足に >sheet2へのペーストですが、現段階でA列にペーストするか決まっていません。 よって、例えばB列もしくはC列にペーストすることになっても上記コードで対応できるように コードのどの部分を修正すればいいのか教えていただけますでしょうか・・・ とありますので再びお邪魔しました。 実際はコピー&ペーストではなく、条件に一致すればSheet2のA列最終行の1行下に表示する!という考え方のコードです。 最終行の取得方法は neochi_lifeさんが詳しく説明して下さっているのでそちらを参考にしてみてください。 さて、A列ではなくどこの列になるか判らないということなので、 前回のコードでは ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws1.Cells(i, 1) の ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1)  部分がSheet2のA列最終行の1行下のセルという意味になります。 仮にSheet2のC列最終行の場合は ws2.Cells(Rows.Count, 3).End(xlUp).Offset(1) となります。 Cells(行番号,列番号)となりますので、実際のデータに合わせて列番号部分の数値を変更してみてください。 この程度でよろしいでしょうかね?m(__)m

その他の回答 (6)

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

シートの情況をそのイメージで例示すればわかりやすいのだ。文章ばかりに頼らないこと。 ーーー1日ーー2日ー3日・・・月末まで 山田 ー Aー欠ーCー・・・・ 木村 ー BーB-遅ー 鈴木 ー Cー早ーAー 佐藤 ー DーCー欠ー ーーーー >B1セルからC1、D1・・・・と日付が1日から31日まで記載されています。 見出しのことだろう。日付が各セルのデータ部分に入っているように解せる。 ーー>第1行目には月中の日を順次入れています >当日の"欠""遅""早"だけを抽出し 各列の最終社員の下に該当者の氏名を出すのか。 >ペーストする方法を教えて下さい ペーストとは言わない。手動で人間がやる場合にはコピー・ペーストをやらざるをえないかも。 しかし素の方法は手間がかかると思っているのだから。 >"欠""遅""早"だけを抽出し、その氏名をsheet2のA列にペーストする方法を教えて下さい 該当者の氏名は下方向に順次出すとして、欠、遅、早の別はどうするのか 例を書かないから判りにくい。 ーーー1日ーー2日ー3日・・・月末まで 山田 ー Aー欠ーCー 木村 ー BーB-遅ー 鈴木 ー Cー早ーAー 佐藤 ー DーCー欠ー ーー ーーーーー山田--木村ーー- --------鈴木ーー佐藤ーー のような形か? ーーー どういう方法でと書いてないが、(操作、関数、VBA、ソフトなどのこと)、操作では出来ず、関数辺りを期待しているのかとも思うが、関数では難しい。 VBAなら簡単だが、質問者はVBAの経験は無いのだろう。 >イメージでお願いします、 このコーナーは、課題を丸投げで、注文どおりの作成を依頼するコーナーではないよ。 自分でどこまでやってみたのか。 VBAの回答など出ても、コピペして、出来ましたというだけになる。 VBAを勉強すること。こういう風にエクセルを仕事のからみで使い出すと、VBAは必須になる。 ーーー こういう抜き出し問題は、エクセル関数では難しいことを覚えておくこと。 例データ 氏名・日付 2011/2/1 2011/2/2 2011/2/3 山田 A 欠 早 木村 B B 遅 鈴木 C 早 B 佐藤 D C A ーーーーーーーーー  山田 山田  <=以下は結果 ーーーーーーーーー  鈴木 木村 シートにコマンドボタンを1つ貼り付ける。 コマンドボタンをクリックして出てくるVBE画面に Private Sub CommandButton1_Click() d = Range("A25").End(xlUp).Row j = d + 2 c = ActiveCell.Column MsgBox c For i = 2 To d If Cells(i, c) = "欠" Or Cells(i, c) = "早" Or Cells(i, c) = "遅" Then Cells(j, c) = Cells(i, 1) j = j + 1 End If Next i End Sub 欠席者名などを出す日付の列を選択して、ボタンをクリック 結果は社員最終行の+2行下から嘉吉慣れられる。 上記では社員数は25名以下の仮定 毎日作業したいということで、列を選ばして、ボタンを押させている。 自動的に最右列をVBAで取る方法もあるが簡易の方を考えた。 ーーー 欠席などの文言も出すなら。 Private Sub CommandButton1_Click() d = Range("A25").End(xlUp).Row j = d + 2 c = ActiveCell.Column For i = 2 To d If Cells(i, c) = "欠" Or Cells(i, c) = "早" Or Cells(i, c) = "遅" Then Cells(j, c) = Cells(i, 1) & "-" & Cells(i, c) j = j + 1 End If Next i End Sub で 結果(2日分操作後) 氏名・日付 2011/2/1 2011/2/2 2011/2/3 山田 A 欠 早 木村 B B 遅 鈴木 C 早 B 佐藤 D C A ーーーーーーー 山田-欠 山田-早 ーーーーーー 鈴木-早 木村-遅 ======= フィルタオプションの設定でやるのはもう少しのところで本件では難しいと思う。 日付を毎日変えても良いならできるかも。

Yangoro
質問者

お礼

回答ありがとうございます。 確かに例文がわかりづらかったようです。 今後、質問しなくて済むようにVBA勉強します。

  • gyouda1114
  • ベストアンサー率37% (499/1320)
回答No.5

可視セルのみ選択し、コピーする。 1.Ctrlキー+G(き)キー 2.「ジャンプ」ダイアログ → セル選択をクリック 3.「選択オプション」 → 可視セル をオン → OK 4.Ctrlキー+C(そ)キー 5.貼り付け先でCtrlキー+V(ひ)キー ジャンプで選択:対象セル範囲 http://www.excel-jiten.net/data_entry_edit/jump_select_cell_range.html ショートカットキーの一覧 http://excel.ara3.net/etc/shortcut.htm

回答No.4

今回、例として挙げたのは、当日に処理する場合にしか対応していませんが もしも、処理日とチェック日が異なる場合(例えば昨日の分を処理したい等)には today = Day(Date) + 1 の部分を today = Application.InputBox(prompt:= _ "処理する日付を入力して下さい。", _ Title:="処理日指定") + 1 とすると、入力窓が開き処理する日付を自分で指定して処理させることができます -------------------------------------- 蛇足になりますが、VBAエディターの「This Workbook」に ' ---------- 内容始まり ---------- Private Sub Workbook_Open() Application.OnKey "^{q}", "shiftCheck" 'Ctrl+Qボタンを押すとマクロが動きます End Sub ' ---------- 内容終わり ---------- を記述しておくと、Ctrl+Qでマクロを起動することができるようになります ※何度もつけたしてすみません・・・

Yangoro
質問者

お礼

Neochi lifeさん、回答ありがとうございます。 非常に参考になりました。 確かに当日意外に作業発生する可能性があるため、今後の参考にします。 またよろしくお願いいたします。

回答No.3

ちなみに、1さんと最終行の数え方が違ってますが何が違うかというと ・ ws1.Cells(Rows.Count, 1).End(xlUp).Row シート1の最終行(Excel2003までは65536行、Excel2007は1048576行)から上方向に数えていってデータのある最終行を取得 ・ws1.Range("A2").End(xlDown).Row シート1のA2行から下方向に数えていってデータのある最終行を取得 ・length = 1 (中略) Do While ws2.Cells(length, 1) <> "" length = length + 1 Loop シート2のA1から下方向へセルが空白になるまで数える (=最終行を取得) バリエーションとしてどうぞ。

回答No.2

こんなのでもありかも? '------------------------------------- Private Sub shiftCheck() Dim today, length As Integer Dim w1, w2 As Worksheet Dim i As Integer Dim shift As Variant Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") length = 1 today = Day(Date) + 1 Do While ws2.Cells(length, 1) <> "" length = length + 1 Loop For i = 2 To ws1.Range("A2").End(xlDown).Row shift = ws1.Cells(i, today) If shift = "欠" Or shift = "遅" Or shift = "早" Then ws2.Cells(length, 1) = ws1.Cells(i, 1) length = length + 1 End If Next End Sub '------------------------------------- ws2.Cells(length2, 1) の1がA列に対応、以下2,3・・・でB,C・・・ Cells(行、列)で、列も数字で表現されています その他の項目を追加する可能性があるなら If shift = "欠" Or shift = "遅" Or shift = "早" Then '-- 処理部分開始 -- ws2.Cells(length, 1) = ws1.Cells(i, 1) length = length + 1 '-- 処理部分終了 -- End If この部分の処理部分の中身を '-- 処理部分開始 -- ws2.Cells(length, 1) = ws1.Cells(i, 1) ws2.Cells(length, 2) = Day(Date) & "日" ws2.Cells(length, 3) = shift length = length + 1 '-- 処理部分終了 -- のように書き換えると A列に名前、B列に日付、C列に勤怠区分を出力 などのようなこともできます

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! VBAになってしまいますが・・・ 一例です。 Sheet2のA列に表示するのはSheet1のA列の氏名だけで良いわけですよね? そういうことだとして、 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") '←「sheet1」の部分は実際のSheet名に変更 Set ws2 = Worksheets("sheet2") '←こちらのSheet名も適宜変更 j = Day(Now()) + 1 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row '↑Sheet1の2行目~最終行までとしていますので、 '仮に最終行が20行目だとすると、For i = 2 to 20 のように変更します。 If ws1.Cells(i, j) = "欠" Or ws1.Cells(i, j) = "遅" Or ws1.Cells(i, j) = "早" Then ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws1.Cells(i, 1) End If Next i End Sub 'この行まで こんな感じではどうでしょうか?m(__)m

Yangoro
質問者

補足

tom04さん、回答いただき誠にありがとうございます。 上記VBAでうまく作動いたしました。 1点だけ質問です。 sheet2へのペーストですが、現段階でA列にペーストするか決まっていません。 よって、例えばB列もしくはC列にペーストすることになっても上記コードで対応できるように コードのどの部分を修正すればいいのか教えていただけますでしょうか? よろしくお願いいたします。

関連するQ&A