4
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?

More than 5 years have passed since last update.

VBAでテストデータ作成

Last updated at Posted at 2017-05-29

業務上テストデータが多々必要になりますが、
ツールをDLできないことが多いため、エクセルからシンプルにInsertを発行するVBAを記載します。

何処かにボタンを配置。
定数定義部の位置に物理名等記載
シートごとにSQLファイルが生成(UTF BOMなし)

バグ等あると思いますが、ご了承下さい。
※MySqlをターゲットにしていますが、ほとんど変わらないと思います。

'定数宣言
Private Const INSERT As String = "insert into "
Private Const VALUES As String = ") values ("
Private Const INSERT_END As String = " );"
Private Const SQL_EXTENSION As String = ".sql"
Private Const START_LINE As Integer = 6
Private Const START_COLUMN As Integer = 2
Private Const PHYSICAL_LINE As Integer = 3
Private Const TYPE_LINE As Integer = 4

'insert作る
Sub Insert作成ボタン()
    Dim mySheet As Worksheet
    Dim myRow As Long

    myRow = 1
    
    For Each mySheet In Worksheets
        If mySheet.Name = "top" Then GoTo Next_i
        Call outputCsv(mySheet)
Next_i:
    Next
End Sub

Sub outputCsv(mySheet As Worksheet)
    With mySheet.UsedRange
        MaxRow = .Rows(.Rows.Count).row
        MaxCol = .Columns(.Columns.Count).Column
    End With
    
    Dim currentLine As Integer
    Dim outputDir As String
    Dim schema As String
    
    currentLine = START_LINE
    'スキーマと出力フォルダ
    schema = Worksheets("top").Cells(1, 2).Value
    outputDir = Worksheets("top").Cells(2, 2).Value
    
    'ファイル出力準備(UTF-8)
    Dim output As ADODB.Stream
    Set output = New ADODB.Stream

    output.Type = adTypeText
    output.Charset = "UTF-8"
    output.Open

    
    Do While currentLine <= MaxRow
        If mySheet.Cells(currentLine, 1).Value = "" Then GoTo Next_Loop
        Dim buf As String
        buf = ""
        Dim currentColumn As Integer
        currentColumn = START_COLUMN
        Dim columnCount As Integer
        
        Do While mySheet.Cells(PHYSICAL_LINE, currentColumn).Value <> ""
            If currentColumn = START_COLUMN Then
                buf = INSERT & schema & "." & mySheet.Cells(1, 2).Value & " (" & mySheet.Cells(PHYSICAL_LINE, currentColumn).Value
            Else
                buf = buf & ", " & mySheet.Cells(PHYSICAL_LINE, currentColumn)
            End If
            currentColumn = currentColumn + 1
            columnCount = currentColumn
        Loop
        buf = buf & VALUES
        currentColumn = START_COLUMN
        
        Do While currentColumn < columnCount
            If currentColumn = START_COLUMN Then
                buf = buf & mapping(mySheet.Cells(currentLine, currentColumn).Value, mySheet.Cells(TYPE_LINE, currentColumn).Value)
            Else
                buf = buf & ", " & mapping(mySheet.Cells(currentLine, currentColumn).Value, mySheet.Cells(TYPE_LINE, currentColumn).Value)
            End If
            currentColumn = currentColumn + 1
        Loop
        buf = buf & INSERT_END & vbLf
        
        output.WriteText buf

  
        currentLine = currentLine + 1
Next_Loop:
    Loop
    
    Dim filename As String
    filename = ActiveWorkbook.Path & "\" & mySheet.Cells(1, 2).Value & SQL_EXTENSION
    
    '保存前にBOMを削除
    Dim byteData() As Byte
    output.Position = 0
    output.Type = adTypeBinary
    output.Position = 3
    byteData = output.Read
    output.Close
    output.Open
    output.Write byteData

    output.SaveToFile filename, adSaveCreateOverWrite
    output.Close
    Set output = Nothing
End Sub

Function mapping(word As String, kind As String) As String
    If LCase(kind) = "string" Or LCase(kind) = "varchar" Or LCase(kind) = "varchar2" Or LCase(kind) = "char" Then
        mapping = """" & word & """"
    ElseIf LCase(kind) = "int" Or LCase(kind) = "bigint" Then
        mapping = word
    ElseIf LCase(kind) = "datetime" Then
        mapping = "STR_TO_DATE(" & word & ",""YYYYMMDD HH:MI:SS"")"
    Else
        MsgBox ("未定義のカラム名があります:" & kind)
        Application.Quit
    End If
End Function
4
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
4
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?