• ベストアンサー

Excelのデータでコピペの良い方法は?

Wendy02の回答

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

こんばんは。Wendy02です。 >マクロが理解できていないと無理なようでしたら、はっきりおっしゃっていただけたらありがたいです。 そんなことはありません。こちらが作ったマクロを貼り付けるだけですから、記録マクロでマクロを記録したことがあれば、なお良いのですが、なくてもキーを押していくだけです。後は、私が、マクロがどのぐらい相手本位に作っているか、とか、私がご質問を勘違いしていなかったとか、とか、私自身の問題だと思います。今回は、内容こそは簡単なのですが、細かいところに気を使ったつもりです。コアになる部分は、ほんのちょっとで、後は、ユーザーさんをまご付かせないための配慮です。 ※ マクロの取り付け方 Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、 貼り付けたら、Alt + Q で、画面を閉じます。 '<標準モジュールに貼り付けてください。> '--------------------------------------------------- 'Option Explicit Sub CopyArrangePickup() '出社・帰社データを振り分けるマクロ   Dim inData() As Variant   Dim outData() As Variant   Dim i As Long   Dim j As Long   Dim k As Long   Dim r As Range   Dim r1 As Range   Dim r2 As Range   Dim mRow1 As Long   Dim mRow2 As Long   Dim PastePos As Range   ReDim inData(1, 0)   ReDim outData(1, 0)     'フィルター選択モードチェック   If ActiveSheet.FilterMode = False Then MsgBox "オートフィルターの選択モードではありません。", 64: Exit Sub     'データ取得   On Error Resume Next   Application.SendKeys "{HOME}{END}"   Set r = Application.InputBox("データソースの左上端のタイトル・セルを選択してください。", "データコピー", "$A$1", Type:=8)   If r Is Nothing Then Exit Sub   Set r = r.Cells(1)   Beep   Set r1 = Range(r, r.End(xlDown)).Resize(, 5) '必要なデータが5列目まで   On Error GoTo 0     If r1 Is Nothing Then: Exit Sub   If Not (WorksheetFunction.CountA(r1.Rows(1)) = 5 And r.Cells(1).Value <> "") Then MsgBox "正しく最左列を選択してください。", 16: Exit Sub   '1行目をタイトル行とする   For i = 2 To r1.Rows.Count    ReDim Preserve inData(1, k)    ReDim Preserve outData(1, k)    If r1.Cells.EntireRow.Hidden = False Then      inData(0, k) = r1.Cells(i, 1).Value2      inData(1, k) = r1.Cells(i, 4).Text      outData(0, k) = r1.Cells(i, 2).Value2      outData(1, k) = r1.Cells(i, 5).Text      k = k + 1    End If   Next i     'ペースト部分   PasteposFind:     On Error Resume Next   Set PastePos = Application.InputBox("ペーストする場所の左上端を選択してください。", "データペースト", "$A$1", Type:=8)   On Error GoTo 0   If PastePos Is Nothing Then Exit Sub   If PastePos.Value = "" Or PastePos.Offset(2).Value = "" Then    MsgBox "表がないと貼り付けられません。"    GoTo PasteposFind   End If   If PastePos.Address = r.Address And _   PastePos.Parent.Name = r.Parent.Name Then MsgBox "同じ場所には貼り付けることが出来ません。", 64: GoTo PasteposFind     Set r2 = Range(PastePos, PastePos.End(xlDown))   Application.Goto r2.Cells(1)   With r2.Offset(1, 1).Resize(r2.Rows.Count - 1, 2)    If WorksheetFunction.CountA(.Cells) > 1 Then     If MsgBox("データのみ削除しますがよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub      .ClearContents    End If   End With   Application.ScreenUpdating = False   For j = LBound(inData, 2) To UBound(inData, 2)    On Error Resume Next    mRow1 = 0    mRow1 = WorksheetFunction.Match(inData(0, j), r2, 0)    If mRow1 > 0 And inData(1, j) <> "" Then      r2.Cells(mRow1, 2).Value = inData(1, j)    End If    mRow2 = 0    mRow2 = WorksheetFunction.Match(outData(0, j), r2, 0)    If mRow2 > 0 And outData(1, j) <> "" Then      r2.Cells(mRow2, 3).Value = outData(1, j)    End If    On Error GoTo 0   Next j   Set r = Nothing: Set r1 = Nothing: Set r2 = Nothing   Set PastePos = Nothing   Application.ScreenUpdating = True End Sub '-------------貼り付け終わり----------------------------------- なお、このままですと、起動が面倒なので、できれば、コマンドボタンを取り付けると便利です。(ショートカットですと、他の方が使う時に分りにくいです。) 取り付け方は、メニューバーの何もないところを右クリックすると、カスケードメニューが現れますから、その中で、[コントロールツールボックス] をクリックしてください。 その中をマウスポインターでなぞっていくと、[コマンドボタン]というクリーム色のポップアップ・ヒントが現れますので、[クリック] ワークシート上で、適当な場所をドラッグして、四角い枠を囲みますと、ボタンになります。白い小さな四角□が並んでいる状態かと思います。それを[ダブルクリック]すると、画面が、VB エディター画面に変ります。 Private Sub CommandButton1_Click() End Sub    ↑ このようになっていますので、   このようにします。そのまま、全部を貼り付けてもよいです。 '------------------------------- Private Sub CommandButton1_Click() Call CopyArrangePickup '書き込み End Sub '------------------------------- 画面の上部のツールバーには、青い三角定規が凹んでいますので、[クリック] もう一度、Alt + Q で、画面を閉じてしまいます。 また、メニューの何もないところで、右クリックして、カスケードメニューの中の[コントロールツール・ボックス]をクリックすれば、このメニューは消えます。 後は、そのボタンをクリックすれば、実行できます。 ○ マクロの実行の前に、 ※オート・フィルターで、氏名の1人を選択します。 選択していないと、マクロは、進んでくれません。 ペーストのシートには、すでに、以下のように、時系列に日付が並べられていることが条件です。私の作ったマクロは、日付のあるところを探しますので、ないものは転記してくれません。それを気をつけてください。 データは、どちらも、必ずしも、左端上のA1 から始まっていなくてもよいです。 ペースト先は、 日付  出社時間   退社時間 171216  ←元のソースデータがシリアル値なら、シリアル値で 171217  統一してください。数字なら数字で可能です。 171218  文字の数字と数値では、検索しません。 171219 171220 171221 171222 171223 171224    出社時間と退社時間にデータがあると、削除して良いか聞いてきます。 マクロは、順を追って、メッセージボックスが現れます。ペーストする時は、シートを替えることが出来ます。

