电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

VBA语言范文

来源:漫步者作者:开心麻花2025-09-191

VBA语言范文(精选9篇)

VBA语言 第1篇

中缅油气管道是我国“十一五”期间规划的重大管道建设项目之一, 是我国油气进口的西南战略通道。该项目由中、缅、印、韩四个国家共同投资建设, 是我国管道建设史上公认最难的管道, 尤其是管道二公司负责的三管并行、同沟段线路。

管道二公司承担着中缅天然气、原油和云南成品油管道三条管道的施工任务, 管线施工长度约503km, (其中天然气管道约229km, 原油管道约136km, 成品油管道约136km) , 区间三条管线同沟或并行长度约112.4km, 管理跨度约230km。

2 存在问题

中缅管道计划于2013年5月底具备投产条件, 由于开工时间滞后, 导致一开工就面临工期紧、任务重的压力, 为确保工期目标的顺利实现, 需投入大量的焊接施工资源来确保线路主体焊接施工任务的完成, 目前中缅项目已投入焊接施工作业面达到35个之多。如何在焊接机组数字化资料管理上确保准确性、及时性、真实性是我们面临的一个难题与挑战。

每天收集30多个焊接作业面上报的施工记录 (Excel文件) , 每天均需要打开每个作业面上报的Excel文件查看天然气、原油、成品油3个表单, 进行复制、粘贴到汇总表中, 这样简单而重复的操作耗费了技术人员大量的时间与精力, 工作效率低下且容易使人疲惫导致操作错误, 难以察觉。

通过对Excel软件的研究, 我们知道可以利用录制宏或者按照需求编写宏来代替人工操作进行一系列费时而重复的Excel操作, 使一系列复杂的任务自动执行, 从而高效完成工作任务。这里提到的宏所使用的语言就是VBA语言, 那么在焊接机组资料管理中也可以通过VBA编程更灵活、高效、快速地编制出应用程序来完成每天各个作业面资料的汇总, 从而减轻工作强度, 提高工作效率, 确保了资料的准确性。

3 解决方案

3.1 引入VBA语言编程

焊接施工记录每天由各个作业面上报, 每天在一张工作表里统计当天焊接的所有工程量 (天然气、原油、成品油) , 然后将所有机组数据汇总成一个汇总表。

一般情况下, 编制汇总表的过程是采用不断地打开原始工作表, 复制表单中的数据, 然后粘贴到汇总表中, 如此重复操作, 不仅耗费大量的时间和精力, 且容易出错。类似的信息统计工作在其他数字化采集表格中也会遇到, 如对防腐机组数据汇总统计等。本文即是利用VBA编程来快速解决这样一类问题。

3.2 主要过程介绍

第一步:操作界面介绍

点击汇总按钮 (如图1所示) 调用程序, 实现添加源文件所在文件夹路径下的所有文件, 并将文件放入Arr集合中。

如果选择了多个.xls文件, 那么就会弹出对话框 (图2) 。

点击确定的话, 进行文件合并, 如果点击取消, 那么对话框关闭。

第二步:程序运行流程图

程序代码实现将选择的文件夹路径中所有工作薄中的天然气、原油、成品油工作表中的数据导入到对应的汇总表中, 对应程序流程图见如图3。其中主要有两个功能函数, 一个是“确定按钮的事件响应函数”、另外一个是Total All () 函数, 主要负责文件中所有单元格的合并工作。

首先, 主程序循环遍历整个Arr列表, 从Arr中取出文件并打开Set Wb=Workbooks.Open (FName) , 然后调用Total All (filename) 函数进行单个文件的合并工作, 其中循环遍历Arr列表主要由Command Button1_Click () 这个函数完成。函数首先进行一些初始化操作, 然后循环打开文件, 并获取文件名, 调用Total All (filename) 来进行合并, 合并完成后关闭文件, 重新打开新的文件。

然后利用Total All函数来实现单元格合并。先通过Dimvalid_rows As Integer valid_rows=.Cells (Rows.Count, 3) .End (3) Row来获取当前单元格的有效行数, 三个单元格对应行数需要根据有效行数+自身的起始行号来得到, 也就是X。接下来, 需要对其中的三个单元格“天然气”、“成品油”、“原油”分别进行插入操作, 然后通过“循环代码”来把所有单元格有效行插入。

最后, 如果Arr中打开的当前文件所有单元格都合并完毕, 需要将打开的文件进行关闭操作, 并从Arr中取出下一个文件并打开, 进行同样的操作, 当Arr中所有文件都合并后, 整个程序结束。

4 应用效果分析

以目前中缅项目35个焊接作业面计算, 每天采用常规汇总方法, 每个工作薄3张表单, 打开一个工作薄然后将天然气、原油、成品油三张表单的数据汇总到相应的汇总表大概需要1分钟, 预计需用时30分钟以上, 且经常会出现漏统计现象, 需要一个个记录打开重新核查, 从而耗费更多的时间和精力。

而采用VBA编程后, 每天只需运行程序来汇总即可, 每天汇总这35个作业面的资料大概只需要2分钟左右, 而且数据准确, 减少二次核查时间。

这样可以极大的提高资料管理的效率和质量, 有效降低劳动强度。

5 结束语

通过VBA编程顺利实现了数字化资料的快速汇总, 应用Excel对象来操作工作薄、工作表及单元格而实现批量数据处理。但VBA开发的主要难点和问题在于相应的对象模型的理解及其应用, 在用VBA开发中解决问题的方法也比较灵活。通过本例可以看到, 要想使办公自动化程度更高、效率更高, 则要学习利用VBA对Excel进行二次开发, 研究制定出灵活、高效的解决方案, 可以让办公人员从大量繁琐的操作中解脱出来。所开发VBA程序可以解决一类问题, 用户只需要根据自己的不同需求, 进行相应的修改, 便可以快速解决类似数据汇总问题。

参考文献

[1]李纲, 邱荣祖, 林宇洪, 郭建钢.基于VBA技术的交通调查实习软件的研制[J].实验室研究与探索, 2008 (05) .

[2]陆伟.基于VBA的Excel下学生综合测评统计模板开发[J].科技信息, 2008 (33) .

善用VBA 提高工作效率 第2篇

利用VBA代码快速查找数据

并提取内容

在工作中遇到一个问题,要求从Sheet2工作表查找出相关会员的分数和总排名(如图1),并将其显示在Sheet3,由于原始表格的数据太大,使用公式的话耗费的时间相对比较多,领导并不满意,因此考虑使用VBA代码实现上述任务。

按下“Alt+F11”组合键,打开Microsoft Visual Basic for Applications编辑器窗口,依次选择“插入/模块”,在右侧窗格插入一个空白模块(如图2),在这里手工输入或粘贴如下代码(相关代码可关注电脑迷微信回复“201506vba1”获取下载链接)。

上述代码检查无误之后,依次选择“文件/关闭并返回到Microsoft Excel”命令,返回Excel主界面,按下“Alt+F8”组合键,打开“宏”对话框,选择并运行宏,很快就可以完成数据查找和复制的任务。

利用VBA代码批量删除特定行

最近从金蝶财务软件中导出相关的明细帐(如图3),需要删除其中包含“期初余额”、“本日合计”、“本月合计”、“本年累计”、“结转下年”单元格所在的行,由于数据量接近数十万条,手工删除显然相当麻烦。我们可以使用VBA代码解决这一问题。

