原文:https://blog.csdn.net/zutsoft/article/details/45441343

编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构,记录表名,字段,类型,注释等等信息,将表结构整理到excel已经是件很累的事了,如果整理好的表结构只是用来查字段当字典用,那就太浪费了,excel提供vba编程,我们可以通过一段小脚本来实现一键创建表结构。使用脚本创建的语句需要标准化每个sheet页的格式,格式根据自己需要来做,这里给出我使用的格式和脚本。

EXCEL模板

VBA编程

打开excel vba编程工具,在ThisWorkbook中添加如下代码:

  1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  2. '关闭工作簿前,删除新创建的工具条先
  3. Dim bar_name As String
  4. bar_name = "HRBSJ"
  5. Application.CommandBars(bar_name).Delete
  6. On Error GoTo Exception
  7. Exit Sub
  8. Exception:
  9. End Sub
  10. Private Sub Workbook_Open()
  11. '打开工作簿时创建工具条
  12. Dim bar_name As String
  13. Dim new_bar As Office.CommandBar
  14. bar_name = "HRBSJ"
  15. Set new_bar = Application.CommandBars.Add(bar_name)
  16. new_bar.Visible = True
  17. new_bar.Position = msoBarLeft
  18. With new_bar.Controls.Add(Type:=msoControlButton, before:=1)
  19. .BeginGroup = True
  20. .Caption = "生成建表脚本"
  21. .TooltipText = "生成建表脚本"
  22. .Style = msoButtonCaption
  23. .OnAction = "Create_HR_Table_Script"
  24. End With
  25. On Error GoTo Exception
  26. Exit Sub
  27. Exception:
  28. End Sub

