チョコミントアイス

お世話になります。

office365のエクセルを使用しております。
更新された後のデータと更新される前のデータの差分を
VBAを使って差分データに保存したいと考えております。


シート名
・更新前データ
・更新後データ
・差分データ

1行目には見出しが入っており、
A~Wまで例として入力されております。
5000行を超えるデータとなり、
日々増えていきます。

差分に細かい条件はなく、
単純に増えた分を抜き出したいと考えております。

ご指導宜しくお願い致します。

「更新前と更新後の差分をVBAを使って抜き」の質問画像

質問者からの補足コメント

  • ご回答ありがとうございます。
    単純にしたの方向に増えていくだけになっております。
    二つのデータには関数式は埋め込んでおりません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2023/06/01 20:16
  • ご回答ありがとうございます。
    ド素人過ぎて多少補足頂けますと幸いです。
    更新後データ範囲、更新前範囲は、
    単純にシート全体を指定したいと思っていたのですが、
    どうも書き方がよくわかりませんでした。

    IDは抜き出し作業後に当たるため、
    現状は秒単位まで出ている日付(D列)くらいしか思いあたりませんでした。

    今一度、ご指導をお願い致します。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/06/01 20:29

A 回答 (5件)

1.以下のマクロを標準モジュールに登録してください。


2.各シートのシート名は
更新前データ
更新後データ
差分データ
としています。
3.差分データの見出し行(1行目)は予め、作成しておいてください。


Option Explicit

Public Sub 差分データ作成()
Dim wsb As Worksheet '更新前データシート
Dim wsa As Worksheet '更新後データシート
Dim wsd As Worksheet '差分データシート
Dim maxrowb As Long '更新前データ 最大行
Dim maxrowa As Long '更新後データ 最大行
Dim maxrowd As Long '差分データ  最大行
Dim rowa As Long '更新後データ 行
Dim rowd As Long '差分データ 行
Set wsb = Worksheets("更新前データ")
Set wsa = Worksheets("更新後データ")
Set wsd = Worksheets("差分データ")
maxrowb = wsb.Cells(Rows.count, 1).End(xlUp).row
maxrowa = wsa.Cells(Rows.count, 1).End(xlUp).row
maxrowd = wsd.Cells(Rows.count, 1).End(xlUp).row
If maxrowb >= maxrowa Then
MsgBox ("更新データなし")
Exit Sub
End If
rowd = maxrowd + 1
For rowa = maxrowb + 1 To maxrowa
wsd.Cells(rowd, 1).Resize(1, 23).Value = wsa.Cells(rowa, 1).Resize(1, 23).Value
rowd = rowd + 1
Next
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

ご指導頂きまして、大変ありがとうございます。
他の方の指導もございましたが、
希望通りの仕様になっておりまして、
今後のやりたいことにもつながるため、
ベストアンサーにさせて頂きました。

お礼日時:2023/06/02 16:39

No1です。



>更新後データ範囲、更新前範囲は、
>単純にシート全体を指定したいと思っていたのですが、
それでも不可能ではありませんけれど、実際にデータのある範囲は、シート全体に対して何万分の一とかの範囲だと想像します。(数十万分の一かも・・)
それを、シート全体で計算させると、数万倍(数十万倍)の計算をさせることになるので、効率が悪すぎますし、計算が重くなる原因になりかねません。
可能性のある範囲に限定しておくのが常識的です。


>IDは抜き出し作業後に当たるため、
>現状は秒単位まで出ている日付(D列)くらいしか思いあたりませんでした。
抽出する際に、どこかの列の値で追加データかどうかを判断できないということでしょうか?
ひょっとして、1行分のデータを全部比較して同じかどうかを判断する必要があるということでしょうか?
大抵の場合はどこかの列をの値を代表として(=ID代わり)比較して、更新前に存在したかどうかを判断できるものと想像しますけれど・・・?
(そのように利用できる列を、「IDにできる列」と表現しました)

添付図が判読できないのでわからないのですが、B列やC列のタイトルに「コード」の文字があるようですが、これって行に対してのID代わりにならない値ってことでしょうか?

>現状は秒単位まで出ている日付(D列)くらいしか思いあたりませんでした。
D列の値が使えるのならそれでもかまいませんが、「重複がない」ことと「更新前後で同じデータの日付は完全一致する」という条件を満たしていないとID代わりには利用できません。

ご質問文ではシート名もよくわからないので、No1のように抽象的な表現をするしかないのですけれど、無理矢理式っぽくしてみるのなら
それぞれが、別シートであるものとして、
=FILTER(更新後データ!A2:W5000,COUNTIF(更新前データ!D2:D5000,更新後データ!D2:D5000)=0,"")
みたいな感じになるはずです。
    • good
    • 0
この回答へのお礼

細かく指導して頂きましてありがとうございます。
とても勉強になりました。

大変心ぐるしいですが、
個人的にtatsumaru77様のご回答の方が、
今後のやりたいことにもつながるため、
そちらをベストアンサーにさせて頂きました。

ご指導頂きましてありがとうございます。

お礼日時:2023/06/02 16:37

No2です。


行が増える場合、添付図のように増えるケースもあるのでしょうか。
このような増え方もありえる場合は、緑の行が増えたことになるので、
2,5行を差分データにコピーすることになります。

又、更新前データ、更新後データには関数式が埋め込まれていますか?
「更新前と更新後の差分をVBAを使って抜き」の回答画像3
この回答への補足あり
    • good
    • 0

>単純に増えた分を抜き出したいと考えております。


添付図のように
単純に行が増えるだけなのでしょうか。
そうであれば、5,6行が増えた行なので、その行を差分データにコピーします。(5,6行の内容はチェックしません)
「更新前と更新後の差分をVBAを使って抜き」の回答画像2
    • good
    • 0

こんにちは



画像がほとんど識別できないので、以下は勝手な推測での回答です。
お門違いの場合はスルーしてください。

どこかに個別のIDにできるものがあるとして、
「更新データに存在するIDで更新前に存在しない行を抜き出す」
ということをなさりたいのかと推測しました。


>office365のエクセルを使用しております
とのことですので、抽出自体は関数でも可能です。
抽出結果を表示したい左上のセルに
 =FILTER(更新後データ範囲,COUNTIF(更新前ID列範囲,更新後ID列範囲)=0)
の式を入力すれば、そのまま上記の内容がスピルされます。

VBAでなさりたいのであれば、抽出範囲の左上のセルに、上記の式を代入すれば同じものが得られるはずと思います。
セルから関数を外したければ、
 結果のセル範囲.Value = 結果のセル範囲.Value
とすることで、固定値にすることができます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A