APP下载

Excel VBA在SATWE构件应力计算中的应用

2014-04-08

有色金属设计 2014年4期
关键词:窗体字符串单元格

沈 超

(昆明有色冶金设计研究院股份公司,云南昆明650051)

0 引 言

进入21世纪,高层建筑在国内发展迅速,设计思想和结构体系不断更新并日趋多样化,这也给高层结构的设计与分析提出了更高的要求。在高层结构设计中,构件的应力分析是一个重要环节,PKPM软件的有限元分析模块“SATWE”在高层建筑的构件应力分析方面被广泛应用。

实际工作中,结构设计师需对数据进一步分析、计算。虽然SATWE可将构件的数据导出为文本文件,但对数据进行手工分析,不仅耗时还容易出错,此种情况下通过编程来对导出的信息和数据进行分析计算,程序不需要复杂的功能和结构,“数据读取——处理——结果输出”的三步骤模式即可。因此,选择一个功能满足要求且简单、适用的平台来进行程序编写无疑可以提升工作效率,而Excel VBA是可选方案之一。

文章从编程的角度简述了Excel VBA具备的优势,介绍了如何对SATWE导出文件中的数据和信息进行利用。分析了“文件打开及文本读取”、“中间计算”及“结果显示”三个过程可能涉及到的编程元素,最后对程序的设计、编码提出建议。

1 Excel VBA在分析计算中的优势

VBA是上世纪90年代出现的微软Office平台二次开发工具,Excel VBA是成员之一。虽然在今天看来它无论语言特性及功能均无法与当下主流的开发平台同日而语,甚至微软公司也推荐使用VSTO取代VBA作为Office下新的开发工具。但对于SATWE的构件信息分析计算,Excel VBA依然具备以下优势:①适用于普通的分析计算。对SATWE构件数据的计算,即非专业软件开发且不涉及复杂的数值计算,没有了繁复的对象间逻辑关系及处理流程。能支持面向过程编程并且有一定数据精确度的语言都可以胜任此类程序的开发,VBA完全可以满足上述要求。②简单易学、功能强大。VBA是VB语言的子集,包含了VB常用的语法,放弃了一些复杂的语言特性。对于非专业编程人员,学习VBA要比学习主流的编程语言更加容易。同时,作为基于对象的编程语言,VBA除可以访问Excel内部的诸多功能,也可以访问Windows文件系统等外部对象,具备Windows窗体显示等能力,可以胜任一些需求较高的编程场合,至今依然是非专业编程领域的重要工具。③Excel的平台优势。Excel本身就是专门的数值处理工具,原生具备强大而丰富的数值处理能力。Excel VBA可以直接调用Excel内置的函数和对象,通过编程实现绝大部分Excel功能,这一便利性是许多编程语言所不具备的。④易于开发和部署。作为VBA成员之一的Excel VBA其开发环境已经内嵌在Excel软件之中,无需单独安装,编码及调试较为便利。开发完成的程序以“带宏的Excel表格”形式发布,无需安装。

在了解了VBA的优势之后,下面将讨论如何将Excel VBA运用到SATWE构件数据的分析计算中。

2 导出文件读取

从SATWE导出文件中包含了构件有关的文本说明及数据。要识别并利用这些信息需要用到Excel VBA的外部文件访问对象、对话框及文本读取对象。首先,要了解导出文件的内容构成。

2.1 导出文件内容构成

SATWE导出的构件信息文件由4个部分组成:①构件几何材料信息;②标准内力信息;③构件设计验算信息;④荷载组合分项系数说明,每个部分均包含有文本信息及数据。

2.2 文件名获取

打开一个SATWE构件信息文件应先取得包含完整路径的文件名称。既可以采用系统默认的名称(如:MemoInfor.txt)保存到固定的文件夹,也可以通过文件对话框来获取。前者写成一个字符串常量即可,但考虑到应用的灵活性,建议以文件对话框来获取被分析文件的名称,如表2.1中的示例代码。

文件对话框的申明类型及初始化方式见第1、4行,当FileDialog对象show方法返回值为-1时说明用户按下了确定打开文件的按钮,通过SelectItems返回完整的文件路径(行 5)。代码中fileName被显式申明为"",以备用户按下取消按钮时能确定地返回空字符串,fd对象在使用后也被显式地关闭。(因篇幅有限,本文不对代码中对象成员、方法、参数的使用方式及含义进行详述,相关对象及语法的信息可参考VBA说明文档或手册)。