创建模块:

 
  1. Private Sub ShowTable()
  2. frmTable.Show
  3. End Sub
  4. Private Sub Create_HR_Table_Script()
  5. Dim line_tablename As Integer, len_col_id As Integer, len_str_type As Integer, col_num As Integer
  6. Dim do_column As Boolean, column_end As Boolean
  7. Dim table_name As String, str_col_id As String, str_space As String
  8. Dim primary_col As String, index_col As String, str_primary As String
  9. Dim str_temp As String, str_type As String, str_null As String, str_column As String
  10. max_line = 1000
  11. no_data = 0
  12. do_column = False
  13. column_end = False
  14. str_column = ""
  15. str_index = ""
  16. line_tablename = 6
  17. Set fs = CreateObject("Scripting.FileSystemObject")
  18. sFilePath = ActiveWorkbook.Path & "\Script\"
  19. If Dir(sFilePath, vbDirectory) = "" Then
  20. MkDir sFilePath
  21. End If
  22. sFileName = sFilePath & "Create_HR_Table_Script.sql"
  23. Set fhandle = fs.CreateTextFile(sFileName, True)
  24. fhandle.WriteLine ("--华融表结构创建脚本,对应数据库Oracle")
  25. fhandle.WriteLine ("--建表脚本创建开始:" & Date & " " & Time)
  26. fhandle.WriteLine ("")
  27. fhandle.WriteLine ("DECLARE")
  28. fhandle.WriteLine ("  --判断表是否存在")
  29. fhandle.WriteLine ("  FUNCTION fc_IsTabExists(sTableName IN VARCHAR2)")
  30. fhandle.WriteLine ("    RETURN BOOLEAN AS")
  31. fhandle.WriteLine ("   iExists PLS_INTEGER;")
  32. fhandle.WriteLine ("  BEGIN")
  33. fhandle.WriteLine ("    SELECT COUNT(*) INTO iExists FROM user_tables ut WHERE ut.table_name  = UPPER(sTableName);")
  34. fhandle.WriteLine ("    RETURN CASE WHEN iExists > 0 THEN TRUE ELSE FALSE END;")
  35. fhandle.WriteLine ("  END;")
  36. fhandle.WriteLine ("")
  37. fhandle.WriteLine ("BEGIN")
  38. For i_index = 2 To Sheets.Count  '第一页是目录这里的参数控制开始的页数到截止的sheet页
  39. Sheets(i_index).Select  '从第二页开始,循环sheet页
  40. For i_line = 3 To max_line
  41. first_col = Trim(Sheets(i_index).Cells(i_line, 2))
  42. Select Case first_col
  43. Case "目标表说明"
  44. table_name = Trim(Sheets(i_index).Cells(3, 4))
  45. primary_col = Trim(Sheets(i_index).Cells(5, 4))
  46. index_col = Trim(Sheets(i_index).Cells(8, 4))
  47. If Len(primary_col) > 0 Then
  48. primary_col = Replace(primary_col, ",", ",")
  49. str_primary = "alter table " & table_name & " " & "add constraint pk_" & table_name & " primary key (" & primary_col & ")"
  50. Else
  51. str_primary = ""
  52. End If
  53. If Len(index_col) > 0 Then
  54. index_col = Replace(index_col, ",", ",")
  55. Else
  56. index_col = ""
  57. End If
  58. Case "序号"
  59. fhandle.WriteLine ("")
  60. fhandle.WriteLine ("/* Table:" & table_name & "  " & Trim(Sheets(i_index).Cells(2, 2)) & "  */")
  61. fhandle.WriteLine ("IF fc_IsTabExists('" & table_name & "') THEN")
  62. fhandle.WriteLine ("  execute immediate 'drop table " & table_name & "';")
  63. fhandle.WriteLine ("END IF;")
  64. fhandle.WriteLine ("")
  65. fhandle.WriteLine ("execute immediate '")
  66. fhandle.WriteLine ("create table " & table_name)
  67. fhandle.WriteLine ("(")
  68. Case 1
  69. do_column = True
  70. Case ""
  71. do_column = False
  72. End Select
  73. If Trim(Sheets(i_index).Cells(i_line, 2)) = "" Then
  74. do_column = False
  75. End If
  76. str_temp = ""
  77. str_column = ""
  78. If do_column = True Then
  79. '标识最后一个字段列
  80. If Trim(Sheets(i_index).Cells(i_line + 1, 2)) = "" Or Trim(Sheets(i_index).Cells(i_line + 1, 3)) = "" Then
  81. column_end = True
  82. Else
  83. column_end = False
  84. End If
  85. '字段处理,及与数据类型的空格数处理
  86. str_col_id = Trim(Sheets(i_index).Cells(i_line, 3))
  87. len_col_id = Len(str_col_id)
  88. For i = len_col_id To 30
  89. str_space = str_space & " "
  90. Next
  91. str_column = str_col_id & str_space
  92. '数据类型的处理
  93. str_space = ""
  94. str_type = Trim(Sheets(i_index).Cells(i_line, 4))
  95. len_str_type = Len(str_type)
  96. For i = len_str_type To 16
  97. str_space = str_space & " "
  98. Next
  99. str_column = str_column & str_type & str_space
  100. '是否为空的处理
  101. str_space = ""
  102. str_temp = Trim(Sheets(i_index).Cells(i_line, 5))
  103. Select Case str_temp
  104. Case "N"
  105. str_null = "not null"
  106. Case Else
  107. str_null = ""
  108. End Select
  109. str_column = str_column & str_null
  110. '加一列
  111. If column_end = False Then
  112. str_column = str_column & ","
  113. fhandle.WriteLine ("  " & str_column)
  114. Else
  115. fhandle.WriteLine ("  " & str_column)
  116. fhandle.WriteLine (") tablespace TS_TDC';")
  117. End If
  118. End If
  119. Next ' 结束工作表的循环
  120. '--加注释
  121. If Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
  122. fhandle.WriteLine (" -- Add comments to the table")
  123. fhandle.WriteLine ("execute immediate 'comment on table  " & Trim(Sheets(i_index).Cells(3, 4)) & " is ''" & Trim(Sheets(i_index).Cells(2, 2)) & "''';")
  124. fhandle.WriteLine (" -- Add comments to the columns")
  125. For i_line = 15 To max_line
  126. If Trim(Sheets(i_index).Cells(i_line, 2)) <> "" And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
  127. fhandle.WriteLine ("execute immediate 'comment on column " & Trim(Sheets(i_index).Cells(3, 4)) & "." & Trim(Sheets(i_index).Cells(i_line, 3)) & " is ''" & Trim(Sheets(i_index).Cells(i_line, 7)) & "''';")
  128. End If
  129. Next ' 结束工作表的循环
  130. End If
  131. '--加主键
  132. If Len(str_primary) > 0 And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
  133. fhandle.WriteLine ("")
  134. fhandle.WriteLine ("execute immediate '" & str_primary & " using index tablespace TS_TDC';")
  135. End If
  136. '--加索引
  137. If Len(index_col) > 0 And Trim(Sheets(i_index).Cells(3, 2)) = "目标表说明" Then
  138. fhandle.WriteLine ("")
  139. fhandle.WriteLine ("execute immediate 'create index i_" & table_name & " on " & table_name & " (" & index_col & " )  tablespace TS_TDC';")
  140. End If
  141. Next '结束工作簿的循环
  142. fhandle.WriteLine ("")
  143. fhandle.WriteLine ("END;")
  144. fhandle.WriteLine ("/")
  145. fhandle.Close
  146. Sheets(1).Select
  147. MsgBox "表结构创建脚本成功!文件名" & sFileName
  148. End Sub

