【SQL】INSERT文を作成（EXCEL VBA)

#【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   '１個前の行数
      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行目以降を最終行まで、１行ずつデータ取得します。
  '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
  
  '---------------------------------------
  '表を１行ずつ
  '---------------------------------------
  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}**     |    **{カラム名_2}**    |
| **データ型**         |        **int**        |      **string**      |
| **データサイズ**     |         **4**         |       **200**        |
| **NOTNULL**          |      **NotNull**      |                    |
|                  |        1            |        This        |
|                  |        2            |        makes       |
|                  |        3            |      SQL-INSERT    |

	
**手順③**：「ボタン押下」すると、クリップボードにINSERT文が生成されます。
        ペーストして、完成です。
        
**※ 注意 ※**
・カラムは、「数値型 or それ以外」しか対応していません。