備忘録。はじめはjavascriptとVBAのコードをchat gptに書かせた。そのままではエラーがでるので自分でコードを読んで修正した。いろいろと未熟なので、改善点を教えてくれると嬉しいです。
以下のように与えられたデータの差異計算をする。売り上げが0のタイトルは一方のデータでは表示されていない。
htmlで書かれた表が表示されたページで開発者ツールを開き、
コンソールに以下のコード(chat gptに書かせた)をコピペ&実行すると
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'));
表が出力される。
これをExcelの新しいシートにコピペし、「ホーム」→「検索と選択」→「置換」と進んで、「検索する文字列」に ' を入力し「置換後の文字列」を空欄にする。
範囲選択して「すべて置換」にすると ' が消せる。
Excelで与えられた方のファイルを開いて、IF文を使って売り上げ0のタイトルを抽出する。今回の表の場合は「=IF(C3=0,B3,"")」と「=IF(C3=0,0,"")」を入力してオートフィルを使えばいい。
抽出されたタイトルをコピペして、htmlによって与えられたデータと結合する。そして、2つのファイルをともに、「データ」→「フィルター」でタイトル順に並び変え、コピペして2つのデータを同じシートに表示させる。そうすると差異が計算できる。
よりデータが複雑だった場合の改善点
表が複数ある場合の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 整理マクロ()
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
二つの表をそれぞれシート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