2.3 文件打开及文本读取

读取信息时,可根据需要读取部分文本也可以一次读取整个文件的内容。文章中的代码采用标示识别的读取方式(分别设定开始及结束的文本标示),通过不同的标示设定既可以获取某个部分的文本内容,也可以一次读取整个文件。

在获取文件完整路径后可以使用系统的File-SystemObject对象获得文件的访问权,之后通过OpenTextFile方法以文本方式打开文件,并用ReadLine方法的迭代获取整个文件的文本内容。

表2 打开文件代码Tab.2 Open-file code

代码1到3行申明并初始化了读取文本文件的对象,从第4行开始的Do While循环将依次遍历整个文本文件,当开始读取标志被找到后can Read被设为True,通过第9行的代码处理将要读取的字符串,直至碰到终止读取标志或者文件尾,读取后的字符串存放到一个动态的字符串数组中。

3 中间计算的数据转换

进行分析计算之前需要对已经读取的文本中包括的信息和数据进行识别和读取。

对于文本信息的提取直接使用VBA中的部分字符串截取函数Mid,Mid可以灵活地分离字符串中的部分内容,对信息的定位就需要用到mid。以导出文件第二部分“标准内力信息”为例,需了解11种荷载工况分别对应的内力或工况号,以便在读取工况数据矩阵的时候加以识别。通常这11种内力信息的顺序是固定的,但如果SATWE模块升级后相关内力信息的排布位置如果发生变化,需要修改代码以适应。要灵活应对变化,可在读取工况文本说明后,对每种工况的编号做识别。

图1 标准内力信息的文本Fig.1 text of standard internal force information

工况信息的读取见图1。每种工况的编号均在正反括号内,且在一行中只出现一次,使用InStr函数定位正反括号的位置,就可以直接读出工况的编号数字,转为整型变量即可。对于工况类型的判断可以采用标志词的判断法,如“X方向地震”、“Y向风力”等,同样使用InStr函数,如果返回值不为0则表示文本包含标志词,用于判断的标志词可以作为字符常量写入代码或者存放于Excel工作表待使用时再读取。

图2 荷载工况数值矩阵Fig.2 Values matrix of load case

荷载工况数据处理需要将读取后的行文本转为数字,见图2。荷载工况的数据通过空格字符分开,可采用Split函数进行分离,工况数据文本间的空格数量不一,最少有3个,多的有5个,分离标志字符串可设为3个空格字符串。低于3个空格时可能会将部分空格字符分离为独立字符串,产生垃圾数据,使用3个空格进行分离后的每个字符串只包含1个工况数据,多余的空格可以通过Trim函数去除。

分离并转换后的数字可存入结构体类型,使用type关键词定义(如将其定义为“BeamLoadData”类型),再申明BeamLoadData类型的动态数组,即可将整个工况数据存入,并根据需要进行调用。需要注意的是:梁构件的位置信息与其它构件不同,图2显示的是梁构件的情况,如果结构体以单个工况下各位置的数据作为成员(即文本中一行的数据作为一个结构体类型)就需要针对其它构件的数据构成来定义结构体;如果以构件各位置下的工况数据作为成员(文本中的一列作为一个结构体类型),则不需要针对不同构件定义结构体类型,但建议在结构体中增加一个字符串成员以标示本列数据属于哪个位置。具体采用何种定义方式,视实际分析计算的需要而定。

其它部分的信息及数据读取方式可以参照上文示例,文本信息转换为数值和可识别信息后就能被用于计算、分析。因对数据的利用方式各有不同,有关具体计算过程的编码就不在此讨论。

4 结果输出

数据在计算完成后需要将计算的结果呈现给使用人员,以便在设计工作中参考使用。不同的计算需求形成的结果数据的形态各有不同,本文将以二维矩阵为例描述结果输出的方式。

以图3的显示的结果数据为例,计算各种系数组合情况下构件各位置的受力的复合值,行数据为分项系数编号,列为构件位置。Excel VBA的便利性之一就是可以直接将数据写入Excel表格,通过Sheets对象的Cells方法可以直接对单元格的内容进行读写,将计算结果写入指定的表格之中。