按下“Alt+F11”组合键,打开Microsoft Visual Basic for Applications编辑器窗口,依次选择“插入/模块”,在右侧窗格插入一个空白模块。经过分析,包含相关单元格内容的行,在B列均为空白,因此我们可以在模块窗格手工输入或粘贴如下代码(相关代码可关注电脑迷微信回复“201506vba2”获取下载链接)(如图4)。

该代码换了一种思路,主要是删除B列非空白的数据,检查无误之后,依次选择“文件/关闭并返回到Microsoft Excel”命令,返回Excel主界面,按下“Alt+F8”组合键,打开“宏”对话框,选择并运行宏,很快就可以完成批量删除的任务(如图5)。

利用VBA代码拼音

提取注音文本

手头有一篇拼音标注的佛经注音校对文档,其中的拼音是使用域代码实现的,切换域代码之后(如图6),可以发现大量类似于“(chénɡ),乘)”的文字,现在希望借助某种手段,将其中的注音文本提取出来复制到文档的末尾,除了手工操作之外,有没有简单一些的方法呢?

利用VBA代码可以解决这一问题,按下“Alt+F11”组合键,打开Microsoft Visual Basic for Applications编辑器窗口,依次选择“插入/模块”,在右侧窗格插入一个空白模块,手工粘贴或输入代码(相关代码可关注电脑迷微信回复“201506vba3”获取下载链接)。

代码检查无误之后,依次选择“文件/关闭并返回到Microsoft Word”命令,返回Word主界面,按下“Alt+F8”组合键,打开“宏”对话框,选择并运行宏,很快就可以得到结果(如图7)。

利用VBA代码实现复杂查重任务

最近在工作中遇到一个比较复杂的要求,需要对“数据表”工作表中B列(户口编号)、D列(户主姓名)进行查重操作,希望在查询到重复的户主信息之后,将相关信息在“校验信息”工作表A列的空白单元格显示。我们可以通过VBA代码实现上述要求:

按下“Alt+F11”组合键,打开Microsoft Visual Basic for Applications编辑器窗口,依次选择“插入/模块”,在右侧窗格插入一个空白模块(如图8),手工输入或粘贴如下代码(相关代码可关注电脑迷微信回复“201506vba4”获取下载链接)。

VBA语言 第3篇

关键词:检索软件,VBA语言,档案电子目录

随着科技的信息化、智能化,如何提高档案由纸质模式向信息化模式转变对档案利用和检索效率尤为重要[1]。

很多单位现阶段的存储方式为纸质存储,并将一年的所有档案的文件名称、文号、文件所在的卷号和件号按照其主管机关分类整理在不同的工作表内,每年的文件目录形成一个Excel文件,在档案利用时通过Excel电子目录查询档案文件名中的关键字或档案中文件的文号,得到该文件所在的卷号和件号,从而得到所查询文件的具体位置。

因此,检索软件需具备以下几个特点[2]:(1)不确定年份检索。要求软件在检索过程中既可对某一特定年份进行检索,同时也可在某一具体年份范围内检索,甚至在所有年份中遍历检索。(2)多种检索条件结合进行检索。软件使用时,可根据输入的多个检索条件综合检索,快速准确确定所需文件。(3)输出档案文件的详细信息,便于使用者对档案进行查找。(4)软件需有较强的可拓展性。随着档案目录的增加,软件仍可有效地进行检索,且略经修改后,还可应用于其他类似的检索过程。

1 技术路线

根据上述软件的需求分析,提出以下几种检索方法[3]:

(1)已知档案所收录的年份。1)按照确定的文号检索。2)按照模糊的文号检索。3)按照模糊的题名关键字检索。4)按照责任者+题名关键字检索。5)按照准确题名关键字进行检索。

(2)已知档案收录的年份范围,按照如(1)所述组合进行检索。

(3)未知档案收录的年份和年份范围,按照如(1)所述方法组合进行检索。具体检索方式如图1所示。

2 软件实现方法

2.1 对于Excel的开发方法形式

(1)VBA的内部开发。所谓内部开发是指使用Excel内嵌的VBA[4]进行开发。可以将VBA看作是VB的一个子集,二者在数据定义、结构设计、语法使用上均一致。

(2)COM(Component Object Model)插件开发。COM插件也叫COM加载项,实际上是一个动态链接库,可开发程序作为一个链接库链接到一些程序中从而扩展其功能。

(3)自动化服务开发。自动化使应用程序能对另一个应用程序中实现的对象进行操作或是将对象公开以便可对其进行操作。

在对档案电子目录检索软件进行开发时,本文选用VBA内部开发Excel,因VBA是一种面向对象的编程语言,Excel中的每一项均可被认为是一个对象,VBA在对象操作上语法结构具有简洁明了的特点,且其程序调试直观方便,是编制档案电子目录检索软件理想的语言。

2.2 软件检索流程

检索软件编制的基本元素即为Excel中的对象,通过对Excel中的对象的各类操作来完成检索软件的编制。Excel对象包括以下几个方面[5]:

(1)Application对象:Application对象代表整个Microsoft Excel应用程序本身,所有打开的工作薄都属于一个Excel应用程序本身,即一个Application对象。

(2)Workbook/Workbooks对象:代表一个Excel工作薄/Excel应用程序中当前打开的所有Workbook对象的集合,是Application对象的下一个层次。

(3)Worksheet/Worksheets对象:代表一个Excel工作表/Excel应用程序中当前打开的所有Worksheet对象的集合,是Workbook/Workbooks对象的下一个层次。

本文就未知档案所在的年份与年份范围一例,对软件的实现流程予以说明,流程图如图2所示。

2.3 关键技术实现

2.3.1 提高检索效率

在以责任者+题名关键字这种方式进行检索时,作者采用以下方式提高检索效率,将工作薄中责任者相同的电子目录储存在同一个工作表内,将工作表命名为责任者的名称,在该条件检索时,程序首先判断工作表的名称是否包含输入的责任者的名称,若工作表的名称与输入的责任者吻合,那就在该工作表内进行下一步搜索[6]。其核心代码如下:

但若检索时并未输入责任者信息,软件按照上述代码运行势必会出现无法检索的情况。因此,本文在进行电子目录的制作时,首先将该年份的所有目录集中在一个工作表中,并将此工作表命名为“总的归档目录”,在检索开始时,程序首先判断是否输入了“责任者”这一检索条件,若未输入,则所有检索工作都在“总的归档目录”的工作表内进行。核心代码如下所示,其中searchword6、searchword3、searchword4分别为题名关键字、责任者、文号所对应的检索输入项。

以上方法的实施提高了检索软件的检索效率,避免重复检索。

2.3.2 跨年份搜索

从上文中可以看出,无论是已知年份范围的档案检索还是未知年份和范围地检索,跨年份搜索是一个必须要解决的关键问题,在技术上体现为必须准确快速地打开几个或所有工作薄,并对其中某一检索条件在打开的工作薄中实现遍历检索。

本文所采取的方法为将本单位所产生的所有年份电子目录的工作薄统一命名为“XXXX年归档文件目录.xlsx”并存储在一个文件夹内,在检索开始之前,程序自动打开该文件夹[7]。

在已知年份范围时,将年份范围的上极限所在的工作薄作为循环初值,随着循环次数的增多,依次打开各年份范围内的文件进行查找,其核心代码如下,其中searchword2代表输入的年份范围例“2000~2004”。

当未知年份和年份范围时,需要对所有年份的工作薄进行遍历搜索,所以需要将目标文件夹内所有年份的工作薄都存储在一个字符型数组中,每个工作薄的文件名称即为数组中的一个元素。其核心代码如下

