2023年3月10日金曜日

今更だけどChatgptやばい(二つの表のデータ差分を抽出するVBAが書ける)

今更だけどChatgptマジでやばいな。これコーディングだけやってる様な人の仕事マジでなくなるぞその内。

下記のコミュニケーション(らしきもの)が成立して、しかも成果物のコードがそれなりに動いてやがる。。。

以下実際の履歴。。。


問:

Excelで作成されている二つの表があります。それぞれの表は1行目がタイトル行になっており、カラム名は共通ですが、並び順はバラバラです。さらに各行のデータもほとんど同じですが、並び順はバラバラです。この二つの表のデータ差分を抽出する方法を教えてください。

回答:

Excelで二つの表のデータ差分を抽出するには、以下の手順を実行してください。

1. まず、差分を抽出したい二つの表を開きます。

2. 差分を抽出したいカラムを選択し、両方の表で同じ順序に並べます。

3. 差分を抽出するための空の表を作成し、共通のカラム名を1行目に記入します。

4. 1つ目の表の2行目以降を、2つ目の表の2行目以降と比較します。

5. 同じ行があった場合は何もしませんが、1つ目の表にしかない行があった場合は、その行を空の表に追加します。

6. 2つ目の表にしかない行があった場合は、その行を空の表に追加します。ただし、この場合は1つ目の表にないカラムには値が入らないように注意してください。

7. 1つ目の表と2つ目の表のすべての行を比較したら、空の表に残った行が、差分となります。

この方法では、カラム名が同じであること、そしてカラムの並び順が異なっていることを考慮しています。ただし、この方法では行数が多い場合に手間がかかるため、VLOOKUP関数やマクロなどを使って自動化する方法もあります。

問:
その手順をVBAで自動化してください

回答:

以下は、2つの表のデータ差分をVBAで自動化するサンプルコードです。このコードは、1つ目の表のデータを基準に、2つ目の表のデータを比較し、差分を抽出するものです。このコードは、2つの表が別々のワークシートにある場合に使用できます。

Sub Extract_Differences()
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim rng1 As Range, rng2 As Range, rng3 As Range
    Dim LastRow1 As Long, LastRow2 As Long
    Dim i As Long, j As Long
    Dim Found As Boolean
    
    '1つ目の表を基準にする
    Set ws1 = Worksheets("Table1")
    Set ws2 = Worksheets("Table2")
    Set ws3 = Worksheets("Differences")
    
    '1つ目の表のデータがある範囲を選択
    LastRow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
    Set rng1 = ws1.Range("A2:F" & LastRow1)
    
    '2つ目の表のデータがある範囲を選択
    LastRow2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row
    Set rng2 = ws2.Range("A2:F" & LastRow2)
    
    '結果を出力する範囲を選択
    Set rng3 = ws3.Range("A2:F2")
    
    'ヘッダーをコピー
    rng3.Value = rng1.Value
    
    '1つ目の表の各行について、2つ目の表に存在するかどうか検索
    For i = 1 To rng1.Rows.Count
        Found = False
        For j = 1 To rng2.Rows.Count
            If rng1.Cells(i, 1).Value = rng2.Cells(j, 1).Value Then
                Found = True
                Exit For
            End If
        Next j
        
        '2つ目の表に存在しない場合、結果に追加
        If Not Found Then
            Set rng3 = ws3.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
            rng3.Value = rng1.Cells(i, 1).Resize(1, 6).Value
        End If
    Next i
    
    '終了メッセージを表示
    MsgBox "データの比較が完了しました。", vbInformation
    
End Sub

このコードを実行する前に、以下の点に注意してください。

1つ目の表は、"Table1"というワークシートにあることを前提としています。2つ目の表は、"Table2"というワークシートにあることを前提としています。

結果は、"Differences"というワークシートに出力されます。このワークシートはあらかじめ作成しておく必要があります

結果、条件を満たすExcelファイルと2つの表を行列とも順序ばらけさしてテストしたらTable1にあって、Table2にない行のデータをちゃんとDifferencesシートに出力しおった。

恐るべしだわ。まぁ何度かやり直したり、微調整が必要だったりもあるし当面は人のチェックが外せないけど、とんでもない事には間違えない。

つか生産性もヤバい。調べながら作ったら半日くらいかかると思うけど、10分くらいで動いた。

これはちょっとマジで社会が変わるインパクトがある予感。

0 件のコメント:

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...