VBA来实现已存在的数据库,取得所有表的结构

Posted killclock048

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA来实现已存在的数据库,取得所有表的结构相关的知识,希望对你有一定的参考价值。

问题描述

用VBA来取出mysql数据库中的所有表的结构后生成一个Excel的文档

首先创建MySQL的数据源,如何创建数据源在前章已经写过,之后把下面的信息填写上即可

技术分享图片

说明

DSN是你所创建的数据源的名称

SERVER是你本地的数据库

DB是你的数据库的名称

UID是登入数据库的用户名

PWD是登入数据库的密码

SCHEMA是你所创建的数据库的SCHEMA

之后在MysqlDbTable按钮下写入下面的代码即可

----------------mysqlからテーブル一覧出力---------------------------
Private Sub getMysqlDbTeble_Click()

    Dim fiStr As String
    Dim dsnStr As String
    Dim serverStr As String
    Dim dbStr As String
    Dim uidStr As String
    Dim pwdStr As String
    Dim schemaStr As String
    
    Dim sheet As Worksheet
    Set sheet = ThisWorkbook.Sheets("Sheet1")
    dsnStr = sheet.Range("C2")
    serverStr = sheet.Range("C3")
    dbStr = sheet.Range("C4")
    uidStr = sheet.Range("C5")
    pwdStr = sheet.Range("C6")
    schemaStr = sheet.Range("C7")


    fiStr = ThisWorkbook.Path & "QR_DBテーブル一覧.xlsx"
    Dim wb As Workbook
    Set wb = Workbooks.Open(fiStr)
    
    Dim sht As Object
    Set sht = wb.Sheets("テーブル一覧")
    sht.Range("A3:D" & sht.UsedRange.Rows.Count) = ""
    
    MySql接続
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    
    テーブル情報取得
    conn.ConnectionString = "DSN=" & dsnStr & ";Server=" & serverStr & ";DB=" & dbStr & ";UID=" & uidStr & ";PWD=" & pwdStr & ";OPTION=3;"

    sqlStr = "select TABLE_NAME, TABLE_COMMENT from information_schema.tables where table_schema=‘" & schemaStr & ""
    conn.Open connStr

    Set rs = conn.Execute(sqlStr)
    
    Dim index As Integer
    index = 3
    While Not rs.EOF
         sht.Range("A" & index) = index - 2
         sht.Range("B" & index) = rs!TABLE_NAME
         sht.Range("C" & index) = rs!TABLE_COMMENT
        
        テーブル定義情報
        Dim shtName As String
        shtName = tebleInfo(conn, wb, rs!TABLE_NAME, rs!TABLE_COMMENT, index)
        
        sht.Hyperlinks.Add Anchor:=sht.Range("B" & index), Address:="", SubAddress:="" & shtName & "" & "!C2"
        rs.MoveNext
        index = index + 1
    Wend
    
    rs.Close: Set rs = Nothing
    conn.Close: Set conn = Nothing
    wb.Close savechanges:=False
    
    MsgBox "完了"
End Sub

----------------mysqlからテーブル定義出力---------------------------
Function tebleInfo(connTable As ADODB.Connection, wbTable As Workbook, tableNm As String, tableComment As String, idx As Integer)


    Dim rsTable As ADODB.Recordset
    Set rsTable = New ADODB.Recordset
    
    検索テーブル定義情報
    sqlStr = "select COLUMN_NAME, COLUMN_COMMENT, COLUMN_KEY, COLUMN_TYPE, COLUMN_DEFAULT ,IS_NULLABLE  from information_schema.columns where TABLE_SCHEMA=‘zhd_sale_demo‘ and TABLE_NAME = ‘" & tableNm & ""
    Set rsTable = connTable.Execute(sqlStr)
    
    
    Worksheets("テンプレート").Copy before:=Worksheets("テンプレート")
    
    シート名の長さが31文字以内
    Dim sheetNm As String
    If Len(tableNm) > 31 Then
        sheetNm = Right(tableNm, 31)
    Else
        sheetNm = tableNm
    End If
   
    シート名存在チェック
    Dim flag As Boolean
    flag = SheetIsExist(wbTable, sheetNm)
    If flag Then
        Application.DisplayAlerts = False
        シート名存在したら、削除
        wbTable.Sheets(sheetNm).Delete
        Application.DisplayAlerts = True

    End If
    
    ActiveSheet.Name = sheetNm
    Dim shtTable As Object
    Set shtTable = ActiveSheet
    shtTable.Range("C2") = tableNm
    shtTable.Range("E2") = tableComment
    
    取得した
    Dim indexTable As Integer
    indexTable = 7
    While Not rsTable.EOF
        No
        shtTable.Range("A" & indexTable) = indexTable - 6
        項目物理名(EN)
        shtTable.Range("B" & indexTable) = rsTable!COLUMN_NAME
        項目論理名(CH)
        shtTable.Range("C" & indexTable) = rsTable!COLUMN_COMMENT
        KEY
        shtTable.Range("D" & indexTable) = rsTable!COLUMN_KEY
        属性
        shtTable.Range("E" & indexTable) = rsTable!COLUMN_TYPE
        黙認
        shtTable.Range("F" & indexTable) = rsTable!COLUMN_DEFAULT
        NULL
        shtTable.Range("G" & indexTable) = rsTable!IS_NULLABLE
        rsTable.MoveNext
        indexTable = indexTable + 1
    Wend
    tebleInfo = sheetNm
End Function


Function SheetIsExist(wbCheck As Workbook, shtNm As String)

    SheetIsExist = False
    On Error GoTo lab1
    Set shtSheet = wbCheck.Sheets(shtNm)
    If shtSheet Is Nothing Then
        SheetIsExist = False
    Else
        SheetIsExist = True
    End If
    
    Set shtSheet = Nothing
    Exit Function

lab1:
    SheetIsExist = False
End Function

 

最总实现的效果:

技术分享图片

技术分享图片

以上是关于VBA来实现已存在的数据库,取得所有表的结构的主要内容,如果未能解决你的问题,请参考以下文章

线性表的链式存储(C代码实现)

在excel中如何用VBA取得每页的行数?

Java数据结构学习笔记之一线性表的存储结构及其代码实现

EXCEL中利用VBA一次性撤销与保护多个工作表的问题?

HashMap7浅析

mysql查询一个列名都存在于哪些表