途中なんだけど、なんだか面倒になっちゃってもう公開しちゃえ。
公開したら、直さないわけにはいかんし。
Option Explicit
Sub createSQL(ByVal sh As Worksheet, ByVal flg As String)
Const SQL_INSERT As String = "INSERT INTO {1} ({2}) VALUES ({3});"
Const SQL_UPDATE As String = "UPDATE {1} SET {2} WHERE {3};"
Dim tbl As String 'テーブル名
Dim columns As Range 'カラム
Dim colType As Range '型
Dim colWhere As Range 'Where句
Dim value As String '値
Dim dataTopRow As Long, dataEndRow As Long 'データ先頭行, データ末尾行
Dim endRigthCol As Long
Dim sqlCol As String, sqlVal As String
Dim data As Range
Dim i As Long, j As Long
Dim buf As String, bufUpdSet As String, bufUpdWhere As String, bufWhere As String
Dim sqlInsert As String
Dim sqlUpdate As String
sqlInsert = SQL_INSERT
sqlUpdate = SQL_UPDATE
'テーブル名をセット
sqlInsert = Replace(sqlInsert, "{1}", sh.Range("D4").value)
sqlUpdate = Replace(sqlUpdate, "{1}", sh.Range("D4").value)
'最終列
endRigthCol = sh.Range("D5").End(xlToRight).Column
'カラム名
Set columns = sh.Range("D5:" & sh.Range("D5").End(xlToRight).Address)
'型
Set colType = sh.Range("D5:" & sh.Range("D5").End(xlToRight).Address).Offset(1, 0)
'Where句
Set colWhere = sh.Range("D5:" & sh.Range("D5").End(xlToRight).Address).Offset(2, 0)
dataTopRow = sh.Range("D8").Row 'Value行先頭
dataEndRow = sh.Cells(Rows.Count, 4).End(xlUp).Row 'value行末尾
'INSERT文用にカラム名を取得
For i = 1 To columns.Count
If (i = 1) Then
sqlCol = sqlCol & columns(1, i)
Else
sqlCol = sqlCol & ", " & columns(1, i)
End If
Next i
For i = dataTopRow To dataEndRow
sqlVal = ""
bufUpdSet = ""
bufWhere = ""
Set data = sh.Range(Cells(i, 4), Cells(i, endRigthCol))
For j = 1 To data.Count
buf = data(1, j)
If (colType(1, j) > "number") Then
buf = "'" & data(1, j) & "'"
End If
If (j = 1) Then
sqlVal = sqlVal & buf
Else
sqlVal = sqlVal & ", " & buf
End If
If (colWhere(1, j) = "○") Then
If bufWhere = "" Then
bufWhere = columns(1, j) & " = " & buf
Else
bufWhere = bufWhere & " AND " & columns(1, j) & " = " & buf
End If
End If
If bufUpdSet = "" Then
bufUpdSet = columns(1, j) & " = " & buf
Else
bufUpdSet = bufUpdSet & ", " & columns(1, j) & " = " & buf
End If
Next j
sh.Cells(i, 2) = Replace(Replace(sqlInsert, "{2}", sqlCol), "{3}", sqlVal)
sh.Cells(i, 3) = Replace(Replace(sqlUpdate, "{2}", bufUpdSet), "{3}", bufWhere)
Next i
End Sub