针对电子目录检索的两种方法对跨年份检索采取了针对性的做法,事实证明,这两种方法的使用可以大幅提高软件的检索效率。

2.3.3 全部年份检索时分组检索

通过前期调查可知,这种情况下检索出的结果一般均聚集在近几年,本文采用以每5年为一组进行检索,近5年的一组检索完成后,使用者通过软件显示区内容判断是否进行前一个5年的检索,这一检索过程中的难点和关键点在于如何实现人机互动。

在解决这一问题时,本文将目标文件夹中所有电子目录工作薄的数目整除5,得到一个整数,代表这个整数循环变量的初值z设置为1,则每个工作薄在目标文件夹中的地址就变为i=(5×(z-1)+1)To(5×z),z值的增加即代表组数的增加,当第z组检索完成时,需要由使用者判断是否进行前一个5年的检索[8],其核心代码如下

在运用上述方式解决问题时,便会出现一个现象,若使用者选择不再进行下一组检索,但当其了解显示区的内容后,发现并没有符合条件的输出选项,使用者便需再次进行检索,但按照上述代码可知,程序自动从第一组进行检索,这种情况大幅降低了软件的智能性。因此,在程序编制时,每一组检索完成后,将此时程序中的组号(即z值)赋值给一个中间变量h,并在程序界面上设置一个“继续检索”按钮,使用者遇到上述情况时,点击“继续检索”,此时组号z=h+1,将此组号带入循环继续检索,则此时软件便不会重复检索,其核心代码如下

2.3.4 软件的可拓展性

随着年份的增加,档案的电子目录也在不断增加,并要求检索软件在进行小范围的修改后,可准确有效地应用于其他电子目录的检索过程。因此,软件需要具有较强的可拓展性,在编制该软件时,需尽量使程序中的变量在目标文件夹中获取工作薄和工作表的具体信息[9];程序中尽量弱化电子目录本身的特征,电子目录需运算的内容尽量赋值给中间变量,这样可保证该软件应用于其他形式的电子表格时,只需修改程序中的少部分内容。

为了使用便利,该软件还包括软件使用说明区域、保存检索结果功能等其他部分[10],软件界面如图3所示。

3 结束语

在充分考虑需求分析的基础上,确定了检索软件的检索流程,并在比较分析Excel开发方法的基础上,选用VBA语言对检索软件进行开发,在开发过程中解决了多检索条件同时检索、跨年份检索、全部年份检索时的人机互动、软件可拓展性等关键问题。此外,还完成了档案电子目录检索软件的编制。该目录检索软件提高了档案电子目录检索效率,减少了人工操作的步骤和时间,多重检索条件同时检索提高了检索的准确率,并可将某一项目在一定时间范围内的所有文件名称罗列在同一显示区上,有利于分析各项目的进行情况和时间节点,为档案的管理与利用提供了便利。但本软件仍有需要改进之处,例如在保密形式严峻的情况下软件的安全性问题等,是需要进一步研究的问题。

参考文献

[1]涂志兰.企业档案工作发展的前景[J].贵州电力技术,2011,14(4):90.

[2]蒙继承.电子档案利用与纸质档案利用的需求比较探讨[J].职业圈,2007(8):188-189.

[3]周枫.论档案检索语言在电子档案管理中的应用[J].卷宗,2013(6):16-17.

[4]布伦格林.Excel专业开发[M].北京:电子工业出版社,2007.

[5]罗刚君.Excel VBA程序开发自学宝典[M].北京:电子工业出版社,2009.

[6]陈维.基于VBA的库存管理系统的设计与实现[J].广东农工商职业技术学院学报,2010,26(2):83-85.

[7]张江,李佩.基于VBA的数据查询优化方案[J].数据库与信息管理,2012(16):63-65.

[8]韩小良.最新Excel VBA使用范例大辞典[M].北京:中国铁道出版社,2012.

[9]顾士学.基于Excel2003VBA成绩分析模板的设计与实现[J].白城师范学院学报,2011,25(3):51-53.

利用EXCEL VBA自动判分 第4篇

关键词:自动判分;管理信息系统;VBA

中图分类号:G434 文献标志码:B 文章编号:1673-8454(2014)02-0075-02

随着IT技术的不断普及,以关系数据库为基础的管理系统在日常工作中得以广泛应用,各类管理系统的应用教学也逐渐成为高校专业课程教学的重要内容,但如何对该类教学结果进行判分成为一个难以解决的问题。

目前较常见的解决办法有两种:一种是通过开发模拟考试软件进行判分,即虚拟某一管理系统的界面和功能,按指定步骤完成操作即判断得分;另一种是专门开发某一管理系统的判分软件,根据操作结果来判分。但这两种方法均存在开发不易、灵活性差的问题。本文拟以用友U8的凭证和科目总账为例,通过取自数据库中的数据,利用EXCEL和VBA匹配学生结果和标准答案来完成这一判分过程。

一、相关工作簿

为完成自动判分过程,设计了pf.xls、bz.xls和xs.xls三个工作簿,pf.xls为判分信息文件,bz.xls为标准答案,xs.xls为学生结果,三表结构如图1、图2、图3。

1.判分信息文件:pf.xls

如图1所示,该工作簿仅有main工作表,A列为学生姓名,C:H列为判分信息,其中D列为需判分的数据库表名,F列为该项满分值,G列为该表标准答案的总行数,H列为该表中需判分的列号。

2.标准答案文件:bz.xls

如图2所示,该工作簿中的工作表与pf.xls中的D列相对应,如本例中有gl_accsum和gl_accvouch两个工作表。各工作表中A列为姓名,B列为得分,C列为组合结果,从D列开始是取自标准答案的数据库该表的内容,B和C列为空。

3.学生结果文件:xs.xls

如图3所示,学生结果文件结构同标准答案文件,区别在于各表内容取自学生数据库该表的内容。

二、判分过程

1.取标准答案和学生结果

先根据pf.xls中D列中各表名,用SQL语句取出标准答案和学生结果形成bz.xls和xs.xls两个工作簿(因各系统数据平台各异,为节省篇幅,该部分程序略)。

2.处理标准答案

将bz.xls中各表的内容根据操作结果进行调整,把不构成判分的行删除,有多种答案的情况增加相应行。将标准答案各表中判分总行数填入pf.xls的G列,该表总得分填入pf.xls的F列。如第2行的分数和得分点表示gl_accsum的标准答案中有55行,占总分的40分。

3.设置分值、判分列和判分项

将各表的判分列填入pf.xls的H列,以半角逗号间隔。如“凭证”所对应H3的值“e,f,h,u,w,x”,表示根据gl_accvouch表中这6列数据判断凭证结果的正确性。

4.用程序判分

在pf.xls中按ALT+F11进入VBE窗口后输入判分程序代码,执行后在xs.xls中新增一张”判分”表,表中内容为各学生的分项得分和总分。结果见图4。

三、判分程序代码

Sub 判分()

dp1 = ThisWorkbook.Path & "\"

fmax = Sheets("main").Range("d65536").End(xlUp).Row '需判分表数

xmax = Sheets("main").Range("a65536").End(xlUp).Row '学生人数

Workbooks.Open Filename:=dp1 & "bz.xls"

Workbooks.Open Filename:=dp1 & "xs.xls"

With Workbooks("xs.xls")

On Error Resume Next

Application.DisplayAlerts = False

.Sheets("判分").Delete

.Sheets.Add.Name = "判分"

'增加一张判分表,再次运行前需先把该表删除

