読者です 読者をやめる 読者になる 読者になる

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 とかに割り当てて、

  1. Sheet 1 にリファクタリング対象の SQL を実行した結果を貼り付ておく
  2. リファクタリングして、実行結果をコピー
  3. Sheet 2 で Ctrl + Q

すると、Sheet 2 の A1 の背景色が緑 (成功) か赤 (失敗) になる。
また、失敗の場合は値が異なるセルの背景色が赤くなる。


あとは 2 と 3 を回しながら SQL を修正していけばいい感じ。
あ、分かってるとは思うけどこれ使うのは自己責任でお願いしますねー。