2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ExcelからINSERT文を生成するアドインを作ってみた

Last updated at Posted at 2022-04-10

はじめに

試験工程などで、データ準備のために大量のINSERT文を作成する必要があるかと思います。

そんな時に、INSERT文を簡単に作成できると便利だと思い、ExcelのデータからINSERT文を生成できる独自の関数を作成してみました。

概要

  • VBAでINSERT文を生成する関数
  • 作成した関数をアドイン化し、Excel上で=作成した関数名(引数)の形式で実行できるようにする
  • DBMSはpostgresqlに対応
  • 値に関してはデータ型に応じて、'(シングルクォーテーション)をつけるなり、適切にキャストさせる

使い方

セル上に=PG_CREATEINSERTと記載し、引数に以下を指定します。

引数指定例
 =PG_CREATEINSERT(空白を無視するかどうか(true or false), テーブル名, カラム名, 値, データ型)
 =PG_CREATEINSERT(空白を無視するかどうか(true or false), テーブル名, カラム名, 値)

実行例

作成したPG_CREATEINSERT関数の実行例は以下です。

1.png

実行結果

2.png

実行結果を見てもわかる通り、セルの値からINSERT文が作成できていることを確認できました。
指定したデータ型に応じて、値の出力形式が変動します。

データ型 出力形式
文字型 セルの値をシングルクォーテーションで囲い出力
bytea型 '\x + セルの値 + '::byteaの形式で出力
上記以外 セルの値をそのまま出力

ソースコード

pg_createInsert.xlam

'*********************************************************
'[概要]
' 指定したセルの値をもとに、postgresqlに対応したINSERT文を出力します
'
'[使い方]
' =PG_CREATEINSERT(空白を無視するかどうか, テーブル名, カラム名, 値, データ型)
' =PG_CREATEINSERT(空白を無視するかどうか, テーブル名, カラム名, 値)
'
'[引数]
' Ignore:空白を無視するかどうか
' TableName:テーブル名
' par():可変長引数(カラム名, 値, データ型の順番で指定される想定)
'*********************************************************
Function PG_CREATEINSERT(Ignore As Boolean, TableName As String, ParamArray par() As Variant)
   
    Dim rowVal As String: rowVal = ""
    Dim setVal As String: setVal = ""
    Dim colmnName As String: colmnName = ""
    Dim SetValues As String: SetValues = ""
   
    Dim colCount As Integer: colCount = 0
    Dim valCount As Integer: valCount = 0
    Dim parCount As Integer: parCount = UBound(par) + 1 '可変長引数の数
   
    Dim colmnArr() As String
    Dim typeArr() As String
    Dim valueArr() As String
   
    Const Delim As String = ","
    PG_CREATEINSERT = "" '戻り値

   
    '引数チェック
    If parCount <= 1 Or parCount >= 4 Then
        PG_CREATEINSERT = CVErr(xIErrNum)
        Exit Function
    End If
   
    'カラム名設定
    colmnArr() = setParam(par(0))
    '値設定
    valueArr() = setParam(par(1))
    'データ型設定
    If parCount = 3 Then
        typeArr() = setParam(par(2))
    End If
   
    'INSERT文作成
    'カラム名
    For i = LBound(colmnArr) To UBound(colmnArr)
        If colmnArr(i) <> "" Or Ignore = False Then
            colmnName = colmnName & Delim & colmnArr(i)
            colCount = colCount + 1
        End If
    Next
   
    '値
    For i = LBound(valueArr) To UBound(valueArr)
        If valueArr(i) <> "" Or Ignore = False Then
            rowVal = Replace(valueArr(i), """", "")
            If Not (LCase(rowVal) = "null" Or rowVal = "") Then
                If parCount = 3 Then
                    'データ型が存在する場合、データ型に合わせて値を設定する
                    If typeArr(i) Like "*char*" Or LCase(typeArr(i)) = "text" Then
                        '文字列型
                        setVal = "'" & rowVal & "'"
                    ElseIf LCase(typeArr(i)) = "bytea" Then
                        'bytea型
                        setVal = "'\x" & rowVal & "'" & "::bytea"
                    Else
                        '上記以外(数値型など)
                        setVal = rowVal
                    End If
                Else
                    setVal = "'" & rowVal & "'"
                End If
            Else
                setVal = "NULL"
            End If
            SetValues = SetValues & Delim & setVal
            valCount = valCount + 1
        End If
    Next
   
    If colCount <> valCount Then
        PG_CREATEINSERT = CVErr(xIErrNum)
        Exit Function
    End If
   
    'INSERT文生成
    PG_CREATEINSERT = "INSERT INTO " & TableName _
                    & "(" & Mid(colmnName, Len(Delim) + 1) & ")" _
                    & " VALUES " _
                    & "(" & Mid(SetValues, Len(Delim) + 1) & ")" & ";"

End Function

'*********************************************************
'[概要]
' 可変長引数の各要素を配列に設定して返却する関数
'*********************************************************
Function setParam(paramRange As Variant)
    Dim rtnArr() As String
    If TypeName(paramRange) = "Range" Then
        ReDim rtnArr(paramRange.Columns.Count - 1)
        For i = 0 To UBound(rtnArr)
            rtnArr(i) = paramRange(1, i + 1).Value
        Next
        setParam = rtnArr()
    Else
        ReDim rtnArr(0)
        rtnArr(0) = CStr(paramRange)
        setParam = rtnArr()
    End If

End Function

アドイン設定方法

Excel上で今回作成した関数を=作成した関数名(引数)の形式で利用するためには、アドインを作成して登録する必要があります。

手順に関しては【EXCEL VBA】自作のユーザー定義関数をアドイン化する アドイン作成が参考になりますので、そちらを参照してください。

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?