みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルで異なるシートのデータを比較したり、コピーしたりしたい

お世話になっております。
エクセルとはほとんど初対面といった状態で、四苦八苦している状況です。

今やりたいことは、下記のようなことです。
実現方法やアドバイスなど、何でもいいので教えてください。
宜しくお願いします。

シートA,シートBがある。
シートAは今回取込んだデータ。
シートBはこれまで取込んだ累計データ。
2つのシートの項目は同じで、複数列ある。
その中にキーとなる列がある。
(例:項目番号,項目名称,説明,etc 項目番号がキー)

(1)まず、シートAのデータを一旦消去し、CSVファイルを読み込む。
(2)次に、シートBの既存のデータとシートAのデータを比較する。
 シートAにあってシートBにないデータは追加する。
 シートAにあってシートBにもあるデータは上書きする。

(2)の方法が分りません。
シートAにあるデータがシートBにあるのかどうかと言うところはAdvancedFilterと言う関数を使って出来たのですが、追加/上書きと言うところが出来ません。
AdvancedFilter以外にもっと使いやすい関数があるのでしょうか?
それとも根本的にもっと違ったやり方があるのでしょうか?
ちなみに、別のデータベースを使うとかは不可です。
エクセルでやらないといけない仕様なのです。
宜しくお願いします。

投稿日時 - 2003-12-16 09:13:40

QNo.731351

すぐに回答ほしいです

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

VBAでの処理で良ければ、次の手順でテストしてみてください。

> シートAのデータを一旦消去し、CSVファイルを読み込む。

読み込みましたら、セルA1を Wクリックするだけで、ご希望どおり処理されます。

> 既存のデータとシートAのデータを比較する。

比較するのは、 キーになっている「項目番号」だけでいいのですね。

[操作手順]

・CSV読み込みシート(シートA)のシート名タブを右クリックして「コードの表示」を
 指定します。
・開いたコードウィンドウに下記コードをコピーして貼り付けます。
 必要により、コードの2~3行目を実情に合わせ変更します。
・Alt+ Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。
・メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を
 「中」にして[OK]します。
・以上で設定完了です。 

これで、A1をWクリックすると、指定したシートのキー列に同じデータがあれば、
その行を上書きし、無かったら、一番下にデータを追加します。

これで如何でしょうか。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Const RuikeiShN = "シートB" ' <--- 累積データ シート名指定
Const Col = "A" '  <----------- キー列指定
Const TopRow = 2 ' <-------------- データ先頭行指定(見出しを除く)
Dim Rng As Range
Dim R As Range
Dim Res As Integer
If Target.Address <> "$A$1" Then Exit Sub
Cancel = True
Res = MsgBox(RuikeiShN & " の累積データを更新しますか?", vbYesNo + vbExclamation)
If Res = vbNo Then Exit Sub
For Each Rng In Range(Col & TopRow, Range(Col & 65536).End(xlUp))
  Rng.EntireRow.Copy
  With Worksheets(RuikeiShN)
    Set R = .Range(Col & ":" & Col).Find(Rng.Value, lookat:=xlWhole)
    If R Is Nothing Then
      .Paste Destination:=.Range(Col & 65536).End(xlUp).Offset(1).EntireRow
    Else
      .Paste Destination:=R.EntireRow
    End If
  End With
Next Rng
Application.CutCopyMode = False
Set R = Nothing
End Sub

投稿日時 - 2003-12-16 13:22:59

お礼

凄い!
完璧です!!
しかも速い!!!
教えて頂いて、直ぐに出来たのですが、どうしてこんなに簡単に出来るのか理解しようとして時間がかかってしまいました。
すみません...
本当にどうもありがとうございました。

投稿日時 - 2003-12-16 16:21:33

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

》(2)の方法が分りません。

 これはデータベースソフトのならではの仕事です。Excelでやろうとすると、極めて厄介です。すなわち、Accessや桐を使えば極めて簡単です。

》ちなみに、別のデータベースを使うとかは不可です。
》エクセルでやらないといけない仕様なのです。

 私なら、桐で処理してその結果をExcelに書き出します。そして、余った時間をのんびりします。

投稿日時 - 2003-12-16 10:54:48

補足

ありがとうございます。

ところで、桐の使い方や、インストールの方法など、簡単でいいので教えてもらえませんか?

投稿日時 - 2003-12-16 12:31:19

ANo.1

Windowsにはエクセルのようなものを複数を起動する機能があります。
AとBを画面に並べての操作もできます。
両者間の移動も複写も可能です。
操作方法は複数の起動とツールバーのウェンドウの機能の組み合わせで使うことです。

投稿日時 - 2003-12-16 10:01:11

お礼

お答え頂きまして、ありがとうございました。
しかし、自分の力不足の為、tds2aさんのイメージしている事がよく分りません...

投稿日時 - 2003-12-16 16:24:25

あなたにオススメの質問