zoukankan      html  css  js  c++  java
  • VBA来实现已存在的数据库,取得所有表的结构

    问题描述

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

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

    在window7 64位系统上面可能会出现错误,出错的原因是因为mysql的驱动问题,你需要安装window7的32位的MySQL驱动。这样就不会出现问题。

    在window10上面则没有这种问题。

    说明

    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='XXX_XXX_XXX' 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

    最总实现的效果:

  • 相关阅读:
    linux上的工具或软件
    百度分享插件怎么取消鼠标放在图片上出现的分享条
    常用的Lambda表达式
    IDEA安装使用Lombok插件
    Spring cloud Eureka错误锦集(二)
    Spring cloud Eureka错误锦集(一)
    Navicat破解
    手动添加jar包到本地仓库
    Markdown常用语法
    Java中的位运算符
  • 原文地址:https://www.cnblogs.com/killclock048/p/9429778.html
Copyright © 2011-2022 走看看