0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

#【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 それ以外」しか対応していません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?