保存后可在excel上看到 ‘生成建表脚本’ 按钮

最终的生产结果示例

    1. --表结构创建脚本,对应数据库Oracle
    2. --建表脚本创建开始:2015/5/2 18:35:26
    3. DECLARE
    4. --判断表是否存在
    5. FUNCTION fc_IsTabExists(sTableName IN VARCHAR2)
    6. RETURN BOOLEAN AS
    7. iExists PLS_INTEGER;
    8. BEGIN
    9. SELECT COUNT(*) INTO iExists FROM user_tables ut WHERE ut.table_name  = UPPER(sTableName);
    10. RETURN CASE WHEN iExists > 0 THEN TRUE ELSE FALSE END;
    11. END;
    12. BEGIN
    13. /* Table:TEST  测试表  */
    14. IF fc_IsTabExists('TEST') THEN
    15. execute immediate 'drop table TEST';
    16. END IF;
    17. execute immediate '
    18. create table TEST
    19. (
    20. c_unique_no                    VARCHAR2(32)     not null,
    21. c_proj_no                      VARCHAR2(40)     not null,
    22. c_busi_type                    VARCHAR2(40)     not null,
    23. c_cust_ID                      VARCHAR2(32)
    24. ) tablespace TEST';
    25. -- Add comments to the table
    26. execute immediate 'comment on table  TEST is ''测试表''';
    27. -- Add comments to the columns
    28. execute immediate 'comment on column TEST.c_unique_no is ''PK主键''';
    29. execute immediate 'comment on column TEST.c_proj_no is ''项目编号''';
    30. execute immediate 'comment on column TEST.c_busi_type is ''业务类型''';
    31. execute immediate 'comment on column TEST.c_cust_ID is ''客户ID''';
    32. execute immediate 'alter table TEST add constraint pk_TEST primary key (c_unique_no) using index tablespace TEST';
    33. END;
    34. /