.Sheets("判分").Range("a1:a" & xmax) = Sheets("main").Range("a1:a" & xmax).Value

End With

For i = 2 To fmax '逐表判分

With Workbooks("pf.xls").Sheets("main")

SN = Trim(.Cells(i, 4).Value) '表名

sc = Trim(.Cells(i, 5).Value) '表中文名

mf = .Cells(i, 6).Value '单项满分数

fs = mf / .Cells(i, 7).Value '每一得分点分数

gs = Trim("=" & Replace(.Cells(i, 8).Value, ",", "2&" & """_""" & "&") & 2) '替换后的公式

End With

With Workbooks("bz.xls").Sheets(SN)

'生成各项标准答案

.Range("c2:c" & .Range("a65536").End(xlUp).Row).Formula = gsendprint

End With

With Workbooks("xs.xls").Sheets(SN)

'用match()学生各表判分

xsmax = .Range("a65536").End(xlUp).Row

.Range("c2:c" & xsmax).Formula = gs

.Range("b2:b" & xsmax).Formula = "=if(iserror(match(C2,[bz.xls]" & SN & "!$C:$C,0)),0,1)"

End With

With Workbooks("xs.xls").Sheets("判分")

'用sumif()分项统计学生得分

.Cells(1, i + 1).Value = sc & mf

.Range(Cells(2, i + 1), Cells(xmax, i + 1)).Formula = "=round(SUMIF(" & SN & "!A:A,判分!A2," & SN & "!B:B)*" & fs & ",2)"

End With

Next i

With Workbooks("xs.xls").Sheets("判分")

'用sum()汇总学生得分至判分表第2列

.Cells(1, 2).Value = "总分"

.Range(Cells(2, 2), Cells(xmax, 2)).Formula = "=SUM(c2:z2)"

End With

Workbooks("xs.xls").Close Savechanges:=True

Workbooks("bz.xls").Close Savechanges:=True

End Sub

四、本办法的优点

1.简单易用

本办法主要利用EXCEL查找函数的功能进行判分,只要用VBA通过SQL语句将数据取到工作簿中,完成判分表中相关设置,利用上述代码即可用本办法完成判分功能。

2.灵活性强

上述判分代码不受管理系统本身各表结构影响,具有通用性;同时需要进行判分的表、列和行均自行设计,可以根据需要随时调整。

3.结果可逆

在xs.xls的判分表中有学生的各项得分,各分项表中有得分明细,从中可以了解和分析学生的错误题目及原因,从而有效保证了教学效果。

以上方法在EXCEL2003、EXCEL2010和用友U8环境下测试通过。 (编辑:鲁利瑞)endprint

End With

With Workbooks("xs.xls").Sheets(SN)

'用match()学生各表判分

xsmax = .Range("a65536").End(xlUp).Row

.Range("c2:c" & xsmax).Formula = gs

.Range("b2:b" & xsmax).Formula = "=if(iserror(match(C2,[bz.xls]" & SN & "!$C:$C,0)),0,1)"

End With

With Workbooks("xs.xls").Sheets("判分")

'用sumif()分项统计学生得分

.Cells(1, i + 1).Value = sc & mf

.Range(Cells(2, i + 1), Cells(xmax, i + 1)).Formula = "=round(SUMIF(" & SN & "!A:A,判分!A2," & SN & "!B:B)*" & fs & ",2)"

End With

Next i

With Workbooks("xs.xls").Sheets("判分")

'用sum()汇总学生得分至判分表第2列

.Cells(1, 2).Value = "总分"

.Range(Cells(2, 2), Cells(xmax, 2)).Formula = "=SUM(c2:z2)"

End With

Workbooks("xs.xls").Close Savechanges:=True

Workbooks("bz.xls").Close Savechanges:=True

End Sub

四、本办法的优点

1.简单易用

本办法主要利用EXCEL查找函数的功能进行判分,只要用VBA通过SQL语句将数据取到工作簿中,完成判分表中相关设置,利用上述代码即可用本办法完成判分功能。

2.灵活性强

上述判分代码不受管理系统本身各表结构影响,具有通用性;同时需要进行判分的表、列和行均自行设计,可以根据需要随时调整。

3.结果可逆

在xs.xls的判分表中有学生的各项得分,各分项表中有得分明细,从中可以了解和分析学生的错误题目及原因,从而有效保证了教学效果。

以上方法在EXCEL2003、EXCEL2010和用友U8环境下测试通过。 (编辑:鲁利瑞)endprint

End With

With Workbooks("xs.xls").Sheets(SN)

'用match()学生各表判分

xsmax = .Range("a65536").End(xlUp).Row

.Range("c2:c" & xsmax).Formula = gs

.Range("b2:b" & xsmax).Formula = "=if(iserror(match(C2,[bz.xls]" & SN & "!$C:$C,0)),0,1)"

End With

With Workbooks("xs.xls").Sheets("判分")

'用sumif()分项统计学生得分

.Cells(1, i + 1).Value = sc & mf

.Range(Cells(2, i + 1), Cells(xmax, i + 1)).Formula = "=round(SUMIF(" & SN & "!A:A,判分!A2," & SN & "!B:B)*" & fs & ",2)"

End With

Next i

With Workbooks("xs.xls").Sheets("判分")

'用sum()汇总学生得分至判分表第2列

.Cells(1, 2).Value = "总分"

.Range(Cells(2, 2), Cells(xmax, 2)).Formula = "=SUM(c2:z2)"

End With

Workbooks("xs.xls").Close Savechanges:=True

Workbooks("bz.xls").Close Savechanges:=True

End Sub

四、本办法的优点

1.简单易用

本办法主要利用EXCEL查找函数的功能进行判分,只要用VBA通过SQL语句将数据取到工作簿中,完成判分表中相关设置,利用上述代码即可用本办法完成判分功能。

2.灵活性强

上述判分代码不受管理系统本身各表结构影响,具有通用性;同时需要进行判分的表、列和行均自行设计,可以根据需要随时调整。

3.结果可逆

在xs.xls的判分表中有学生的各项得分,各分项表中有得分明细,从中可以了解和分析学生的错误题目及原因,从而有效保证了教学效果。

VBA语言 第5篇

工程建设前期均须测绘大比例尺原始地形图,以作为设计人员规划设计之用。目前,测绘单位常采用全站仪、RTK或近景摄影测量进行外业碎部点数据采集,然后运用行业成图软件生成地形图。地形图精度是否达到规范要求需要进行精度检测。检测分为平面精度检测和高程精度检测,二者可以分开进行也可以同时进行。CASS7.1检查入库菜单里面点位误差检查和边长误差检查即是针对平面精度检测。实践中一般采取以下三种方法针对高程精度进行检测:(1)点位还原法,即从所有碎部点数据中随机抽取总点数的10%~20%的数据,使用全站仪利用点的平面坐标采用极坐标法于实地放样出该点,然后测量点位二次高程并且与点位的一次高程进行比较,最后根据所抽取的子样统计得出的中误差来估计总体的精度;(2)剖面法,即检测人员于实地进行断面测量,内业根据断面数据文件生成断面图并与根据地形图所剖得到的断面图进行比较;(3)检查点法,即检测人员在测区内采集任意点位三维数据,点位要求覆盖整个测区,要有一定的密度且分布均匀,然后展点到所生成的地形图中去,采用内插的方法计算点位的图面高程并与点位的抽测高程进行比较,最后计算中误差。该方法是实践中比较常用的方法。本文正是基于第三种方法编写地形图精度检测软件。

