Excel を使って SQL をリファクタリング
結果が変わっていないことを確認しながら SQL をリファクタリングするために、EXCEL - マクロ・シート間の照合 - Office系ソフト - 教えて!gooを参考にマクロを組んでみた。
Function HasDiff_Expect_Actual() As Boolean HasDiff_Expect_Actual = False ' 必要な情報の取得 Set EXPECT_SHEET = ActiveSheet.Previous Dim END_OF_ROW, END_OF_COL As Integer END_OF_ROW = EXPECT_SHEET.UsedRange.Rows.Count END_OF_COL = EXPECT_SHEET.UsedRange.Columns.Count ' アクティブ部分を比較 Dim col, row As Integer For col = 1 To END_OF_COL For row = 1 To END_OF_ROW ' セルの内容が異なるならそのセルを赤に If ActiveSheet.Cells(row, col).Value <> EXPECT_SHEET.Cells(row, col).Value Then ActiveSheet.Cells(row, col).Interior.ColorIndex = 3 HasDiff_Expect_Actual = True End If Next Next End Function Function HasDiff_Actual_Expect() As Boolean HasDiff_Actual_Expect = False ' 必要な情報の取得 Dim END_OF_ROW, END_OF_COL As Integer END_OF_ROW = ActiveSheet.UsedRange.Rows.Count END_OF_COL = ActiveSheet.UsedRange.Columns.Count Set EXPECT_SHEET = ActiveSheet.Previous ' アクティブ部分を比較 Dim col, row As Integer For col = 1 To END_OF_COL For row = 1 To END_OF_ROW ' セルの内容が異なるならそのセルを赤に If ActiveSheet.Cells(row, col).Value <> EXPECT_SHEET.Cells(row, col).Value Then ActiveSheet.Cells(row, col).Interior.ColorIndex = 3 HasDiff_Actual_Expect = True End If Next Next End Function Sub CmpSheets() ' まずはシート内データを全てクリア ActiveSheet.UsedRange.Clear ' 移動してクリップボード内のデータを貼り付け ActiveSheet.Cells(1, 1).Select ActiveSheet.Paste ' 貼り付け後に範囲選択状態になっているので解除 ActiveSheet.Cells(1, 1).Select ' 比較 Dim hasDiff As Boolean hasDiff = HasDiff_Expect_Actual() Or HasDiff_Actual_Expect() ' 結果をA1に表示(成功:緑、失敗:赤) If hasDiff Then ActiveSheet.Cells(1, 1).Interior.ColorIndex = 3 Else ActiveSheet.Cells(1, 1).Interior.ColorIndex = 4 End If End Sub
これを Ctrl + Q とかに割り当てて、
すると、Sheet 2 の A1 の背景色が緑 (成功) か赤 (失敗) になる。
また、失敗の場合は値が異なるセルの背景色が赤くなる。
あとは 2 と 3 を回しながら SQL を修正していけばいい感じ。
あ、分かってるとは思うけどこれ使うのは自己責任でお願いしますねー。