- ベストアンサー
Excelで、既存データの塗り替え
いつもお世話になっております。 早速ですが、質問がございます。 現在、17,000行ほどのデータがあります。 それぞれの行に整理記号番号が打ってあり、 1行で1件となっています。 整理記号番号 データ内容 A1 500 A2 600 A3 1000 A4 30 B1 400 B2 10 というふうに、データが入っています。 重複する整理記号番号はありません。 そして現在、新データとして 整理記号番号 データ内容 A1 100 A3 2000 という表があります。 新データは旧データのうちの、 変更になった行のみの一覧です。 「A1が500から100になった」 「A3が1000から2000になった」 という意味です。 つまり、新データと旧データのうち、 整理記号番号が同じものは新データに塗り替えたいのです。 新データは1,500件ほどあり、いちどに塗り替えをおこないたいと思っています。 ご教授のほどよろしくお願い申し上げます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お話しの内容からすると、マクロのほうがよいのではないかと思いました。 以下は、Alt+F11(Altを押しながら、F11を押す)で、Visual Basic 画面を開いて、 挿入-標準モジュールをクリックして、白い画面を出します。 以下を貼り付けたら、以下の 「新データ・旧データのシート」を、自分用のシート名に、中を書き換えます。 以下のマクロは、A列・B列の一行目からの設定になっておりますから、違うよう でしたら書き換えてください。 そしてAlt+F11 で元の画面に戻ります。 後は、メニューの[ツール]-[マクロ]-[マクロ]-Old_NewCompare という名前を探して、クリックします。 なお、安全のために、バックアップをしておいてください。マクロは、「戻り」が出来ません。 '<標準モジュール> Sub Old_NewCompare() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim c As Object Dim rtn As Variant '要設定 Set sh1 = Worksheets("Sheet1") '旧データ側 Set sh2 = Worksheets("Sheet2") '新データ側 ' With sh2 .Select For Each c In .Range("A2", .Range("A65536").End(xlUp)) rtn = Application.Match(c.Value, sh1.Columns(1), 0) If Not IsError(rtn) Then sh1.Cells(rtn, 2).Value = c.Offset(, 1).Value End If Next c End With Set sh1 = Nothing: Set sh2 = Nothing End Sub
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
Matchingのロジックでやってみます。 マスタデータ側、更新データ側とも整理番号で昇順ソートしておいてください(必須)。VBAでもソートを自動化できますが略。 元の順序に戻したい場合はソートの前にある列に連続番号を振っておいてください。 下記のhighV = "整理番号の最大の次"の、 "整理番号の最大の次"は該整理番号で最大の番号の次の番号で置き換えてください。 両シートとも、A列データの最後の次行にENDと入れておくこと。最終行をEnd(xlUP)で把握する方法もあるが略。 -------------------- Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") 'マスタデータ側 Set sh2 = Worksheets("Sheet2") '更新データ側 i = 1 j = 1 highV = "整理番号の最大の次" bothread = "y" p1: k1 = sh1.Cells(i, "A") If k1 = "END" Then k1 = highV If bothread <> "y" Then GoTo cmp bothread = "n" p2: k2 = sh2.Cells(j, "A") MsgBox k2 If k2 = "END" Then k2 = highV '---- cmp: If k1 = k2 Then If k1 = highV Then Exit Sub sh1.Cells(i, "B") = sh2.Cells(j, "B") i = i + 1 j = j + 1 bothread = "y" GoTo p1 ElseIf k1 > k2 Then j = j + 1 GoTo p2 Else i = i + 1 GoTo p1 End If End Sub -------- ソート後、更新後の状態です。 Sheet1のA、B列。 a1 1 a11 777 a2 2 a3 99 a5 11 a6 2 a7 5 a9 6 END ------------ 更新データシート。A,B列。 Sheet2 a11 777 a3 99 a5 11 END
補足
お返事が遅くなりました。 補足としては、 「整理番号」ではなく「整理記号番号」が入っており、 いわば文字列なのです。 「123あ456A789」みたいな感じです。 いかがでしょうか?