1 编程思路

1.1 构TIN

原始数据为*.dat格式文件。三角网构网算法归为两大类[1],即静态三角网和动态三角网。静态算法中以三角网生长算法较为典型,动态算法中则以数据逐点插入算法较为普遍。软件基于文献[2]、[3]介绍的构网思路采用三角网生长算法中的递归生长算法。该算法首先生成第一个三角形,然后由第一个三角形向外扩展直到最后联结全部离散点构成Delaunay三角网。该算法涉及的相关判别法则限于篇幅,在此不作详细阐述,直接给出构网结果,见图1。

1.2 展点

该部分将检测数据(*.dat格式)展点到图形中去。相关代码:

1.3 检测

该部分根据上面所生成的三角网及展点进行点位高程中误差统计。

算法的基本流程:

程序首先建立两个选择集合,分别用于存放检测点及三角形元素,其次建立双循环结构对于检测点集合中的每一个点元素遍历三角网集合中的每一个三角形元素,并进行点与三角形位置关系的判断,若位于某三角形中则调用该三角形的顶点数据,采用线性插值的内插方法进行相应的内插计算,将结果放入指定的数组,最终程序建立与Excel的通讯将结果输出到Excel指定区域。

算法的数据结构:

1.3.1 判断检测点与三角网中三角形的关系[4]

思路:如图2所示,△V1V2V3的三个顶点的坐标分别为V1(x1,y1),V2(x2,y2),V3(x3,y3),任一点P(x,y)。则点P和△V1V2V3的位置关系如下判定,L1、L2、L3定义如下:

L1=[(x3-x2)(y-y2)-(y3-y2)(x-x2)]

L2=[(x1-x3)(y-y3)-(y1-y3)(x-x3)]

L3=[(x2-x1)(y-y1)-(y2-y1)(x-x1)]

判断条件:

L1=0或L2=0或L3=0时点P在△V1V2V3的某一边上;

L1>0且L2>0且L3>0或L1<0且L2<0且L3<0时点P在△V1V2V3内;

除去以上两种情况时点P在△V1V2V3外。

代码如下:

'当在三条线段上的值都有一样的符号时,点落入三角形中

1.3.2 计算检测点在三角形中的高程[5,6]

思路:

使用空间三角形3个顶点数据确定一个平面,继而计算出内插点的高程。

采用平面线性内插公式:ax+by+cz+d=0,其中:

代码如下:

1.3.3 循环计算并输出[7,8,9]

'该部分设计每一个抽测点遍历三角网集合中的三角形元素,若位于某三角形则进行相应的内插计算

2 工程实例

以某工程原始地形高程精度检测为例。

3 总结

(1)根据图3可见第27号点的高程偏差较大,分析可能系野外测量过程中棱镜高输入错误,棱镜高值输小了,需予以检查。

(2)根据表1可见高程中误差0.6m满足行业规范中关于山地、高山地高程中误差不大于1m的要求;但是根据高程误差折线图统计有23个点出现负值,占到总点数的76.7%,分析认为该原始地形有抬高的趋势。对于工程建设而言,大面积抬高原始地形意味着增加土石方开挖量,无形中增加业主的投资成本。因此,即使高程中误差满足要求,也必须对抬高原始地形的趋势予以关注控制。

(3)图4误差分布图系根据本软件计算的某砂石料工程原始地形高程误差成图,由图4可见偶然误差的分布呈现正态分布的规律。

(4)程序运用VBA语言编写,在Win XP系统CAD2004平台下运行成功。具体运用时可将宏代码添加到自定义菜单下面,运用十分方便。具体代码为:

[展点(&z)]^C^C_-vbarun"d:/rjb/dgx/wangjg.dvb!zdgw.GCZanGaoCeng"

[构网(&g)]^C^C_-vbarun"d:/rjb/dgx/wangjg.dvb!zdgw.ExtendTriangleByFile"

[检查(&j)]^C^C_-vbarun"d:/rjb/dgx/wangjg.dvb!dxjc.wangjg.GCZanGaoCeng"

(5)测绘人员将测绘原理与计算机语言结合起来进行二次开发能够解决实际中出现的新问题,也提高了工作的效率。该软件经过多个工程地形图检测实践,证明其正确、实用,提高了内业成图检测的作业效率。

(6)本文假定检测前已经过三角高程测量误差分析并采取相应措施,如控制测距距离及垂直角等,即检测测量时的误差可以忽略。

(7)程序设计每个点需要遍历三角网并进行判断、内插计算等操作。因此,点数越多,三角网越复杂,程序进行内插计算所花费的时间也越长。本程序的数据结构优化将是接下来需要研究的课题。

摘要:目前国内行业商用软件如CASS、广州开思等在地形图高程精度评定方面相对较弱。以往都是采用手工逐点量距内插计算检测点位的高程并进行高程中误差统计,若碰到几百个检测点,手工计算工作量非常大而且容易出错。因此根据工作需要研制开发基于AutoCAD平台的地形图精度检测软件就变得很有意义,借助程序计算代替传统的手工计算使得工作效率大为提高。实践证明,软件设计思路明晰,算法可靠。

关键词:地形图,精度,高程,中误差,软件

参考文献

[1]李志林,朱庆.数字高程模型(第二版)[M].武汉:武汉大学出版社,2003.

[2]刘友光,黄桂兰,黄全义等.工程中数字地面模型的建立与应用及大比例尺数字测图[M].武汉:武汉测绘科技大学出版社,1997.

[3]吴力新,史文中.地理信息系统原理与算法[M].北京:科学出版社,2003.

[4]龚健雅.地理信息系统基础[M].北京:科学出版社,2001.

[5]张宏,温永宁,刘爱利等.地理信息系统算法基础[M].北京:科学出版社,2006.

[6]姜友谊,黎晓.数字地面模型内插方法的优劣分析[J].西安科技学院学报,2001,21(3).

[7]佟士懋,邢芳芳,夏齐霄.AutoCAD ActiveX/VBA二次开发技术基础及应用实例[M].北京:国防工业出版社,2006.

[8]佟彪.VB语言与测量程序设计[M].北京:中国电力出版社,2007.

优化VBA代码 提高运行效率 第6篇

一、正确使用变量提高运行速度

1. 强制声明变量

在VBE编辑器中的菜单“工具-选项”对话框中“编辑器”选项卡中, 您应该始终保持“要求变量声明”复选框被选中, 这样将在模块代码顶部出现Option Explicit语句, 要求您在编写代码时对所有出现的变量均进行声明, 这样, 在使用变量时减少内存需求并提高性能。必须始终用特定的数据类型声明所有变量。如果不使用特定的数据类型声明变量, VBA会创建Variant类型的变量, 这将比任何其他数据类型要求更多的内存。应该将那些存储整型值的变量声明为Long类型, 而不是Integer类型。

2. 减少变量的作用范围并及时释放变量, 特别是对象变量, 在其使用完后及时释放

例如:

3. 用VBA数组而不是单元格区域来处理数据

即可以先将数据写入到某个数组, 然后用一个语句就可以将数组中的数据传递到单元格区域中。在创建已知元素的确定数组时, 使用Array函数对于节约空间和时间以及写出更具效率的代码是非常理想的。

例如:

Dim Names As Variant

Names=Array (“Fan”, “Yang”, “Wu”, “Shen”)

Range (“A1:D4”) =Names

此外, 应该尽量使用固定大小的数组。如果确实选择使用了动态数组, 应该避免数组每增加一个元素就改变一次数组的大小, 最好是每次增加一定数量的元素。

