1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コピペ差異計算

Last updated at Posted at 2024-01-23

バイト先で見るための投稿。はじめはjavascriptとVBAのコードをchat gptに書かせた。そのままではエラーがでるので、結局は自分でコードを読んで大部分を修正した。いろいろと未熟なので、改善点を教えてくれると嬉しいです。
以下のように与えられたデータの差異計算をする。売り上げが0のタイトルは一方のデータでは表示されていない。

3.PNG

1.PNG

htmlで書かれた表が表示されたページで開発者ツールを開き、
4.PNG

コンソールに以下のコードをコピペ&実行すると

extractTableData.js
// <table>要素を取得// tableにidが与えられていたら、'table'を'#id'に変える。
var tableElement = document.querySelector('table');

// データを格納するための配列
var data = [];

// <table>内の各行を取得
var rows = tableElement.querySelectorAll('tr');

// 各行ごとに処理
rows.forEach(function(row) {
    var rowData = [];

    // 行内の各セルを取得
    var cells = row.querySelectorAll('td');

    // 各セルのテキストボックス内の初期値を取得して配列に追加
    cells.forEach(function(cell) {
        var inputElement = cell.querySelector('input');
        if (inputElement) {
            rowData.push(inputElement.getAttribute('value'));
        } else {
            rowData.push(cell.innerText);
        }
    });

    // 行のデータを配列に追加
    data.push(rowData);
    });
//データを表形式で表示(改善しました。@mogamoga1337さんありがとうございます。)
console.log(data.map(row => row.join('\t')).join('\n'));

表が出力される。

2.PNG

これをExcelの新しいシートにコピペし、「ホーム」→「検索と選択」→「置換」と進んで、「検索する文字列」に ' を入力し「置換後の文字列」を空欄にする。
範囲選択して「すべて置換」にすると ' が消せる。
6.PNG

Excelで与えられた方のファイルを開いて、IF文を使って売り上げ0のタイトルを抽出する。今回の表の場合は「=IF(C3=0,B3,"")」と「=IF(C3=0,0,"")」を入力してオートフィルを使えばいい。

5.PNG

抽出されたタイトルをコピペして、htmlによって与えられたデータと結合する。そして、2つのファイルをともに、「データ」→「フィルター」でタイトル順に並び変え、コピペして2つのデータを同じシートに表示させる。そうすると差異が計算できる。
7.PNG

よりデータが複雑だった場合の改善点

表が複数ある場合のjsのコード

extractTableData.js
// 全ての <table> 要素を取得
var tables = document.querySelectorAll('table');

// データを格納するための配列
var data = [];

// 各テーブルごとに処理
tables.forEach(function(table) {
    // 各テーブル内の各行を取得
    var rows = table.querySelectorAll('tr');

    // 各行ごとに処理
    rows.forEach(function(row) {
        var rowData = [];

        // 行内の各セルを取得
        var cells = row.querySelectorAll('td');

        // 各セルのテキストボックス内の初期値を取得して配列に追加
        cells.forEach(function(cell) {
            var inputElement = cell.querySelector('input');
            if (inputElement) {
                rowData.push(inputElement.getAttribute('value'));
            } else {
                rowData.push(cell.innerText);
            }
        });

        // 行のデータを配列に追加
        data.push(rowData);
    });
});

// データを表形式で表示
console.table(data);

同一タイトルが複数の行に分割されていた場合にそれらをまとめるVBAのコード(A列にタイトル、B列に売り上げがある場合)

Sub organizing_macro()
    Dim ws As Worksheet
    Dim newWs As Worksheet
    Dim lastRow As Long
    Dim currentRow As Long
    Dim currentCode As String
    Dim currentQuantity As Integer
    
    ' アクティブなシートを取得
    Set ws = ActiveSheet
    
    ' 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 出力用の新しいシートを作成
    Sheets.Add(After:=Sheets(Sheets.Count)).Name = "整理結果"
    Set newWs = Sheets("整理結果")
    
    ' 新しいシートにヘッダーをコピー
    ws.Rows(1).Copy Destination:=newWs.Rows(1)
    
    ' 初期化
    currentRow = 2
    
    ' データ整理ループ
    For i = 2 To lastRow
        ' タイトルと売り上げを取得
        currentCode = ws.Cells(i, 1).Value
        currentQuantity = ws.Cells(i, 2).Value
        
        ' 新しいシートに同じタイトルがあるかチェック
        Dim codeFound As Boolean
        codeFound = False
        
        For j = 2 To currentRow - 1
            If newWs.Cells(j, 1).Value = currentCode Then
                ' 一致する場合、売り上げを加算
                newWs.Cells(j, 2).Value = newWs.Cells(j, 2).Value + currentQuantity
                codeFound = True
                Exit For
            End If
        Next j
        
        ' 一致しない場合、新しい行にデータをコピー
        If Not codeFound Then
            ws.Rows(i).Copy Destination:=newWs.Rows(currentRow)
            currentRow = currentRow + 1
        End If
    Next i
    
    ' 不要な列を削除
    newWs.Columns(3).Delete
    
    ' 整理結果シートを選択
    newWs.Select
End Sub

これが
8.PNG
こう
9.PNG

二つの表をそれぞれシート1とシート2に表示させたときに、シート1に含まれるがシート2には含まれない商品を赤で強調する

Sub HighlightDifferences()

    Dim Sheet1 As Worksheet
    Dim Sheet2 As Worksheet
    Dim RowsCount1 As Long, RowsCount2 As Long
    Dim ProductCode1 As Range, ProductCode2 As Range
    Dim i As Long
    
    ' シートを設定
    Set Sheet1 = ThisWorkbook.Sheets("Sheet1") ' シート名を適切なものに変更
    Set Sheet2 = ThisWorkbook.Sheets("Sheet2") ' シート名を適切なものに変更
    
    ' 各シートの最終行を取得
    RowsCount1 = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    RowsCount2 = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
    
    ' 商品コードの列を設定
    Set ProductCode1 = Sheet1.Range("A2:A" & RowsCount1) ' 商品コードが入っている列を適切なものに変更
    Set ProductCode2 = Sheet2.Range("A2:A" & RowsCount2) ' 商品コードが入っている列を適切なものに変更
    
    ' 一方の表にしか存在しない商品を強調表示
    For i = 2 To RowsCount1
        If Application.WorksheetFunction.CountIf(ProductCode2, Sheet1.Cells(i, 1).Value) = 0 Then
            ' 商品コードがSheet2に存在しない場合、行を強調表示
            Sheet1.Rows(i).Interior.Color = RGB(255, 0, 0) ' 赤色で強調表示
        End If
    Next i

End Sub
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?