- ベストアンサー
エクセル(EXCEL)のワークシートの結合について
こんにちは。どうしてもできないのでお力をお貸し下さい。 (質問内容) 同じフォームのエクセルのワークシートで、毎日新しい数十件の物流情報が手元に届きます。私の仕事は、一日前に作ったワークシートにその日届いたばかりの新しいワークシートの情報をマージしてお客様へ転送しています。 毎日届くワークシートには前日までの古い物流情報も載って来ます。つまり、新しいワークシートをそのまま転送するのではなく、古いワークシートにマージして、新しいワークシートで内容に変更があった行と、全く新しい追加行のセルだけハイライトして、お客様に当日分の物流情報として分かるようにする必要があります。このワークシートのマージを手作業でやっているため、以下の手作業が発生しています。 1.新しいワークシートの全てのセルをコピーして前日のワークシートの最終行のすぐ後にペーストする。 2.製品番号でソートして同じ製品番号のものを上下で並べる。 3.上下の行をよく比べて、内容の変更のあったものについては、新しい行で古い行を上書きし、その行をハイライトする。全く新しい製品行が追加されている場合は、そのままその行をハイライトする。 4.最後に製品番号で重複するものを削除する。 という風にして、当日届いた情報を前日までのものに追加して、その内容で変更のあったものと、追加行をハイライトする訳です。 この作業をマクロを使って自動化できないでしょうか?少し複雑ですが、何卒宜しくお願いします。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
品番が空白ではどういう条件なのか・・ シート2 新データ 品番空白の場合上の行の品番を写して良いのか・・ マクロによる操作の記録・モジュールの編集はできているのか・・ データモデル シート1 前データ 品番 BB CC DD 101 11b 11c 104 41d 41c 105 51d データモデル シート2 新データ 品番 bb cc dd 101 12b 13c 105 52b 52d 106 62b 62c Sub シート1へシート2の更新情報を反映しハイライト() '課題3 予備処理 With Sheets(2) 'シート2 新データの更新行 予備マーキング 薄青色 .Range("A1").CurrentRegion.Interior.ColorIndex = 34 '更新行のハイライト 薄青色 'シート2にA列 製品番号 空白行に ダミーの製品番号を挿入 (空白の場合上から複写) 最終行 = .Range("A1").CurrentRegion.Rows.Count For 確認行 = 2 To 最終行 If .Cells(確認行, 1).Value = "" Then .Cells(確認行, 1).Value = .Cells(確認行 - 1, 1).Value End If Next End With With Sheets(1) '課題3 予備処理 シート1 前データのハイライト解除 .Range("A1").CurrentRegion.Interior.ColorIndex = xlNone '課題1 シート1 前データに シート2の更新データを追加挿入 末尾行 = .Range("A1").CurrentRegion.Rows.Count '課題1 シート2の新データをコピー Sheets(2).Range("A1").CurrentRegion.Copy '課題1 シート1 末尾に 新データを追加挿入 .Cells(末尾行 + 1, 1).Insert Shift:=xlDown 'Sheets(2).行1 は 見出し 行として削除 .Rows(末尾行 + 1).Delete Shift:=xlUp '課題2 A列製品番号でソートする 'Sheets(1).行1 は 見出し 行 .Range("A1").CurrentRegion.Sort Key1:=Sheets(1).Range("A1"), Header:=xlYes '課題3、4 A列製品番号の重複行の更新ハイライトと更新後削除 最終行 = .Range("A1").CurrentRegion.Rows.Count 最終列 = .Range("A1").CurrentRegion.Columns.Count For 確認行 = 2 To 最終行 - 1 'A列 製品番号 空白は 処理終了 If Trim(.Cells(確認行 + 1, 1).Value) = "" Then Exit For If StrComp(.Cells(確認行, 1).Value, .Cells(確認行 + 1, 1).Value, vbTextCompare) = 0 Then 'A列製品番号の重複行(旧:確認行 vs 新:確認行+1)の各項目の比較 For 確認列 = 2 To 最終列 If Trim(.Cells(確認行 + 1, 確認列).Value) = "" Then '空白項目の転写 .Cells(確認行 + 1, 確認列).Value = .Cells(確認行, 確認列).Value '.Cells(確認行 + 1, 確認列).Interior.ColorIndex = 34 '更新項目のハイライト なし ElseIf Not (StrComp(.Cells(確認行, 確認列).Value, .Cells(確認行 + 1, 確認列).Value, vbTextCompare) = 0) Then '更新データあり( テキスト 比較 aAAa区別せず) '.Cells(確認行 + 1, 確認列).Value = .Cells(確認行, 確認列).Value .Cells(確認行 + 1, 確認列).Interior.ColorIndex = 6 '更新項目のハイライト 薄黄色 End If Next '課題4 重複した 旧:確認行 の削除 .Rows(確認行).Delete Shift:=xlUp 確認行 = 確認行 - 1 End If Next End With End Sub
その他の回答 (12)
- pierre_1999
- ベストアンサー率33% (297/896)
使ったことがないのではっきりとは分かりませんが 次のフリーソフトが有効と思います。 「ベリファイエクセル」 製作者:野見山さん
お礼
ありがとうございます。早速、ダウンロードして解凍し、使ってみました。使い方が悪いのか、まだうまく結果が出てきませんが、時間をかけてやってみます。もし、どうしてもうまくいかないようなら、また質問いたします。
補足
何度も試みましたが、どうしてもエラーが複数箇所出てしまいます。更に調査しています。
- kohichi42
- ベストアンサー率54% (6/11)
細かいコードはご勘弁を。 先ず、自動記録で大枠を作ってはいかがでしょうか。 その際、マウスを極力使わないように。 それから修正していけば良いかと思います。 注意点としては、 1.最終行の取得 これは65536行からのEnd(xlUp)が無難ですね。途中に空白があっても大丈夫。 2.製品番号以外のキーを第2順位で設定。 3.For Eachで製品番号を比較。一致したら列方向に比較ですね。更に一致の場合、色を着ける。上書きという考えより、削除が楽ですね。 4."3."の作業で色を着けた行を配列として取って置く、あるいはどこかに書き出しちゃうのが簡単かな。 実際には「3.」以降の更新行に対する作業を別物として分けた方がスッキリするんでしょうね。 これらの内容で具体的に分からない部分を更に聞いて頂けると答えやすかったりします^^;
お礼
アドバイスありがとうございます。少し時間をかけてコードを考えて行きたいと思います。プログラミングは初心者なのでちょっと自信がないのですが・・・。
- 1
- 2
お礼
お礼が遅くなり、誠に申し訳ありません。今週一杯出張で不在にしておりましたので、まだ本番データで検証ができておりません。恐れ入りますが、もう少しの間時間を下さい。来週以降で時間が見つけられ次第、本番データで詳細にテストしてみます。本当にありがとうございます。
補足
ご回答、心より感謝いたします。一両日中に試してみたいと思います。結果は必ず報告いたしますので、宜しくお願いいたします。ありがとうございました。