二、尽量使用VBA原有的属性、方法和Worksheet函数

由于Excel对象的属性、方法和事件多不胜数, 对于初学者来说, 可能对它们不能全部了解, 这就产生了初学者经常编写与Excel对象的属性、方法相同功能的VBA代码段, 而这些代码的运行效率又显然与Excel对象的属性、方法完成任务的速度相差很大。例如:可以用Range的属性CurrentRegion来返回Range对象, 该对象代表当前区 (当前区指以任意空白行及空白列的组合为边界的区域) , 而同样功能的VBA代码却需要数十行。因此, 编程前应可能多地了解Excel对象的属性、方法, 尽量避免编写一大段代码来解决原本使用Excel中的属性、方法只要一条语句来解决问题的情况出现。

最大限度使用EXCEL的Worksheet函数是提高程序运行速度的极有效的方法。例如:要求平均成绩, 在VBA中可使用如下一段代码:

完成同样的功能, 使用如下的函数就比上面的代码快得多:

AverageValue=Application.WorksheetFunction.Average (Worksheets (1) .Range (“D1:D500”) )

Application.WorksheetFunction.Average表示调用工作表计算平均值函数。其他函数如Count, Counta, Countif, Match和Lookup等, 都能代替相同功能的VBA程序代码, 提高程序的运行速度。

三、尽可能减少使用对象引用

Excel中的对象众多, 包括Application、Workbook、Worksheet、Ranges、Range、Cells、Cell等, 每一个Excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用, 这些OLE调用都是需要时间的, 减少对对象引用能加快VBA代码的运行。

1. 引用同一对象的多个属性时使用With语句

2. 多次使用同一个对象引用时使用对象变量

如果你发现一个对象引用被多次使用, 则你可以将此对象用Set设置为对象变量, 以减少对对象的访问。如:

3. 在循环中要尽量减少对对象的访问以节省资源

如果对单元格赋相同的值200, 则可以使用如下代码:

Set Myrange=Workbooks (1) .Sheets (1) .range (“D1:D50”)

Myrange.value=200

4. 减少对象的激活和选择

如果你是通过录制宏来学习和使用VBA的, 则你的VBA程序里一定充满了对象的激活和选择, 例如:Workbooks (XXX) .Activate、Sheets (XXX) .Select、Range (XXX) .Select等, 但事实上大多数情况下这些操作不是必需的。例如:

四、在VBA中关闭屏幕更新

关闭屏幕更新也是提高VBA程序运行速度的有效方法, 通常能缩短运行时间的2/3左右。关闭屏幕更新的代码如下:

Application.ScreenUpdate=False

在VBA程序运行结束时再将该值改回来:

Application.ScreenUpdate=True

当然, 代码优化可能不是绝对必要的, 这取决于所做的工作。如果编写一个快速且简短的或者是一次性使用且与速度、简洁要求无关的代码, 您就不需要优化代码。另一方面, 如果要处理一个带有很多数据、工作簿、工作表等大的工程, 优化代码提高应用程序运行速度就非常有必要了。编写程序时注意使用更优的代码将会使你的代码更简洁、运行更快速、并且容易为您自已和他人阅读和调试。同时, 由于您的代码简洁, 因而输入更快, 工作效率更高。

参考文献

[1]张强.EXCEL2007与VBA编程从入门到精通.

[2]郭兵译.Excel 2007 VBA与宏完全剖析.

VBA创建完美EXCEL举例 第7篇

关键词:Excel,VBA编程,导入数据

在90年代早期, 每个需要自动化的应用程序都有不同的自动化语言, 比如EXCEL的宏语言来使EXCEL自动化, WORD BASIC使WORD自动化等等, 这给人们学习使用各种应用程序带来不便, 于是微软决定开发一种通用的自动化语言, 这就是Visual Basic For Application (VBA) 。

VBA使Office中的Word、Excel、Access、Powerpoint这些软件的应用更加高效, 例如:通过一段VBA代码, 可以实现画面的切换;可以实现复杂逻辑的统计 (比如从多个表中, 自动生成按合同号来跟踪生产量、入库量、销售量、库存量的统计清单) 等。VBA针对特定软件时操作更灵活, 最典型的是excel的VBA, 它可以直接引用excel函数, 运行一些针对excel的指令, 使excel操作界面人性化, 还可以迅速的实现多个步骤的手工操作。

1 用excel做开发平台实现应用程序的原因

在excel环境中基于应用程序自动化有哪些优点呢?首先使用VBA可以实现的功能有自动化重复的任务、自定义excel工具栏, 菜单和界面、简化模板的使用、创建报表及对数据进行复杂的操作和分析等等。其次用excel作为开发平台可以连接到多种数据库, 由于excel界面大家都比较熟悉, 它内置了大量函数再加上本身功能都比较强大, 包括打印、文件处理、格式化和文本编辑等, 这些都是我们自定义excel, 使其成为开发平台的原因。

我们在用其他语言开发应用程序时, 一些基本功能的模块, 包括文件的打开和保存, 打印, 复制等都是需要自己去编写, 而用excel作为开发平台, 则由于excel已经具备这些基本功能, 我们只需要使用它。

2 excel的VBA编程功能举例

在excel中适当地使用VBA编程可以大大增强其交互功能, 达到意想不到的效果, 如:在Excel中应用VBA批量导入数据。

2.1 导入数据

我们要把一系列文本格式的数据文件导入到Excel中作为一条记录, 也就是一行。那么, 通过打开Excel, 然后开始录制宏, 然后定位到需要的位置, 读入需要的信息就可以了。首先打开文件, 通过导入文本文件向导, 读入数据, 将特定单元格的数据拷贝到一个目标Excel文件中, 然后关闭这个文本文件, 停止录制宏。运行了一下这个宏, 需要的数据都导进来了。

2.2 导入成批数据

怎么样把所有的数据文件都导入进来。比如一组“d*8.txt”、“d*9.txt”、“d*51.txt”之类的文件, 打开刚刚上面录制的宏, 文件名最后2位从46到89, 那么我们需要写一个i从1到44的循环, 把读入文件部分的文件名改为:"d*"& (i+45) &".txt"把粘贴目的地 (range) 表示行数的数字用i替换。执行按钮, 数据导入成功。

2.3 导入不同的文件的数据

通过一个打开文件对话框, 选择一系列文件, 然后将文件全路径存入一个集合或数组, 然后循环读出文件就可以了。首先创建了一个窗体, 然后放置了一个按钮, 将Common Dialog控件引入工程, 添加到窗体, 在按钮的点击事件里加入如下代码:

把原来的宏修改后保存在Do Import这个过程里, 传入文件名即可导入这个文件, 循环导入所有文件就可以了。

3 提高VBA程序运行效率的方法

Microsoft office办公软件在我们的生活中得到了广泛应用, 现在随着office办公软件的版本不断提升, 功能不断完善, 在office办公软件平台上开发出的的VBA应用程序越来越多。但是VBA是一种宏语言, 它的运行速度给我们带来了很大的限制。因此VBA编程的方法直接关系到VBA程序运行的效率, 为了提高VBA程序运行效率, 可以使用下面的一些的方法:

3.1 尽量使用V B A原有的属性、方法和Worksheet函数

