Sub GenerateInsertStatementsToFile()
Dim ws As Worksheet
Dim tableName As String
Dim colNames As Variant
Dim dataTypes As Variant
Dim lastRow As Long
Dim lastCol As Long
Dim i As Long, j As Long
Dim sql As String
Dim outputFileName As String
Dim fso As Object
Dim ts As Object
Dim filePath As String
Set ws = ThisWorkbook.Sheets("Sheet1") ' データがあるシート名を指定してください
tableName = ws.Range("B2").Value
' 最終列を取得
lastCol = ws.Cells(3, ws.Columns.Count).End(xlToLeft).Column
' カラム名とデータ型を取得
colNames = ws.Range(ws.Cells(3, 1), ws.Cells(3, lastCol)).Value
dataTypes = ws.Range(ws.Cells(4, 1), ws.Cells(4, lastCol)).Value
' 最終行を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 出力ファイル名を設定
outputFileName = "insert_" & tableName & ".sql"
' ファイルパスを設定(この例では、現在のブックと同じディレクトリ)
filePath = ThisWorkbook.Path & "\" & outputFileName
' ファイルシステムオブジェクトを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' 既存のファイルがある場合は削除
If fso.FileExists(filePath) Then
fso.DeleteFile filePath
End If
' テキストストリームを作成
Set ts = fso.CreateTextFile(filePath, True, False) ' 第三引数はUnicodeを指定(FalseでANSI)
' データ行ごとにINSERT文を生成
For i = 5 To lastRow
sql = "INSERT INTO " & tableName & " ("
' カラム名を追加
For j = 1 To UBound(colNames, 2)
sql = sql & colNames(1, j)
If j < UBound(colNames, 2) Then
sql = sql & ", "
End If
Next j
sql = sql & ") VALUES ("
' 値を追加
For j = 1 To UBound(dataTypes, 2)
Dim value As Variant
value = ws.Cells(i, j).Value
Select Case LCase(dataTypes(1, j))
Case "int", "integer", "float", "double", "decimal"
If IsNumeric(value) Then
sql = sql & value
Else
sql = sql & "NULL"
End If
Case "date", "datetime", "timestamp"
If IsDate(value) Then
sql = sql & "'" & Format(value, "yyyy-mm-dd hh:nn:ss") & "'"
Else
sql = sql & "NULL"
End If
Case Else ' 文字列型
sql = sql & "'" & Replace(value, "'", "''") & "'"
End Select
If j < UBound(dataTypes, 2) Then
sql = sql & ", "
End If
Next j
sql = sql & ");"
' SQL文をファイルに書き込む
ts.WriteLine sql
Next i
' テキストストリームを閉じる
ts.Close
MsgBox "SQL文の生成が完了しました。ファイル名:" & outputFileName
End Sub
Sub GenerateInsertStatementsToFile()
Dim ws As Worksheet
Dim tableName As String
Dim colNames As Variant
Dim dataTypes As Variant
Dim lastRow As Long
Dim lastCol As Long
Dim i As Long, j As Long
Dim sql As String
Dim outputFileName As String
Dim fso As Object
Dim ts As Object
Dim filePath As String
Set ws = ThisWorkbook.Sheets("Sheet1") ' データがあるシート名を指定してください
tableName = ws.Range("B2").Value
' 最終列を取得
lastCol = ws.Cells(3, ws.Columns.Count).End(xlToLeft).Column
' カラム名とデータ型を取得
colNames = ws.Range(ws.Cells(3, 1), ws.Cells(3, lastCol)).Value
dataTypes = ws.Range(ws.Cells(4, 1), ws.Cells(4, lastCol)).Value
' 最終行を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 出力ファイル名を設定
outputFileName = "insert_" & tableName & ".sql"
' ファイルパスを設定(この例では、現在のブックと同じディレクトリ)
filePath = ThisWorkbook.Path & "\" & outputFileName
' ファイルシステムオブジェクトを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' 既存のファイルがある場合は削除
If fso.FileExists(filePath) Then
fso.DeleteFile filePath
End If
' テキストストリームを作成
Set ts = fso.CreateTextFile(filePath, True, False) ' 第三引数はUnicodeを指定(FalseでANSI)
' データ行ごとにINSERT文を生成
For i = 5 To lastRow
sql = "INSERT INTO " & tableName & " ("
' カラム名を追加
For j = 1 To UBound(colNames, 2)
sql = sql & colNames(1, j)
If j < UBound(colNames, 2) Then
sql = sql & ", "
End If
Next j
sql = sql & ") VALUES ("
' 値を追加
For j = 1 To UBound(dataTypes, 2)
Dim value As Variant
value = ws.Cells(i, j).Value
Select Case LCase(dataTypes(1, j))
Case "int", "integer", "float", "double", "decimal"
If IsNumeric(value) Then
sql = sql & value
Else
sql = sql & "NULL"
End If
Case "boolean", "bool"
' Boolean型の処理
If LCase(CStr(value)) = "true" Or value = 1 Then
sql = sql & "1"
ElseIf LCase(CStr(value)) = "false" Or value = 0 Then
sql = sql & "0"
Else
sql = sql & "NULL"
End If
Case "date", "datetime", "timestamp"
If IsDate(value) Then
sql = sql & "'" & Format(value, "yyyy-mm-dd hh:nn:ss") & "'"
Else
sql = sql & "NULL"
End If
Case Else ' 文字列型
sql = sql & "'" & Replace(value, "'", "''") & "'"
End Select
If j < UBound(dataTypes, 2) Then
sql = sql & ", "
End If
Next j
sql = sql & ");"
' SQL文をファイルに書き込む
ts.WriteLine sql
Next i
' テキストストリームを閉じる
ts.Close
MsgBox "SQL文の生成が完了しました。ファイル名:" & outputFileName
End Sub