zoukankan      html  css  js  c++  java
  • excel的宏与VBA实践——建表语句

    一、建表语句

      不带分区版本:V1.0:

    Sub createTableDDL()
        '自动创建建表语句
        '定义换行和TAB
        Ln = Chr(13) + Chr(10)
        TB = Chr(9)
        '定义脚本目录
        Dim dir AS String
        dir = "C:CREATE_TABLE_DDL"
        Set FSOE = CreateObject("Scripting.FileSystemObject")
        If FSOE.folderexists(dir) = False Then
              MkDir dir
        End If
          
        '调用脚本定义
        Set SqlFileDDL = FSOE.CreateTextFile("C:CREATE_TABLE_DDLcreate_table_ddl.sql", True)
        '获得表名
        tableName = Trim(Cells(1, 2).Value)
        '获得表注释
        tableComment = Trim(Cells(1, 4).Value)
        '获得创建者
        createBy = Trim(Cells(1, 6).Value)
        Dim dt As Date
        dt = Format(Date, "yyyy-mm-dd")
        '获得当前日期
        createDate = dt
        '获得A列已使用的行数
        count_row_k = [A65536].End(xlUp).Row
        '定义SQL
        SQL = "--创建者:" & createBy & Ln
        SQL = SQL & "--创建时间:" & createDate & Ln
        SQL = SQL & "DROP TABLE IF EXISTS " & tableName & " ;" & Ln
        SQL = SQL & "CREATE TABLE " & tableName & "("
        '写入文件
        SqlFileDDL.WriteLine (SQL)
        For i = 3 To count_row_k
            If i = count_row_k Then
                col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "'" & Ln & ")"
                SqlFileDDL.WriteLine(col_name)
                Exit For
            End If
            col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "',"
            SqlFileDDL.WriteLine(col_name)
        Next
        SqlFileDDL.WriteLine("COMMENT '" & tableComment & "'")
        MsgBox("生成成功!生成路径为:" & dir)
    End Sub

       带分区与生命周期版本V2.0:

    Sub create_ddl()
     '自动创建建表语句
        '定义换行和TAB
        Ln = Chr(13) + Chr(10)
        TB = Chr(9)
        '定义脚本目录
        Dim dir As String
        dir = "C:CREATE_TABLE_DDL"
        Set FSOE = CreateObject("Scripting.FileSystemObject")
        If FSOE.folderexists(dir) = False Then
              MkDir dir
        End If
          
        '调用脚本定义
        Set SqlFileDDL = FSOE.CreateTextFile("C:CREATE_TABLE_DDLcreate_table_ddl.sql", True)
        '获得表名
        TableName = Trim(Cells(1, 2).Value)
        '获得表注释
        tableComment = Trim(Cells(1, 4).Value)
        '获得生命周期
        lifecycle = Trim(Cells(1, 6).Value)
        '获得创建者
        createBy = Trim(Cells(1, 8).Value)
        Dim dt As Date
        dt = Format(Date, "yyyy-mm-dd")
        '获得当前日期
        createDate = dt
        '获得A列已使用的行数
        count_row_k = [A65536].End(xlUp).Row
        '获得E列已使用的行数
        part_row_k = [E65536].End(xlUp).Row
        '定义SQL
        Sql = "--创建者:" & createBy & Ln
        Sql = Sql & "--创建时间:" & createDate & Ln
        Sql = Sql & "DROP TABLE IF EXISTS " & TableName & " ;" & Ln
        Sql = Sql & "CREATE TABLE " & TableName & "("
        '写入文件
        SqlFileDDL.WriteLine (Sql)
        For i = 3 To count_row_k
            If i = count_row_k Then
                col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "'" & Ln & ")"
                SqlFileDDL.WriteLine (col_name)
                Exit For
            End If
            col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "',"
            SqlFileDDL.WriteLine (col_name)
        Next
        SqlFileDDL.WriteLine ("COMMENT '" & tableComment & "'")
        '加上分区列
        If part_row_k > 2 Then
            part_col_name = "PARTITIONED BY ("
            SqlFileDDL.WriteLine (part_col_name)
            For j = 3 To part_row_k
                If j = part_row_k Then
                    part_col_name = TB & LCase(Cells(j, 5)) & " " & UCase(Cells(j, 6)) & " COMMENT '" & Trim(Cells(j, 7)) & "'"
                    SqlFileDDL.WriteLine (part_col_name)
                    Exit For
                End If
                part_col_name = TB & LCase(Cells(j, 5)) & " " & UCase(Cells(j, 6)) & " COMMENT '" & Trim(Cells(j, 7)) & "'" & ","
                SqlFileDDL.WriteLine (part_col_name)
            Next
        End If
        '加上生命周期
        SqlFileDDL.WriteLine ("LIFECYCLE " & lifecycle & ";")
        MsgBox ("生成成功!生成路径为:" & dir)
    End Sub

      模板:

       更新版本2.1:

    Sub createTableDDL()
        '定义换行和TAB
        Ln = Chr(13) + Chr(10)
        TB = Chr(9)
        '定义脚本目录
        Dim dir AS String
        dir = "C:CREATE_TABLE_DDL"
        Set FSOE = CreateObject("Scripting.FileSystemObject")
        If FSOE.folderexists(dir) = False Then MkDir dir
        '调用脚本定义
        Set SqlFileDDL = FSOE.CreateTextFile("C:CREATE_TABLE_DDLcreate_table_ddl.sql", True)
        '获得表名
        tableName = Trim(Cells(1, 2).Value)
        '获得表注释
        tableComment = Trim(Cells(1, 4).Value)
        '获得生命周期
        lifecycle = Trim(Cells(1, 6).Value)
        '获得创建者
        createBy = Trim(Cells(1, 8).Value)
        Dim dt As Date
        dt = Format(Date, "yyyy-mm-dd")
        '获得当前日期
        createDate = dt
        '获得A列已使用的行数
        count_row_k = [A65536].End(xlUp).Row
        '获得E列已使用的行数
        part_row_k = [E65536].End(xlUp).Row
        '定义SQL
        SQL = "--创建者:" & createBy & Ln & _
              "--创建时间:" & createDate & Ln & _
              "DROP TABLE IF EXISTS " & tableName & " ;" & Ln & _
              "CREATE TABLE " & tableName & "("
        '写入文件
        SqlFileDDL.WriteLine (SQL)
        For i = 3 To count_row_k - 1
            col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "',"
            SqlFileDDL.WriteLine(col_name)
        Next
        '最后一列
        i = count_row_k
        col_name = TB & LCase(Cells(i, 2)) & " " & UCase(Cells(i, 4)) & " COMMENT '" & Trim(Cells(i, 3)) & "'" & Ln & ")"
        SqlFileDDL.WriteLine(col_name)
        SqlFileDDL.WriteLine("COMMENT '" & tableComment & "'")
        '加上分区列
        If part_row_k > 2 Then
            part_col_name = "PARTITIONED BY ("
            SqlFileDDL.WriteLine(part_col_name)
            For j = 3 To part_row_k - 1
                part_col_name = TB & LCase(Cells(j, 5)) & " " & UCase(Cells(j, 6)) & " COMMENT '" & Trim(Cells(j,7)) & "'" & ","
                SqlFileDDL.WriteLine(part_col_name)
            Next
            j = part_row_k
            part_col_name = TB & LCase(Cells(j, 5)) & " " & UCase(Cells(j, 6)) & " COMMENT '" & Trim(Cells(j,7)) & "'"
            SqlFileDDL.WriteLine(part_col_name)
        End If
        '加上生命周期
        SqlFileDDL.WriteLine("LIFECYCLE " & lifecycle & ";")
        MsgBox("生成成功!生成路径为:" & dir)
    End Sub

     //模板在微云文件中。

    二、反向解析

      通过DDL,反向解析出字段填充到excel中

      反向解析1.0:

    REM "获取数组长度"
    Public Function ArrayLength(ByVal ary) As Integer
        ArrayLength = UBound(ary) - LBound(ary) + 1
    End Function
    
    Sub resverse_parse()
        '获得表名
        tableDDL = Trim(Cells(1, 2).Value)
        '截取语句字段部分(以括号分隔)
        index_quote_left_1 = InStr(1,tableDDL,"(")
        index_quote_right_1 = InStr(1,tableDDL,")")
        index_quote_left_2 = InStr(index_quote_right_1 + 1,tableDDL,"(")
        index_quote_right_2 = InStr(index_quote_right_1 + 1,tableDDL,")")
        table_comment_content = Mid(tableDDL,index_quote_right_1 + 1,index_quote_left_2)
        table_comment_arr = Split(table_comment_content, "'")
        table_comment = table_comment_arr(1)
        Cells(3, 4).Value = table_comment
        table_name = Mid(tableDDL,14,index_quote_left_1 - 14)
        Cells(3, 2).Value = table_name
        table_content = Mid(tableDDL,index_quote_left_1,index_quote_right_1 - index_quote_left_1 - 1)
        content_arr = Split(table_content,",")
        content_len = ArrayLength(content_arr)
        
        For i = 0 to content_len - 1 step 1
            col_arr = Split(content_arr(i)," ")
            j = i + 5
            col_name = col_arr(1)
            col_comment = Replace(col_arr(4),"'","")
            MsgBox col_comment
            Cells(j, 1).Value = col_name
            Cells(j, 2).Value = col_comment
        Next i 
    End Sub

      清除重置1.1(1.0为直接清除指定区域版,已废弃):

    Sub clear()
        '采用先清除后填充的策略
        Range("A1:D256").ClearContents
        '填充
        Cells(1, 1).Value = "建表DDL"
        Cells(3, 1).Value = "表名"
        Cells(3, 3).Value = "表注释"
        Cells(4, 1).Value = "列名"
        Cells(4, 2).Value = "列注释"
    End Sub

      模板文件在百度云中,图示如下:

      

  • 相关阅读:
    硬盘SSD、HDD和SSHD都是什么意思?哪种类型硬盘最好?
    记录vlookup的小问题
    找到两个字符串中相同的部分| 对字符串list后的奇妙发现
    jiayan:Cannot read model 'jiayan.klm' (utilfile.cc:74 in util::OpenReadOrThrow threw ErrnoException because `-1 == (ret = _open(name,
    windows下装kenlm
    每日一题力扣98 验证二叉搜索树
    每日一题力扣230 二叉搜索树中的第K小的元素
    每日一题力扣538 把二叉搜索树转换为累加树
    每日一题力扣530 二叉搜索树的最小绝对查
    每日一题力扣700 二叉搜索树中的搜索
  • 原文地址:https://www.cnblogs.com/jiangbei/p/9360434.html
Copyright © 2011-2022 走看看