图3中单元格右上角的红色标记是单元格注释,内容是数值的计算过程。对于比较复杂的计算,如果能将参与计算的数值及计算方式列出,不仅有利于程序调试,也可以为使用者提供参考。图4为计算过程显示示例。

图3 计算结果显示Fig.3 Calculation results display

图4 单元格注释Fig.4 Cells comment

当鼠标移动到单元格之上时注释文本就会自动显示。要对单元格添加注释可以通过表3中的代码实现。

表3 添加注释代码Tab.3 Adding comments code

选中要添加注释的单元格(第2行),通过ActiveCell对象的AddComment方法添加注释文本,通过 ActiveCell.Comment.Shape 对象的 Height 和Width属性可以控制注释显示框的大小。

5 设计及编程建议

良好的设计和编码不仅有利于用户的使用、调试和修改也利于未来需求变化时的增加和改动。

5.1 界面设计

VBA是事件驱动语言,用户的操作都是通过对各种控件(如命令按钮)或可编程元素(如特定的工作表、单元格)来触发的。Excel VBA有3种可利用的界面:①Excel表格;②内嵌的Windows窗体;③自定义工具栏。选用何种界面提供给用户进行操作需要根据具体情况斟酌,上述3种操作界面各有优劣。

Excel表格的优势是直观,可放置各种控件,用户打开表格即可见,不足之处是直接在表格上放置控件影响界面的美观性,针对特定单元格进行编程要注意避免用户无意间修改单元格内容。使用Excel表格作为界面时1个工作表仅作单一用途,如:数据读取、计算、结果显示分别放置在不同的工作表,一表多用容易让用户产生歧义和误解。仅显示当前操作所需工作表,关闭暂时不需要的表格,如初始数据读取时仅需要显示当前工作表,将中间计算过程及结果显示表格暂时关闭,待需要时再打开。

Windows窗体的优势是符合日常界面的操作习惯和视觉特征,窗体的控件和数据与工作表内容相互独立。Windows窗体是Excel VBA中一个强大的工具,将控件放置在窗体,工作表仅用于数据显示是一种常用的设计风格。不过Excel中的窗体可选控件的数量有限,而且过多的窗体和过多的工作表一样,都不利于用户的使用。

自定义工具栏的直观性和界面元素最少,可作为窗体的替代,优势是不占用表格显示空间。由于可编程元素最少,建议用于基本功能的选择而不是实际操作。如程序具备分析、计算两个基本功能,可通过自定义工具栏来进行选择。

5.2 数据容器

动态数组是分析计算程序中最常用的数据容器,SATWE构件信息中的数据大多以二维矩阵形式存放,结构体与动态数组可以完整还原二维矩阵。Excel VBA还可以把Excel工作表用作数据容器,申明一个临时工作表,将数据暂存并使用Excel内置的功能进行预处理。

5.3 编程风格

高内聚、低耦合。把需求功能分解后按相互耦合的功能或函数来设计代码。不要把顺序执行但不同的功能放在一个函数中,如文件名称的获取、内容的读取、字符串转为数字三个功能可以设计为三个函数,将文件名、内容文本的字符数组等作为参数相互传递。中间的计算过程和结果显示也风格为不同的函数。高内聚、低耦合不仅有利于调试,也可以较好地应对未来需求变化时候代码的改变。

非界面控制代码单独存放。非界面控制类的代码,应该放置到公共代码文件.bas中,而不是直接写入工作表或者窗体的事件代码,当界面发生改变时不会影响到界面控制之外的其它功能。

6 结 语

目前,昆明有色冶金设计院股份公司信息中心已经参照文章内容为公司结构专业开发了一个SATWE构件计算程序并投入使用。Excel VBA虽然是一门较老的语言,但在合理利用其特性的基础上,也可以在结构专业构件数据、信息分析工作中发挥重要的作用。

[1]栾钰.浅谈SATWE进行结构设计时应注意的问题[J].山西建筑,2006,32(22):100-101.

[2]杨章伟,张婉婉.EXCEL VBA语法辞典[M].北京:机械工业出版社,2009.

猜你喜欢

窗体字符串单元格
合并单元格 公式巧录入
流水账分类统计巧实现
基于文本挖掘的语词典研究
玩转方格
玩转方格
试谈Access 2007数据库在林业档案管理中的应用
SQL server 2008中的常见的字符串处理函数
倍增法之后缀数组解决重复子串的问题
关于Access中切换面板的问题与解析
最简单的排序算法(续)