用ExcelVBA方法实现报表自动生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由 geosouth 贡献 pdf 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。 第 25 卷第 1 期 2009 年 1 月 电 力 科 学 与 工 程 Electric Power Science and Engineering Vol.25, No.1 Jan., 2009 73 用 Excel VBA 方法实现报表自动生成 王 靖 1,王 林 1,周金文 2 (1. 中国石油华北石化公司 机动设备处,河北 任丘 062552;2. 中国石油华北油田公司, 河北 任丘 062552) 摘要:针对实时报表应用中的一些不足,介绍了如何利用 Excel VBA 来 实现 InTouch 组态界面下报表的自 动生成.该方法不破坏 InTouch 的安全性设置,不引入 第三方软件,不需要操作人员人工干预. 关键词:VBA;录制宏函数;自动报表生成 中图分类 号:TP319 文献标识码:A 据库中的项目用于指定起始周期, 持续时间及采样 0 引 言 间隔等,以便访问历史数 据.HistData 实用程序 采用"动态数据交换" DDE(Dynamic Data Ex 众所周知, 实时报表的 编写方法虽然众多, 但 change) 技术访问 InTouch 创建的历史数据文件. 是程序步骤相当 繁琐, 报表功能也受到很多限制. 它可以将所选的历史数据移入提出请求的程序, 如 一些 现成的水晶报表灵活性不够, 根本无法满足数 Microsoft Excel,并生成一个扩展名为 CSV 的文 据报表的多种需求. 特别是组态时, 考虑到组态软 件.该文件可以用 Excel 打开. 件 浏览器的安全性设置, 只能让操作人员操作监控 历史数据的访问可通过在提出请求的程序 中使 画面,而不能进入 WINDOWS 界面.第三方报表 用宏函数或直接在 InTouch 中实现,并 且需要定 软件的引入势必牵涉到操作系统对该软件的激活, 义与 HistData 程序相关的各 个项目.在 InTouch 这与浏览器的安全性设置相矛盾. 鉴于此, 本文提 中编写条件脚本程 序,让 InTouch 在既定的时刻 出用 Excel VBA 来实现 InTouch 组态界面下报表 (如上午 9:15)将电力监控系统 6 kV 运行日志需 自动生成的方法. 要统计的 24 个整点时刻的数据 写入 CSV 文件. 第 2 步,从已经生成的 CSV 文件中读取数据 1 自动生成方法的实现 放入 报表文件中 (利用 EXCEL 中的 VBA 编程) . 导入 CSV 文件,利用 VBA 录制宏函数,将 报 表实现过程中, 利用了常规办公软件 Office Excel 中的内嵌工具 Visual Basic 编辑器 (Excel 菜单下工具——宏——Visual Basic 编辑器) ,程 序非常简单. 此方法不用制作操 作界面, 不需值班 员的干预, 自动生成报文并交付打印机打印; 报表 生成时不破坏 InTouch 的安全性设置.此方法共 分 4 个步骤. 第 1 步,利用 InTouch HistData 与 Intouch 条件脚本生成 CSV 文件. InTouch HistData 是工控组态软件 InTouch 的一个控件, 程序包含自己的内部数据库. 内部数 工作表有效区域的单元格中的数据填入既定的 EXCEL 工作表中(例如:1 号开闭所报表自动打印 . xls) ,生成报表表格的格式在该工作表中已设定 好. 号开闭所报表自动打印 .xls" VBA Project "1 : 中结合录制宏函数生成程序模块 kbs1, 具体如下. '录制昨天 9 点至今天 8 点的整点报表 Workbooks. Open Filename: ="E: \ 报 表. CSV" '在 Excel 中打开 Intouch 生成的 CSV 文件 Range ( "C2: AC25 " ) . Select ' 选定范围为需要录制的数据 收稿日期:2008 08 22. 作者简介:王靖 (1974 -), 男, 中国石油华北石化公司 机动设 备处工程师. 74 电 力 科
参考文献: [1] 刘国定. 自动报表生成与自动程序设计 [J]. 小型微型计 算机系统, 1988,9 (12): 51-54. [2] 叶苍. 通用数据库自动报表工具的原理与实现 [J]. 烟台 大学学 报 (自然科学与工程版), 1995, (4)Leabharlann Baidu 69-72. [3] 陈松乔, 张盈. FoxPro for Windows 中 基于专家知识的自 动报表生成程序 [J]. 中南工业大学学报, 1998,29 (2): 176-178.
True, Contents: =True, Scenarios: =True ActiveWorkbook. Save End Sub 第 3 步, 实现自动执行 EXCEL 宏函数的功能 (不隐藏 InTouch) . 首先将 EXCEL 的宏函数安全性设 为最低, 以 避免每次执行宏时的安全提示. "1#开闭所报表自动打印 .xls" :VBA 中编写 针 对工作薄的脚本程序,具体如下. Private Sub Workbook_Open () Application. WindowState = xlMinimized '激活 1#开闭所报表自动打印 .xls
'设定打印区域(在此区域外还有中间数据) ActiveWindow. SelectedSheets. PrintOut Copies: =1, Collate: =True '保存该报表 'ActiveSheet. Protect DrawingObjects: =
Run ( "kbs1" ) '执行第二步编好的 kbs1 程序模块 Application. Quit '退出应用程 序 End Sub 第 4 步, InTouch 运行过程中, 在 最小化打开 EXCEL. 至此,每天的 9 时 15 分,写有上述程序的电 力监控系统 CLIENT 就会自动生成昨日 9 时至今 日 8 时的运行报 表,并自动按照指定的路径存档, 同时在默认打印机上打印.
学 与 工 程 2009 年 Selection. Copy Windows( "1 号开闭所报表打印 .xls").Activate '激活在 Excel 中 设 定 好 的 报 表 格 式 'ActiveSheet. Unprotect Range ( "C5" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制昨天 9 点的有功电度 Windows ( "报表. CSV" ) . Activate Range ( "AD2: AZ2 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G43" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制今天 9 点的有功电度 Windows ( "报表. CSV" ) . Activate Range ( "AD26: AZ26 " ) . Select Selection. Copy Windows ( "1# 开闭所报表打印 .xls" ) .Activate Range ( "G44" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False ' 录制昨天和前天 9 点的电能读数, 进行相减, 得出一天的电度数 '录制昨天 9 点的无功电 度 Windows ( "报表. CSV" ) . Activate Range ( "BA2: BW2 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G45" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制今天 9 点的无功电度 Windows ( "报表. CSV" ) . Activate Range ( "BA26: BW26 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G46" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制报表日期(在自动生成的报表上记录下 当日的日期) Windows ( "报表. CSV" ) . Activate Range ( "A2" ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "C2" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False Application. CutCopyMode = False '关闭 csv 文件 Application. CutCopyMode = False Windows ( "报表. CSV" ) . Activate ActiveWindow. Close (其它数据录制过程相同) …… '清除报表中的垃圾数据 'Rows ( "39: 47" ) . Select 'Selection. ClearContents 'Range ( "A39" ) . Select '取消最后一次复制的模式,将光标置位 ' (如果不置位,下次程序再次 启动时,会从 当前光标处开始执行录制宏,报表格式就会打乱) Application. CutCopyMode = False Range ( "A3" ) . Select '另存为以当天日期为文件名的报表(每天在 固定的目录下 生成当日的运行日志) 'Dim mydate As String 'mydate = Date – 1 '今日生成的是是昨日 的报表 'Dim mydir As String 'mydir = "E: \报表\" + mydate + ".xls" '指定存储的路 径 'ActiveWorkbook.SaveAs Filename:=mydir, _ FileFormat: =xlNormal, Password: ="", WriteResPassword: ="", _ ReadOnlyRecommended: =False, CreateBackup: =False 'Application. WindowState = xlMinimized '打印当日报表 第1期 王 靖,等 用 Excel VBA 方法实现报表自动生成 75 Range ( "A1: AC37" ) . Select ActiveSheet. PageSetup. PrintArea = " $ A $1: $AC$37"
参考文献: [1] 刘国定. 自动报表生成与自动程序设计 [J]. 小型微型计 算机系统, 1988,9 (12): 51-54. [2] 叶苍. 通用数据库自动报表工具的原理与实现 [J]. 烟台 大学学 报 (自然科学与工程版), 1995, (4)Leabharlann Baidu 69-72. [3] 陈松乔, 张盈. FoxPro for Windows 中 基于专家知识的自 动报表生成程序 [J]. 中南工业大学学报, 1998,29 (2): 176-178.
True, Contents: =True, Scenarios: =True ActiveWorkbook. Save End Sub 第 3 步, 实现自动执行 EXCEL 宏函数的功能 (不隐藏 InTouch) . 首先将 EXCEL 的宏函数安全性设 为最低, 以 避免每次执行宏时的安全提示. "1#开闭所报表自动打印 .xls" :VBA 中编写 针 对工作薄的脚本程序,具体如下. Private Sub Workbook_Open () Application. WindowState = xlMinimized '激活 1#开闭所报表自动打印 .xls
'设定打印区域(在此区域外还有中间数据) ActiveWindow. SelectedSheets. PrintOut Copies: =1, Collate: =True '保存该报表 'ActiveSheet. Protect DrawingObjects: =
Run ( "kbs1" ) '执行第二步编好的 kbs1 程序模块 Application. Quit '退出应用程 序 End Sub 第 4 步, InTouch 运行过程中, 在 最小化打开 EXCEL. 至此,每天的 9 时 15 分,写有上述程序的电 力监控系统 CLIENT 就会自动生成昨日 9 时至今 日 8 时的运行报 表,并自动按照指定的路径存档, 同时在默认打印机上打印.
学 与 工 程 2009 年 Selection. Copy Windows( "1 号开闭所报表打印 .xls").Activate '激活在 Excel 中 设 定 好 的 报 表 格 式 'ActiveSheet. Unprotect Range ( "C5" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制昨天 9 点的有功电度 Windows ( "报表. CSV" ) . Activate Range ( "AD2: AZ2 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G43" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制今天 9 点的有功电度 Windows ( "报表. CSV" ) . Activate Range ( "AD26: AZ26 " ) . Select Selection. Copy Windows ( "1# 开闭所报表打印 .xls" ) .Activate Range ( "G44" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False ' 录制昨天和前天 9 点的电能读数, 进行相减, 得出一天的电度数 '录制昨天 9 点的无功电 度 Windows ( "报表. CSV" ) . Activate Range ( "BA2: BW2 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G45" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制今天 9 点的无功电度 Windows ( "报表. CSV" ) . Activate Range ( "BA26: BW26 " ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "G46" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False '录制报表日期(在自动生成的报表上记录下 当日的日期) Windows ( "报表. CSV" ) . Activate Range ( "A2" ) . Select Selection. Copy Windows ( "1#开闭所报表打印 .xls" ) .Activate Range ( "C2" ) . Select Selection. PasteSpecial Paste: =xlValues, Operation: =xlNone, SkipBlanks: = _ False, Transpose: =False Application. CutCopyMode = False '关闭 csv 文件 Application. CutCopyMode = False Windows ( "报表. CSV" ) . Activate ActiveWindow. Close (其它数据录制过程相同) …… '清除报表中的垃圾数据 'Rows ( "39: 47" ) . Select 'Selection. ClearContents 'Range ( "A39" ) . Select '取消最后一次复制的模式,将光标置位 ' (如果不置位,下次程序再次 启动时,会从 当前光标处开始执行录制宏,报表格式就会打乱) Application. CutCopyMode = False Range ( "A3" ) . Select '另存为以当天日期为文件名的报表(每天在 固定的目录下 生成当日的运行日志) 'Dim mydate As String 'mydate = Date – 1 '今日生成的是是昨日 的报表 'Dim mydir As String 'mydir = "E: \报表\" + mydate + ".xls" '指定存储的路 径 'ActiveWorkbook.SaveAs Filename:=mydir, _ FileFormat: =xlNormal, Password: ="", WriteResPassword: ="", _ ReadOnlyRecommended: =False, CreateBackup: =False 'Application. WindowState = xlMinimized '打印当日报表 第1期 王 靖,等 用 Excel VBA 方法实现报表自动生成 75 Range ( "A1: AC37" ) . Select ActiveSheet. PageSetup. PrintArea = " $ A $1: $AC$37"