在编程前我们应尽可能多地了解excel对象的属性、方法, excel对象特别多, 对应的它的属性、方法、事件就更加多了, 如果我们不全部了解它们的话, 可能在编程过程中经常编写与excel对象的属性、方法相同功能的VBA代码段, 当然我们编写的这些代码段的运行效率显然与excel对象的属性、方法完成任务的速度相差甚大。例如用Range的属性Current Region来返回Range对象, 该对象代表当前区。 (当前区指以任意空白行及空白列的组合为边界的区域) 。而同样功能的VBA代码需数十行。

3.2 尽量减少使用对象引用, 尤其在循环中

每一个excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用, 这些OLE调用都是需要时间的, 减少使用对象引用能加快VBA代码的运行。

3.3 减少对象的激活和选择

录制宏里面对象的激活和选择都用的比较多, 例如Workbooks (XXX) .Activate、Sheets (XXX) .Select、Range (XXX) .Select等, 事实上大多数情况下这些操作不是必需的。例如:

3.4 关闭屏幕更新

关闭屏幕更新是提高VBA程序运行速度的最有效的方法, 可以缩短运行时间2/3左右。关闭屏幕更新的方法:Application.Screen Update=False, VBA程序运行结束时再将该值设回来:Application.Screen Update=True。

参考文献

[1]李政, 梁海英, 李昊.VBA应用基础与实例教程[M].北京:国防工业出版社, 2005:46-136.

[2]吕洪升.常见数值计算在excel的VBA中实现[J].巢湖学院学报, 2008.

基于VBA风螺旋的精确绘制 第8篇

Auto CAD是目前世界上应用最为广泛的图形处理软件, 由于其灵活性, 功能的全面性, 受到了全世界应用者的广泛好评。由于其适用性, 以及Auto CAD工作团队逐年对其修复和补充升级, 其软件功能越来越完备, 也能紧跟技术的需要。但是由于其功能的多样性, 不可避免的牺牲了一些功能, 其中Auto CAD的算法功能比较薄弱, 在转弯过程中就不能提供绘制风螺旋的功能。而飞行运行在转弯过程中, 不可避免的受到风的影响。在无风影响时, 飞机的转弯飞行轨迹应该是一个正圆, 但是由于飞机在高空中飞行, 受到风的影响, 影响范围以原轨迹上的点为圆心以风偏离量为半径, 飞机可能在这个区域的任意地方。所以在转弯保护区需要附加风的影响, 由于转弯过程中风的影响会叠加, 保护区会不断的扩大, 最终用包络线将外边界包络才能得到最终保护区。

风螺旋画法的探究

除RF和FRT航段外, 飞机在其它航段中并没有对风影响进行航迹的修复, 在转弯的过程中为了保护飞机, 在凡是涉及到转弯的过程中, 都必须考虑到风对飞机转弯的影响。在ICAO DOC8168第二卷中规定了转弯保护区的两种画法:风螺旋和边界圆, 其中边界圆就是对风螺旋的一种简易画法, 如何精确的绘制螺旋线, 决定着飞行程序设计的准确性。以图1为例, 从a点进入, 转弯半径为r, 转弯中心为c点, 从a开始沿着转弯方向旋转θ角度, 此时风对飞行影响的偏移量为:Eθ= (θ*W) /R

其中θ为转过的角度, W是全向风速, R为转弯率。

其中以b为圆心的圆为全向风的影响范围, 将n个全向风的圆包络进去, 其中最小满足这一要求的包络线即为风螺旋线。根据分析知道, 该包络线必须与各个圆相切。将转弯角度细分得到的包络线就是精确的风螺旋线。如图2所示:

VBA对于风螺旋的实现

风螺旋虽然可以很好的绘制出保护区, 但是人工绘制存在很大的难度, 甚至是难以实现。采用VBA语言可以精确的绘制出风螺旋。VBA语言可以有效的减少工作量和误差。

根据风螺旋的影响因素制作出了风螺旋的参数界面如图3所示。

首先定义常数:pi=3.141592653, g=9.80665

计算函数gm=gama/180*pi, rr=v*v/g/Tan (gm) , R=v/rr/pi*180在风螺旋计算应用时调用这些函数。

定义风螺旋的旋转角度, 一般定义为270°, 也可以根据实际情况来进行定义划分, 在VBA的语言环境中并不能直接定义风螺旋的起止点, 在VBA语言环境中通过定义点的斜率来进行定义方向:

这样就定义了旋转角度是从风螺旋的起始点到结束点。由于在实际应用中, 转弯的角度是任意的, 因此插入风螺旋的角度必须与转弯起始角度一致, 因此在实际的过程中要输入起始转弯角度。

为了使风螺旋的起始点由人工寻找设定, 则必须使风螺旋的起始点是任意点, 为了实现这一功能需用到了Getpoint (”输入插入点:”) , 这样你可以在AUTOCAD任意的一点随意插入起始点。

确定了起始点之后要确定转弯的圆心, 在VBA中找点使用到的函数是Polar Point, 通过Polar Point函数经过起始点与圆心联系起来, p1=This Drawing.Utility.Polar Point (pt, pi, rr)

根据程序设计规范的规定知道, 风螺旋是以转弯中心为圆心, 以转弯半径rr为半径的圆的基础上加上全向风偏量进行的绘制。由上述可知:

Eθ=θ*W/R。

p1=This Drawing.Utility.Polar Point (pt, (pi-thita) , rr)

来找到第一个点。由此点就找到了第一个风影响的圆, 然后以d为圆心以e为半径画圆circle Obj=This Drawing.Model Space.Add Circle (d, e) , 然后找到包络线的点p1=This Drawing.Utility.Polar Point (pt, (pi-thita) , rr+e) 其中需要注意的是, 这样找到的点是不正确的, 因为通过此方法找到的点是d1点, 通过连接所有d1的包络线并不能把以d为圆心, 以Eθ=θ*W/R为半径的圆所有点包括进来, 所以以点d1为基础点进行包络是不正确的, 需要找到d2才是正确的点。

关于d2和d1的关系可以根据8168的规定, d1d和d2d之间的夹角为arcsin (w/v) 。可以采取变曲为直的方法来证明这一个夹角, 如图二所示, bd是没有风时候飞机走过的路径为一条直线。圆圈代表了全向风的影响范围, 那么包络线应该包络到d2那一圆的切线点, 而不是d1点, d1和d2之间的夹角a就是8168所对应的夹角。根据图4所示, 利用相似三角形原理, d1和d2之间的夹角与bd和bd2之间的夹角都是a。

bd表示飞机无风时候的飞过的距离bd=V*T, r为风的影响范围r=WT, 根据三角形定sin (a) =wt/vt=w/t, 即:

a=arcsin (w/v) 。

This Drawing.Utility.Polar Point (pt, (pi-thita+arcsin (w/v) ) , rr+e) 。由于VBA中并没有自带的反函数, 需要自己建造一个函数

Fuction Arcsin (x) as double

找到准确的包络线的点后, 利用VBA中的循环语言,

For i=1 To thita_n

thita=1.5*pi*i/thita_n

e=thita*w/R

根据情况将转弯角度分为n分。另外利用拟合线

Add Spline命令将其连接起来就得到了风螺旋线。构造函数的过程可以再简略点, 注意知识产权的保护。

风螺旋精度的验证

利用所做的方法可以知道, 由上述找到的点连接成的拟合线完全将风的影响范围包裹在里面。并且对于角度和风影响范围进行了讨论, 严格的按照了飞行程序设计规范的规定制作, 保证了风螺旋的正确性, 并且由于在计算过程中, 并没有像其他的绘制方式一样利用复杂的公式, 这大大的简化了绘制的难度和步骤, 并且提高了计算的速度。