harugassan
質問者

補足

何も分からない見ず知らずの私に、こんなに丁寧にご回答下さって、本当にありがとうございます(嬉涙(T_T)) きっと貴重なお時間を割いて作ってくださったのでしょう。 本当に感謝していますm(_ _)m 一応、お教えいただいたとおり、マクロを組んでみましたが、 下のように何故か振り分けがうまくいきませんでした。 どこか私のやり方がおかしいとは思うのですが、もしお時間が有れば、教えてください。 《元のデータ》 出社日 帰社日 氏名 出社時間 帰社時間 171216 171216 伊藤   7:20   18:30 171216 171217 伊藤   19:16   10:13 171219 171219 伊藤   空白   空白 171219 171220 伊藤   20:30   15:00 171219 171219 伊藤   7:50    16:10 171220 171220 伊藤   空白   空白       《マクロで振り分けたデータ》 日付  出社時間  帰社時間 171216  空白    空白 171217  空白    空白 171218  8:45    空白 171219  9:05    空白 171220  7:20    空白 171221  空白    空白 本当にお時間が有るときで結構です。

関連するQ&A

  • 【EXCEL VBA】データの並べ替えの方法

    元データが左から右へ氏名コード、日付(2011/5/1)、出社時刻、退社時刻、日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻、と順に1ヶ月分入力されています。(画像上) このデータを一番左端に氏名コード、上から日付(2011/5/1)、出社時刻、退社時刻、行を変えて日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻。(画像下)と言う形に行・列の並べ替えをしたいと考えています。 EXCELの機能である、「コピー→編集→形式を選択して貼り付け→行列を入れ替える」では対応できず、VBAマクロ又は関数で試みようとしましたが、こちらも対応方法が見つかりません。 何かいい方法がございましたら、ご指導のほど宜しくお願い致します。 尚、作業環境はWindows7、MS office2010です。 

  • EXCELでデータを抽出してコピペしたいです

    指定した日付より、それ以前の誕生日(指定日も含む)の人だけを抽出してコピペしたいのですが WORKBOOK1のSHEET1(名簿)のH列に生年月日(他の列にもデータあります) データは、1200件(行)あります。 WORKBOOK2のSHEET1(該当者)名簿と配列は同じです。 A1に指定の日付をいれます。 WORKBOOK1のSHEET1(名簿)より抽出したデータのペースト位置は、A3からです。 VBAで可能でしょうか?

  • エクセルで同じ名前の該当データを抽出する方法

    よろしくお願いします。 昨日質問させていただき、ご回答を頂き、既に締め切っている内容について、困っております。 締め切った質問は、QNo.3223413「エクセルの関数?について」 質問内容は、 「お世話になります。 今、次のような調書を作成中ですが、処理効率を上げるためにエクセルの関数?を活用してと考えております。 シート1には、次のようなデータが入っております。 「・・」本質問のために各セルの位置を合わせるために 入れているだけです。 ・・・・A・・・B・・・C・・・D・・・E・・・ 1・・氏名・・1位・・2位・・3位・・4位・・・  2・・佐藤・・・・・・・○・・・・・・・・・・・ 3・・吉田・・・○・・・・・・・・・・・・・・・ 4・・伊藤・・・・・・・・・・・・・・・○・・・ シート2に、シート1のデータを参照して、氏名の該当者に 対して、B2以降に該当順位を付す方法を教えてください。 ・・・・A・・・B・・・ 1・・氏名・・順位・・・  2・・佐藤・・2位 3・・吉田・・1位 4・・伊藤・・4位 シート1は外部から受けたデータであり、シート2は内部で 新たに加工する調書です。1500件ぐらいあるので、何と かエクセルを活用したいと考えておりますので、よろしく お願いします。」 であり、回答いただき当初の目的に対応する回答の「LOOKUP」を採用して作業を進めておりましたが、シート1を上から順番にLOOKUPしていく場合は、回答いただいたままでOKでしたが、シート2を作成において、佐藤○○と打込めば、シート1の同姓同名である佐藤○○を見に行って反映する方法を教えてください。 確かに、ご回答いただいた方々の中には、シート1とシート2が同じ順番で作成されている場合を想定してご教授いただいており、私の質問の不足でご迷惑をお掛けいたしますが、よろしくお願いします。

  • エクセルでシートの振り分けを自動的にする方法

    初心者です。宜しくお願いいたします。 業務の1日のスケジュールをエクセルで管理しております。 主にお客様との相談や打ち合わせを管理しているのですが、 (1)シート1で1日のスケジュールを入力していきます。 (列)   AB   CD    E     F (行)  日付  時間  氏名   相談内容 ※(日付、時間、氏名は入力規則を使用して入力できるようにしています。) (2)シート2以降では、氏名ごとにシートを作成して、シート1に入力すると、自動的にシート2以降へ振り分けができるようにしたいのです。 (列)   AB   CD    E       (行) 日付  時間  相談内容 できるだけわかり易く教えていただければ幸いです。 宜しくお願いいたします。

  • Excel 抽出データを別シートに移す方法

    アルバイトの方の勤怠管理のためにタイムカードレコーダーを使っていて、 毎月その内容をExcelに出力しています。 A   B     C       D    E   F    G ------------------------------------------------------------ 番号 氏名   日付     出勤  外出  戻り  退勤 1  伊藤太郎 2005/1/16  8:55           16:35 1  伊藤太郎 2005/1/17  8:52           16:40                ・                ・ 2  佐藤花子 2005/1/16  9:48           15:07 2  佐藤花子 2005/1/17  9:51           15:10                ・                ・ 1つのファイルの中にすべてのアルバイトさんのデータが出力されて いるのですが、個人毎にデータを保存しておきたいので、毎回オートフィルタで 1人ずつデータを抽出して別シートにコピーしています。しかし、アルバイト さんの数が増えるにつれて作業量&時間も増えてきてしまいました。 この作業をマクロやVBAで自動化できれば・・・と思うのですが、何かよい 方法はありますでしょうか。 説明が足りない部分がありましたらご指摘ください。よろしくお願いいたします。

  • エクセル2013 シートのデータ読み込みで

    エクセル2013 あるBookにシートが複数枚あります。 各シートのL1に氏名が入力されていたら、他のセルのデータを氏名とともにシート40にある幾つかのセルに読み込みます。 氏名が入力されていないと、シート40の氏名その他のデータが「0」になってしまいます。 氏名が入力されていない場合は、シート40のセルが「0」ではなく「空白」にしたいのですが 方法を教えてください。

  • Excelで、他のシートのデータを取り込む(統合する)には?

    下記のような「Sheet1」のデータ(学年)に、「Sheet2」のデータ(住所)を取り込もうとしています(データは架空例です)。Sheet1・2は、A列の内容が共通していますが、「Sheet2」のほうがデータ数が少ないです。LOOKUP関数を使えばいいのかと思いましたが、LOOKUPはデータ行数が完全一致している必要があるのか、うまくいきません。 要するに、「Sheet1」のA列に一致する文字列が「Sheet2」のA列にあった場合、その行のB列の内容を「Sheet1」のC列に入れる、というようにしたいのです。どのような手順で行えば可能でしょうか。よろしくお願いします。 --- ■Sheet1(学年データ) 1氏名(A)   学年(B) 2阿部一郎  1年 3伊藤二郎  2年 4上田三郎  3年 5江藤四郎  4年 ■Sheet2(住所データ) 1氏名(A)  住所(B) 2伊藤二郎 東京都○○区 3江藤四郎 大阪府○○市 ■ほしいデータ(Sheet1) 1氏名(A)   学年(B)   住所(C) 2阿部一郎  1年 3伊藤二郎  2年    東京都○○区 4上田三郎  3年 5江藤四郎  4年    大阪府○○市

  • エクセルで指定した日付の期間の特定の条件にマッチしたデータを別のシート

    エクセルで指定した日付の期間の特定の条件にマッチしたデータを別のシートに表示して集計を出すことは可能でしょうか? ご存知の方がいましたらよろしご教授お願いします。 Sheet1に 日付 顧客名 契約料 営業 対応者 ポイントA 訪問者 ポイントB 1月1日 A社 10,000 伊藤 鈴木 10 鈴木 20 1月5日 B社 20,000 高橋 田中 10 "空白" 1月25日 C社 20,000 伊藤 鈴木 10 吉田 20 2月2日 D社 10,000 伊藤 吉田 10 鈴木 20 2月10日 E社 20,000 高橋 鈴木 10 "空白" 2月18日 F社 10,000 高橋 "空白" 吉田 20 2月25日 G社 20,000 伊藤 吉田 10 吉田 20 3月18日 H社 30,000 高橋 "空白" 鈴木 20 3月28日 I社 10,000 伊藤 林 10 "空白" 4月5日 J社 50,000 高橋 鈴木 10 鈴木 20 というデータがあります。 Sheet2で 日付の期間・対応者・訪問者を任意で入力するとそれを条件として一致した項目を表示しその期間内の対応件数およびポイントの集計を自動で計算させたいです。 うまく説明できないためイメージ画像を添付いたします。 よろしくお願いいたします。 うまく説明できないので画像を添付させていただきます。

  • エクセル・データをランダムにグループ分けする

    エクセルで用意された氏名・所属・年齢・性別データが約2000件あります。各データは氏名のあいうえおごとに作成したシートに入っています。各シートには0から最大で100件のデータがあります。これらのデータを、あいうえお順ではないランダムな10のグループに分け直したいのですが、どうしたらよろしいでしょうか。

  • excelでは日付がコピーできない?

    過去に似たような質問があったらお許しください。 エクセルで数百人分のデータを作成し、これをまとめて新しいデータシートにコピペしようとしたのですが、何故か日付の部分だけが上手くペーストされません。 たとえば、2005年3月9日(03/09/05)という日付が何故か新しいデータシート上では1999年3月8日(03/08/99)というようにとんでもない値になってしまいます。 おかしいとおもって、日付の部分だけを個別に何度かコピペしてみましたが結果は同じでした。 これは、いったいどういうことなのでしょうか? どなたか、お分かりの方がいらっしゃいましたら教えてください。