excel的宏与VBA实践——建表语句
一、建表语句
不带分区版本:V1.0:
Sub createTableDDL()
'自动创建建表语句
'定义换行和TAB
Ln = Chr() + Chr()
TB = Chr()
'定义脚本目录
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_DDL\create_table_ddl.sql", True)
'获得表名
tableName = Trim(Cells(, ).Value)
'获得表注释
tableComment = Trim(Cells(, ).Value)
'获得创建者
createBy = Trim(Cells(, ).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 = To count_row_k
If i = count_row_k Then
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "'" & Ln & ")"
SqlFileDDL.WriteLine(col_name)
Exit For
End If
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "',"
SqlFileDDL.WriteLine(col_name)
Next
SqlFileDDL.WriteLine("COMMENT '" & tableComment & "'")
MsgBox("生成成功!生成路径为:" & dir)
End Sub
带分区与生命周期版本V2.0:
Sub create_ddl()
'自动创建建表语句
'定义换行和TAB
Ln = Chr() + Chr()
TB = Chr()
'定义脚本目录
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_DDL\create_table_ddl.sql", True)
'获得表名
TableName = Trim(Cells(, ).Value)
'获得表注释
tableComment = Trim(Cells(, ).Value)
'获得生命周期
lifecycle = Trim(Cells(, ).Value)
'获得创建者
createBy = Trim(Cells(, ).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 = To count_row_k
If i = count_row_k Then
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "'" & Ln & ")"
SqlFileDDL.WriteLine (col_name)
Exit For
End If
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "',"
SqlFileDDL.WriteLine (col_name)
Next
SqlFileDDL.WriteLine ("COMMENT '" & tableComment & "'")
'加上分区列
If part_row_k > Then
part_col_name = "PARTITIONED BY ("
SqlFileDDL.WriteLine (part_col_name)
For j = To part_row_k
If j = part_row_k Then
part_col_name = TB & LCase(Cells(j, )) & " " & UCase(Cells(j, )) & " COMMENT '" & Trim(Cells(j, )) & "'"
SqlFileDDL.WriteLine (part_col_name)
Exit For
End If
part_col_name = TB & LCase(Cells(j, )) & " " & UCase(Cells(j, )) & " COMMENT '" & Trim(Cells(j, )) & "'" & ","
SqlFileDDL.WriteLine (part_col_name)
Next
End If
'加上生命周期
SqlFileDDL.WriteLine ("LIFECYCLE " & lifecycle & ";")
MsgBox ("生成成功!生成路径为:" & dir)
End Sub
模板:
更新版本2.1:
Sub createTableDDL()
'定义换行和TAB
Ln = Chr() + Chr()
TB = Chr()
'定义脚本目录
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_DDL\create_table_ddl.sql", True)
'获得表名
tableName = Trim(Cells(, ).Value)
'获得表注释
tableComment = Trim(Cells(, ).Value)
'获得生命周期
lifecycle = Trim(Cells(, ).Value)
'获得创建者
createBy = Trim(Cells(, ).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 = To count_row_k -
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "',"
SqlFileDDL.WriteLine(col_name)
Next
'最后一列
i = count_row_k
col_name = TB & LCase(Cells(i, )) & " " & UCase(Cells(i, )) & " COMMENT '" & Trim(Cells(i, )) & "'" & Ln & ")"
SqlFileDDL.WriteLine(col_name)
SqlFileDDL.WriteLine("COMMENT '" & tableComment & "'")
'加上分区列
If part_row_k > Then
part_col_name = "PARTITIONED BY ("
SqlFileDDL.WriteLine(part_col_name)
For j = To part_row_k -
part_col_name = TB & LCase(Cells(j, )) & " " & UCase(Cells(j, )) & " COMMENT '" & Trim(Cells(j,)) & "'" & ","
SqlFileDDL.WriteLine(part_col_name)
Next
j = part_row_k
part_col_name = TB & LCase(Cells(j, )) & " " & UCase(Cells(j, )) & " COMMENT '" & Trim(Cells(j,)) & "'"
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) +
End Function Sub resverse_parse()
'获得表名
tableDDL = Trim(Cells(, ).Value)
'截取语句字段部分(以括号分隔)
index_quote_left_1 = InStr(,tableDDL,"(")
index_quote_right_1 = InStr(,tableDDL,")")
index_quote_left_2 = InStr(index_quote_right_1 + ,tableDDL,"(")
index_quote_right_2 = InStr(index_quote_right_1 + ,tableDDL,")")
table_comment_content = Mid(tableDDL,index_quote_right_1 + ,index_quote_left_2)
table_comment_arr = Split(table_comment_content, "'")
table_comment = table_comment_arr()
Cells(, ).Value = table_comment
table_name = Mid(tableDDL,,index_quote_left_1 - )
Cells(, ).Value = table_name
table_content = Mid(tableDDL,index_quote_left_1,index_quote_right_1 - index_quote_left_1 - )
content_arr = Split(table_content,",")
content_len = ArrayLength(content_arr) For i = to content_len - step
col_arr = Split(content_arr(i)," ")
j = i +
col_name = col_arr()
col_comment = Replace(col_arr(),"'","")
MsgBox col_comment
Cells(j, ).Value = col_name
Cells(j, ).Value = col_comment
Next i
End Sub
清除重置1.1(1.0为直接清除指定区域版,已废弃):
Sub clear()
'采用先清除后填充的策略
Range("A1:D256").ClearContents
'填充
Cells(, ).Value = "建表DDL"
Cells(, ).Value = "表名"
Cells(, ).Value = "表注释"
Cells(, ).Value = "列名"
Cells(, ).Value = "列注释"
End Sub
模板文件在百度云中,图示如下:
excel的宏与VBA实践——建表语句的更多相关文章
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- hive查看建表语句
查看hive建表语句:show create table tablename; 查看hive表结构:describe tablename; 简写:desc tablename;
- 批量导出hive表的建表语句
转的这里的 首先先导出所有的table表 hive -e "use xxxdb;show tables;" > tables.txt 然后再使用hive内置语法导出hive表 ...
- 根据javabean转换为mysql建表语句与mapper内容
原文地址: https://www.cnblogs.com/Jeffscnblog/p/10072483.html 一般上,我们会使用数据库表转换为javabean.dao.或是mapper,就叫逆 ...
- MySQL 建表语句 create table 中的列定义
MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...
- sqlserver 表中记录生成insert,可以加条件,可以生成建表语句
sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...
- 三种常用的MySQL建表语句
MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1( ...
- mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...
- oracle的建表语句
oracle数据库的建表语句,具体语法如下: CREATE TABLE tablename (column_name datatype [null,not null], column_name dat ...
随机推荐
- Nginx 优化配置及详细注释
Nginx 的nginx.conf文件,是调优后的,具体影响已经写清楚注释,可以拿来用,有一些设置无效,我备注上了,不知道是不是版本的问题,回头查一下再更正. #普通配置 #==性能配置 #运行用户 ...
- Android ConstraintLayout详解(from jianshu)
Android ConstraintLayout详解 https://www.jianshu.com/p/a8b49ff64cd3 1. 概述 在本篇文章中,你会学习到有关Constraint ...
- PHP将Base64图片转换为本地图片并保存
本文出至:新太潮流网络博客 /** * [将Base64图片转换为本地图片并保存] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB h ...
- php编译安装 报错 make ***[libphp5.la] Error 1解决方法
报错信息: /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [libphp5.la] Err ...
- 分享几款常用的MySQL管理工具
MySQL数据库以体积小.速度快.总体拥有成本低等优点,深受广大中小企业的喜爱,像我们常见的MySQL管理工具都有那些呢?下面给大家推荐六个常用的MySQL管理工具! phpMyAdmin ...
- Azure 中的虚拟网络和虚拟机
创建 Azure 虚拟机 (VM) 时,必须创建虚拟网络 (VNet) 或使用现有的 VNet. 此外,还需要确定如何在 VNet 上访问 VM. 在创建资源之前必须做好规划,确保了解网络资源的限制. ...
- TCP是如何实现三次握手的?
什么是三次握手 TCP是网络传输层的协议,提供面向连接的可靠的字节流服务,要通信得先建立连接 所谓三次握手就是指,建立一个TCP连接时,需要CLient与Server发送三个包,确认连接的建立 这一过 ...
- env :让系统决定你命令的位置
如果我们使用lua 运行脚本程序,或者使用python执行程序.我们不用明确 python的位置,可以使用env 命令来运行: env 程序介绍: NAME env - run a program i ...
- Django之FBV&CBV
CBV与FBV是django视图中处理请求的两种方式 FBV FBV也就是function base views,字面意思函数基础视图,使用函数的方式处理请求url分发中添加的参数为视图处理函数名, ...
- 64位Windows的Dos中取消了edit命令
前段时间在玩dos命令行的时候,用copy con创建了txt文件后想对其进行编辑,然后我又不想用记事本,所以去网上找命令行中对文本文件进行编辑的命令(纯属想装B),结果看到了edit命令. 一敲,就 ...