#【SQL】INSERT文を作成(EXCEL VBA)
**EXCEL(VBA)**にて、作成します。
VBAで作成するには、「開発タブ」の追加が別途必要です。
任意のシートに、
手順①:例えば任意のボタンをおき、VBAのコードを書きます。
Sub InsertSQL()
'---------------------------------------
'INSERT文を生成する。
'---------------------------------------
Dim rtnStr As String
rtnStr = createInsertSQLAll
'---------------------------------------
'出力する。
'---------------------------------------
Dim cbData As New DataObject
'DataObjectにメッセージを格納
cbData.SetText rtnStr
'DataObjectのデータをクリップボードに格納
cbData.PutInClipboard
End Sub
'=================================================================
'
'createInsertSQLAll()メソッド
'
'=================================================================
Function createInsertSQLAll() As String
'生成したINSERT文
Dim insStr As String
'---------------------------------------
'Ctrl + A で、全範囲を選択する。
'---------------------------------------
Dim myRange As Range
Dim keyWord As String
keyWord = "テーブル名"
'=========================================================
'
'「選択されているシート」から、「データ」を取得します。
'
'=========================================================
'---------------------------------------
'「選択されているシート」を取得する。
'---------------------------------------
Dim selectedSheet As Worksheet '「選択されているシート」
Set selectedSheet = ActiveSheet
Set myRange = selectedSheet.Cells '「選択されているシート」の全範囲を選択する。
'---------------------------------------
'「テーブルの位置」を特定する。
'---------------------------------------
Dim allCellData As Range '「選択されているシート」の全範囲を選択する。
Dim firstAddress As String '最初のセルのアドレス
With selectedSheet.Cells
'「"テーブル名"」の入力されたセルを探す
Set allCellData = myRange.Find(keyWord, LookAt:=xlWhole)
'条件に当てはまるセルがあるかどうかを判定
If Not allCellData Is Nothing Then
'最初のセルのアドレスを覚える
firstAddress = allCellData.Row
'INSERT文を生成する。
insStr = cellData(firstAddress)
'-----------------------------------------------------
'繰返し検索し、条件を満たすすべてのセルを検索する
'-----------------------------------------------------
Dim preAddress As Integer '1個前の行数
Dim nextAddress As Integer '現在の行数
Do
preAddress = nextAddress
Set allCellData = .FindNext(allCellData)
'該当するデータ(行数)がなければ、ループを抜ける
If allCellData Is Nothing Then Exit Do
nextAddress = allCellData.Row
'行数を比較し、前の行に戻ったタイミングで、ループを抜ける
If preAddress > nextAddress Then Exit Do
'「最初のセルのアドレス」と異なる時は、処理を続ける
If allCellData.Row <> firstAddress Then
'INSERT文を追記する
insStr = insStr & vbCrLf & cellData(allCellData.Row)
End If
'このコードは、実行されていない。。
Loop Until allCellData.Address = firstAddress
End If
End With
'---------------------------------------
'生成したINSERT文を、戻り値にセットする。
'---------------------------------------
createInsertSQLAll = insStr
End Function
'=================================================================
'
'cellData()メソッド
'「INSERT文」を生成します。
'
'=================================================================
Function cellData(ByVal cellVal As Integer) As String
Dim selectedSheet As Worksheet '「選択されているシート」
Set selectedSheet = ActiveSheet
Dim myRange As Range
Set myRange = selectedSheet.Cells '「選択されているシート」の全範囲を選択する。
'表のセル範囲を選択
Dim myObj As Range
Dim str As String
'「"D" & cellVal」:「セル位置の文字列」
str = "D" & cellVal
'---------------------------------------
'「表全体の行数」を取得する
'---------------------------------------
Dim rowCount As Integer
With ActiveSheet.Range("D" & cellVal).CurrentRegion
rowCount = .Rows.Count
End With
'---------------------------------------
'表の7行目以降を最終行まで、1行ずつデータ取得します。
'INSERT文を生成します。
'---------------------------------------
Dim cellStr As String
Dim cellValues As Variant
'--------------------------
'「テーブル名」を取得する。
'--------------------------
With ActiveSheet.Range("D" & cellVal).CurrentRegion
'表の2行目を選択する(物理テーブル名)
.Rows(2).Select
End With
'「選択した行」の範囲を取得する
cellStr = Selection.Address
cellStr = Replace(cellStr, "$", "")
Dim tableName As String
tableName = selectedSheet.Range("D" & cellVal + 1).Value
'---------------------------------------
'「INSERT文」を生成する。
'---------------------------------------
'「選択範囲」のカラム数を取得する
Dim colCount As Integer
With ActiveSheet.Range("D" & cellVal).CurrentRegion
colCount = .Columns.Count
End With
'rowCount:表の行数
Dim i As Integer
'データ型を判定
Dim flagStr As String
Dim intFlag As Boolean
'---------------------------------------
'表を1行ずつ
'---------------------------------------
For i = 6 To rowCount - 1
'---------------------------------------
'「INSERT」する値を、追加する
'---------------------------------------
'「INSERT文の定型文」をセット
Dim insStart As String
insStart = " INSERT INTO " & tableName & " VALUES ( "
Dim insEnd As String
insEnd = " );"
'戻り値の「INSERT文」
Dim insResultStr As String
'「INSERT」する値を追加する
Dim insStr As String
'colCount:表のカラム数
Dim j As Integer
For j = 2 To colCount
'---------------------------------------------------
'「データ型」を判定します。
'---------------------------------------------------
flagStr = selectedSheet.Range(Chr(j + 66) & (cellVal + 3))
If flagStr = "bigint" Or flagStr = "int" Or flagStr = "smallint" Or flagStr = "tinyint" Or flagStr = "bit" Or flagStr = "decimal" Or flagStr = "numeric" Or flagStr = "float" Or flagStr = "real" Then
intFlag = True
Else
intFlag = False
End If
'「INSERT文」を生成します。
'Chr(i):大文字「A-Z」を表す
If intFlag = True Then '「数値型」の時
If j = 2 Then
insStr = " " & selectedSheet.Range(Chr(j + 66) & (cellVal + i)).Value & " "
Else
insStr = insStr & ", " & selectedSheet.Range(Chr(j + 66) & (cellVal + i)).Value & " "
End If
Else
If j = 2 Then
insStr = " '" & selectedSheet.Range(Chr(j + 66) & (cellVal + i)).Value & " '"
Else
insStr = insStr & ", '" & selectedSheet.Range(Chr(j + 66) & (cellVal + i)).Value & " '"
End If
End If
Next
'---------------------------------------------------
'「INSERT文」を完成させる。
'INSERT INTO テーブル名 VALUES ( ‘値1′ [ , ‘値2’ ]・・・);
'---------------------------------------------------
insResultStr = insResultStr & insStart & insStr & insEnd & vbCrLf
Next
'戻り値「INSERT文」を返す
cellData = insResultStr
End Function
手順②:以下のように、「C列からはじまるデータの表」を作成します。
(ここは、重要ですw)
(表は、同じシート内に複数おけます。表と表の間は、1行あけてください。)
({ }内に、自分のデータを記入します。{}は必要ありません。))
テーブル名 | {テーブル名} | |
---|---|---|
物理名 | {物理テーブル名} | |
カラム名 | {カラム名_1} | {カラム名_2} |
データ型 | int | string |
データサイズ | 4 | 200 |
NOTNULL | NotNull | |
1 | This | |
2 | makes | |
3 | SQL-INSERT |
手順③:「ボタン押下」すると、クリップボードにINSERT文が生成されます。
ペーストして、完成です。
※ 注意 ※
・カラムは、「数値型 or それ以外」しか対応していません。