当n值越大的时候风螺旋的圆也就越密, 则风螺旋就越准确。但是当划分到一定的程度的时候, 则运行越慢, 系统容易报错, 也是不可取的。只要满足相应的精度要求就可以。

根据以上的信息设计出的界面如图5所示, 根据实际的情况来输入转弯的速度、转弯坡度、风速、以及根据要求输入的的分段数n值, 运行之后计算转弯半径, 转弯率。进行绘制就可以得到风螺旋。以1°为步长, 即n为270。完全的满足了精度的要求如图五:

通过放大可以得知包络线完全将风的影响包裹进去, 说明制作的风螺旋符合规章的规定是正确的制作方法。如图6所示。

结束语

基于VBA的Word文档编辑 第9篇

在信息化社会日渐蓬勃、信息资产高度膨胀的今天,熟练掌握Microsoft Office办公套件几乎成为职场人员的必要装备。但在实际工作中,仅仅掌握办公软件的一般功能是远远不够的,如何实现高效办公成为我们迫切的需要,于是VBA便应运而生。

2. VBA概述

VBA(Visual Basic For Application)是Microsoft公司开发的一种绑定在桌面应用程序中执行办公自动化的语言,作为应用程序开发语言Visual Basic(VB)的子集,两者在结构上非常相似,但VBA不同于VB,原因是VBA要求有一个宿主应用程序才能运行,而且不能用于创建独立的应用程序,而VB可用于创建独立的应用程序[1]。VBA可使常用的过程或者进程自动化,可以创建自定义的解决方案,适用于定制已有的桌面应用程序。

通常意义上的VBA就是在Office中包含的一种加强Office功能的Basic语言,经过发展,在Office中,Word、Excel、Power Point、Access四个软件都有了自己的程序设计语言,通常统称为VBA。如果我们熟悉Office对象模型,即可在Office中开发自定义功能和特定任务的解决方案。

在Office中,几乎所有的菜单和工具栏命令都有对应的VBA代码,这些代码要单纯地去记实在困难。熟悉Office的朋友或许对宏并不陌生,通过录制宏、运行宏来完成一系列操作,使重复操作变得简单。何谓宏,是指将应用程序中的一系列操作标记为代码的一种语言。然而VBA还具有一般宏语言所不具备的特点,因为VB(Visual Basic)本身就是一种高级语言,所以VBA还具备一般高级语言的特征,可以用来从事专门的开发[2]。宏实际就是一系列Office能够执行的VBA语句,是一个指令的集合,可以使Office自动完成用户录制的一系列动作的组合。作为VBA开发者,使用宏录制器有两个原因:一是因为使用宏录制器可以节省时间,通常是用它来建立应用程序的基础;另一个原因是宏录制器可以用作编程辅助工具,如果我们不能确定如何编写一系列步骤,可以先进行录制,再查看其代码。即通过“录制宏”命令记录下想使VBA完成的一系列操作,则相应的VBA代码会出现在Visual Basic编辑器中,其中不符合要求的命令可以加以修改[3]。执行这些代码,就意味着连续执行所记录的各种命令。

3. VBA的编辑环境

Office为全部应用程序提供相同的综合开发环境,当你打开一个Word文档、Excel工作簿或Power Point演示文稿时都分别有一个与之相关的VBA工程。通过Office任一应用程序的菜单“工具”->“宏”->“Visual Basic编辑器”或直接按Alt+F11可显示其编辑环境。

在VBA编辑器中包含工程资源管理器、属性窗口及代码窗口。VBA程序的最高层是工程,每个工程是由多个对象和模块组成的,每个模块或对象是由若干个过程和函数组成的。

整个Windows操作系统都是运行在时间驱动的方式下,所以我们可以选择诸如在Excel工作簿的打开,Word文档的关闭等事件中编写代码,也可以添加相应的模块编写过程和函数,给应用程序提供一种方法让用户可以完成Office本身所不具备的功能,并且按照自己的习惯对Office进行定制,制作自己的工具栏、菜单栏以及常用的自动加载功能等[4]。

4. VBA实例

下面通过一个应用实例,给大家介绍如何在Word中利用VBA语言编程的方法,即为大批量的Word文档添加任意页眉的方法[2]。

4.1 问题的提出

在日常工作中,经常会创建很多Word文档,如果想把这些Word文档进行分类标识处理,可采用对不同类别的Word文档添加不同的页眉进行标识。这时就可以利用Word中VBA编程,来实现快速地把大量的不同类别的Word文档,通过添加不同的页眉来进行分类识别。

4.2 实现方法

假设现有一批Word文件存放在D:Word文件夹下,文件名分别为A01.doc、A02.doc、A10.doc。

第一步:先录制添加页眉的宏。

操作方法:

(1)启动Word;

(2)选择菜单“工具->宏->录制新宏”,按“确定”;

(3)选择菜单“文件->打开”,选择目录D:Word,选择文件A01.doc,按“确定”;

(4)选择菜单“视图->页眉和页脚”;

(5)输入添加页眉的内容;

(6)关闭页眉和页脚的工具栏;

(7)选择菜单“工具->宏->停止录制”。

但宏只能对一个Word文件添加页眉,如要对一批Word文件添加页眉,就要进行VBA编程,在编程中要充分考虑添加的页眉内容可由用户自定义。

第二步:用VBA编程实现对一批Word文件,由用户自定义添加页眉内容的操作。

为了能实现对一批Word文件,由用户自定义添加页眉内容的功能,就必须先创建一个输入添加页眉内容参数的窗口。方法是:启动Word后,按下Alt+F11,进入VBA设计环境,选择菜单命令“插入->用户窗体”,插入一个窗体。在窗体上分别放置一个标签控件,一个文本框控件和一个命令按钮。设计出如图2所示的一个对话框。

选择菜单命令“视图/代码窗口”,进入其代码设计窗口,然后编写命令按钮的Click事件的代码,如下:

4.3 执行方法

启动WORD后,按下“Alt+F11”,进入VBA设计环境,打开“USERF0rm1”窗体,按F5键。在窗体文本框中输入要设置的页眉内容,按窗体上的命令按钮,开始执行操作。执行完后,关闭“Microsoft Visual Basic”窗口,回到Word窗口。

以上所述的是Word中运用VBA编程的一个实例,特点就是采用窗体设计,让用户自己来决定所添加的页眉内容,在VBA编程中运用Do While Dir$("A"+name+".doc")<>""loop语句,可实现对任意多个文件的操作。

5. 结束语

由上述实例可见,在Word中运用VBA编程,不仅可以提高文档编辑的效率,还可实现文档编辑的灵活性[5]。为了提高VBA编辑的效率,可利用Word中宏命令的功能,先把某单项任务录制成初始的宏,然后在VBA编程中可参考初始的宏代码,再根据具体的需要,对初始的宏代码进行修改,以实现文档编辑中的特殊要求。

参考文献

[1]肖金秀.中文Word2002使用指南[M].北京:冶金工业出版社,2007.

[2]杨晓亮.Word VBA高效排版范例应用[M].北京:中国青年出版社,2005.

[3]郑丹青.VBA编程在Word中的运用[J].电脑知识与技术,2006,4.

[4]魏新俊.Visual Basic for Windows技术讲座(四)——Office中的宏语言VBA[J].电子与电脑,1996,4.

VBA语言范文

VBA语言范文(精选9篇)VBA语言 第1篇中缅油气管道是我国“十一五”期间规划的重大管道建设项目之一, 是我国油气进口的西南战略通道。该...
点击下载文档文档内容为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部