【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL的更多相关文章

  1. Kettle根据表输入的SQL脚本返回创建表的SQL脚本

    其中[物料分组]节点就是表输入,里面可以构建SQL查询.那么怎么把生成的数据插入到目标表中?并且构建目标表的结构呢? 目标表结构就在[表输出]栏位 点击[SQL],就可以看见生成目标表结构的脚本

  2. SQL Server 动态创建表结构

    需求是,在word里面设计好表结构(主要在word中看起来一目了然,方便维护),然后复制sql 里面,希望动态创建出来 存储表结构的表 CREATE TABLE [dbo].[Sys_CreateTa ...

  3. Linq to Sql自动生成实体类重名情况的处理

    使用Linq to sql自动生成实体类时,如果要生成多个库的实体类,往往会遇到类名重名的情况,也就是表名重名,这样编译会不通过,这种情况下要在自动生成的实体类文件中(.designer.cs后缀)将 ...

  4. [Silverlight][linq to sql]不能找到linq to sql自动生成类型

    最近在做Silverlight项目,结合使用了WCF RIA service,通过linq to sql自动生成model类型,使用起来非常方便.具体可见linq to sql之silverlight ...

  5. EF:根据实体类生成表结构SQL

    根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...

  6. (转载)根据数据字典表定义的表结构,生成创建表的SQL语句

    <来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1.  类名:T ...

  7. DjangoORM创建表结构以及生成数据库结构

    1. ORM的两种 DB first: 创建表结构--根据表结构生成类-----根据类来操作数据库 Code first: 先写代码------再写类----执行命令(一个类生成一个表)当前主流的用法 ...

  8. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  9. EF-使用迁移技术让程序自动更新数据库表结构

    承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...

随机推荐

  1. Visual Studio Team Services使用教程【3】:默认团队权限说明

    2017.4.23之后建议朋友看下面的帖子 TFS2017 & VSTS 实战(繁体中文视频) Visual Studio Team Services(VSTS)与敏捷开发ALM实战关键报告( ...

  2. eclipse中如何配置tomcat

    1.打开eclipse上面的Windows选项,选择Preferences==>Server==>Runtime Environments==>Add 2.选择你电脑中安装的tomc ...

  3. 【简要题解】Hihocoder 重复旋律1-9简要题解

    [简要题解]Hihocoder 重复旋律1-8简要题解 编号 名称标签 难度 1403 后缀数组一·重复旋律 Lv.4 1407 后缀数组二·重复旋律2 Lv.4 1415 后缀数组三·重复旋律3 L ...

  4. $CF912E\ Prime\ Gift$ 二分+搜索

    正解:二分+搜索 解题报告: 传送门$QwQ$ 因为翻译真的很$umm$所以还是写下题目大意$QwQ$,就说给定一个大小为$n$的素数集合,求出分解后只含这些质数因子的第$K$小整数 考虑先把质数分两 ...

  5. selenium自动化之xpath定位*必会技能*

    相信写过ui自动化,对xpath定位感觉会特别亲戚,那么下面给大家分享些我们常常在写脚本时易忽略的一些小细节和技巧.首先使用xpath定位时切忌 不要使用带有空格的属性 不要使用自动生成的id.cla ...

  6. JVM系列(三):java的垃圾回收机制

    java垃圾回收机制介绍    上一篇讲述了JVM的内存模型,了解了到了绝大部分的对象是分配在堆上面的,我们在编码的时候并没有显示的指明哪些对象需要回收,但是程序在运行的过程中是会一直创建对象的,之所 ...

  7. 洛谷P1037 产生数 题解 搜索

    题目链接:https://www.luogu.com.cn/problem/P1037 题目描述 给出一个整数 \(n(n<10^{30})\) 和 \(k\) 个变换规则 \((k \le 1 ...

  8. 小小知识点(二十六)关于5G发展的28个核心问题,来自华为内部的深度解读

    本文来自微信公众号“腾讯深网”(ID:qqshenwang),作者 马关夏.36氪经授权转载. 一.5G先进性与行业应用 1.5G到底是什么?和4G比有什么不一样? 从国际电信联盟(ITU)的定义来看 ...

  9. JAVA8学习——Stream底层的实现三(学习过程)

    Stream的深入(三) 心得:之前学习流,深入了流的底层.但是学的这些东西在平时日常开发的过程中,是根本不会用到的.只是为了更好帮助自己去理解流的底层设施.用起来也更自信,能够确定用的东西非常正确. ...

  10. C++ 模板常见特性(函数模板、类模板)

    背景 C++ 是很强大,有各种特性来提高代码的可重用性,有助于减少开发的代码量和工作量. C++ 提高代码的可重用性主要有两方面: 继承 模板 继承的特性我已在前面篇章写过了,本篇主要是说明「模板」的 ...