网站首页  词典首页

请输入您要查询的论文:

 

标题 Visio 2010以及Excel VBA在设计中的使用案例
范文

    吴乙飞

    

    

    

    摘要:文章探讨了在Excel/Visio如何使用VBA宏从Excel自动拷贝大量表格到Visio中。随着Visio在设计工作的大量使用,实现自动化拷贝粘贴的方法可以使设计工作更加有效和有趣。

    关键词:Visio 2010; Excel VBA;表格;网络设计;自动化

    近年来,设计工作的画图常常使用Visio/Excel,它们都带有VBA。VBA是Visual Basic for Applications的缩写,是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化任务的编程语言。VBA使用方便,容易推广> 本文主要讨论如何在Visio/Excel中使用宏来简化设计工作中重复性的劳动。

    1 宏的基本概念

    宏是将Visio或Excel当中的操作通过录制或者编写程序,变成可重复执行的程序。比如,对于反复拷贝或粘贴或计算的工作,不需要每次都手工做同样的事情,只要运行已经做好的宏,就可达到效果,可以提高工作效率,实现操作自动化。

    2 实例分析

    2.1 实例的功能

    在网络设计制表中,会把在每个节点的Excel中的某个节点的线缆布放表(见表1),粘贴到Visio(见图1),网络设计中节点非常多,可能一个地市有60?150张线缆布放表,如果都是手工粘贴到Visio就非常繁琐。

    这样的工作简单重复性高,非常适合使用VBA宏来优化,提高工作效率。笔者对自动粘贴和手工粘贴做了对比,80个局点手工粘贴需要30 min,使用程序以后只需要80 s,效率为原来的30倍。

    2.2 Excel中的线缆布放表格式

    线缆布放表每列内容和信息如表2所示,每个线缆布放表共16列,其中第一列以序号作为开头,第15列为节点名称,作为后面命名名称的需要,Excel工作表的名称为线缆布放表汇总,示意用的地市线缆布放汇总表有59个局点信息,共有670行,依次排列,每个节点的线缆布放表以序号开始,以空行分隔结束,每行共有16列。

    一个节点的线缆布放如表2所示。程序以序号来测试是否是一个新的局点,并且定义一个新的表格名称来定义该节点的线缆布放表范围,名称就是在Visio中的图纸名称,为节点名称+数据局线缆布放表。

    2.3 Visio中的线缆布放表

    图1提供了已经完成的粘贴在Visio中的线缆布放表,每个节点一页Visio,每个Visio有一个表名,表名为节点名称+线缆布放表。目标文件如图1所示。

    因此,我们程序的目标就是把Excel中某节点的线缆布放表粘贴到Visio,然后调整好格式大小,并且自动生成表名。

    Excel名称的概念:名称是一个Excel中有意义的简略表示法,便于了解单元格引用、常量、公式或表的用途。可以创建和使用的名称类型有以下几种。

    (1)已定义名称。一个表示单元格、区域的单元格、公式或常量值的名称。您可以创建您自己的已定义的名称,Microsoft Office Excel有时创建已定义的名称,比如当设置打印区域时。

    (2)表名称。Excel表格的名称,Excel表格是存储在记录(行)和字段(列)中的有关特定主题的数据集合。

    几个常用的名称如表3所示。

    在程序中使用了表格名称(NAME)。线缆布放汇总表的表格中有多个节点的线缆布放表,每个线缆布放表开始的标识为A列的内容为序号,我们根据序号找到节点对应的表格名称范围,并且把它们加入到名称管理器中,以该节点名称加上线缆布放表作来命名,如下面语句所示:

    ActiveWorkbook.Names.Add Name:=location-name,RefersTo:=Range(Cells(l, 2), Cells(l,14)).CurrentRegion

    其中location_name为15列名称作为该表格的名称。

    部分线缆布放表的命名名称如表4所示,出于对设计信息的保密,不列出所有的节点名称。

    2.4 程序逻辑结构

    跟程序相关的文件共有3个(见表5)。

    程序分成两部分:第一部分为在Excel中的宏。宏的名称为线缆布放表命名,主要功能为在名称管理器中为每个节点定义名称,规定其范围,以便于Visio中的宏去找到各个节点的线缆布放表;第二部分为在Visio中的宏,有两个,一个宏为“线缆布放表粘贴”宏,主要功能为查找线缆布放表.xlsx中的名称管理器,将名称管理器中所有的名称所对应的表格找出来并且粘贴到Visio中,每个表格一個Visio页面;另外一个宏为adjusttable,主要为调整Visio中的所粘贴线缆布放表的大小,使得它在一个合适的范围内。

    整个程序逻辑如图2所示。

    2.5 Excel中的线缆布放表命名宏

    Excel中的宏的名称为线缆布放表命名。作用是在Excel的表格中给每一张线缆布放表命名。

    下面是线缆布放表命名源程序,程序中2?6行为变量申明。srcname为每张线缆布放表的标识符,我们用序号表示,如果是不一样的表格,可以更改标识符的内容。L为行数,在我们的表格中,最多不超过670行,可以根据大家的情况进行调整。LOCATION_NAME用于标识节点名称。Location_name_pos是指节点名称是在序号出现以后多少行,这里设置为3。即在找到表头行后加上2行的第15列为节点名称,J为名称序号,每一个节点有一个表格名称对应。

    程序12?21句为一个循环语句,它寻找“序号”,如果找到,表明一个新的线缆布放表的开始,第14句为计算所在表格的行数,第15句使用了Range(Cells(l,1),Cells(l, 15)).CurrentRegion找出该局点线缆布放表表格范围,location_name为节点名称,16句根据该节点线缆布放表的范围定义表格名称。

    Sub線缆布放表命名。

    Dim srcname As String ‘用于区分不同地区的标识

    “序号”

    Dim 1 As IntegerDim location-name As StringDim location-name-pos As IntegerDim j As Integer

    j = l

    Sheets(“线缆布放表汇总” ).Selectsrcname 二“序号”location-name-pos = 2table_col-num =15For 1 = 1 To 670

    IfCells(l,l).Value= “序号” Thentable row num = Range(Cells(l,1), Cells(l,16)).CurrentRegion. Rows .Count

    location-name = Cells(l + location-name-pos , 15).Value & “数^局线缆布放表”

    ActiveWorkbook.Names.Add Name:=location-name,RefersTo:=

    Range(Cells(l, 1), Cells(l, 15)).CurrentRegion1 = 1 + table_row-num -1

    Sheets(“系缆^名称汇总”).Cells(j,l).Value =location-name

    j = j + 1

    End If

    Next 1

    End Sub

    2.6 Visio中的宏

    程序使用了Visio 2010,不同的Visio版本可以支持的程序略有不同。在这个Vision中有两个程序。

    第一个程序:线缆布放表粘贴到Visio的程序,主要是每个节点增加一个新的Visio页面,设置好页面背景,读取Excel文件,根据Excel中的名称管理器中的名称,读取相关的线缆布放表范围、内容,并且复制表格以图元图片的形式粘贴到Visio页面中,然后在每页右下角产生线缆布放表的图纸名称,并且调整字体。

    下面为线缆布放表粘贴到Visio的程序,程序1?15为变量声明。其中poslx,posly为x,y坐标,该位置用于设置节点页面名称,17?20语句是主要打开同个目录下面的线缆布放表.xlsx文件,16?45语句为一个循环语句,语句根据线缆布放表.xlsx名称,27?29是根据名称增加一个Visio页面,页面名称设置为XX节点线缆布放表。30?40语句是增加一个文本框,加入XX节点线缆布放表名称,并且设置文本的字符、位置、文本框线型等。语句40?42为线缆布放表相应节点表格拷贝粘贴的功能。45语句把所生成的Visio保存为线缆布放表.vsd文件。

    Sub线缆布放表粘贴到Visio的程序。

    Dim xlApp As Object

    Dim xlname As Name

    Dim filepath As String

    Dim vsoapplication As Visio.Application

    Dim pagename As String

    Dim vsoDocument As Visio.Document

    Dim vsopages As Visio.Pages

    Dim vsoShapel As Visio.Shape

    Dim i As Integer

    Dim location-num As Integer

    Dim poslx As Double

    Dim posly As Double

    Set vsoapplication = Visio.Application

    i = 1

    poslx = 30posly = 2

    filepath = ActiveDocument.Path

    strExcelfile = filepath & “线缆布方文表汇总.xlsx”

    ‘prepare for the Excel sheet read and write

    Set xlApp = GetObject(,“Excel.application”)

    Set xlApp = GetObject(strExcelfile)

    xlApp. Application-Visible = True

    xlApp.Parent.Windows ⑴.Visible = True

    location-num = xlApp.Names.Count

    Set vsopages = ActiveDocument.Pages

    For i = 1 To location num ' LOOP for NAME

    Set xlname = xlApp.Names.Item(i)

    Set vsopage = vsopages.Addvsopage.Name = xlApp.Names.Item(i).Name

    Set vsoShapel = ActivePage.DrawRectangle(poslx,posly, poslx + 5.2, posly + 0.43)

    vsoShapel .Text = vsopage .Name

    vsopage.BackPage = “A4 模板”

    vsoShapel.Cells(“PinX”).Result(69)= poslx

    vsoShapel .Cells(“PinY”).Result(69)= posly

    vsoShapel.Cells(“width”).Result(69)= 4

    vsoShapel.Cells(“height”).Result(69)= 0.43

    vsoShapel.Cells(“linecolor”)= visWhite

    vsoShapel.Characters.CharProps(visCharacterFont)=216#

    vsoShapel .Characters.CharProps(visCharacterSize)=

    11#

    vsoShapel.Characters.CharProps(visCharacterAsianFont)= 216#

    xlnamc.RcfcrsIbRangc.Copy

    vsoapplication. ActiveWindow.Page.Paste SpecialvisPasteEMF, False, False

    ActiveDocument.DiagramServicesEnabled =DiagramServices

    Next i

    ActiveDocument.SaveAs(filepath & “线缆布放表.vsd”)

    End Sub

    第二个程序:adjusttable()自动调整每张Visio中图片的大小,使得图片居中,不过长,不过宽,程序如下面程序,

    1?17为变量声明。其中cx为衡量实际粘贴线缆布放表的宽度是指定不能超过的宽度(table_width)的倍数,如果cx>l,则说明实际的粘贴后的宽度过全,cy为衡量实际粘贴线缆布放表的高度是指定不能超过的高度(table_height)的倍数,如果cy>l则说明实际粘贴后的线缆布放表i于高,需要调整。table_centerx,table_centery为线缆布放表的中心位置。该位置用于设置线缆i放表的中心位置,18?38为一个循环语句,语句打开所有粘贴了线缆布放表的页面,设置粘贴位置,调整大小。调整大小的主要参数为size, size是选择cx或者cy超过1中比较大的一个值进行设置。22?31语句为设置size值。32?36调整线缆布放表中心点以及大小。

    Sub adjusttable()

    Dim vsoapplication As Visio.Application

    Dim vsopages As Visio.Pages

    Dim vsoShapel As Visio.Shape

    Dim i As Integer

    Dim cx As Double

    Dim cy As Double

    Dim size As Double

    Dim table_width As Double

    Dim table_height As Double

    Dim table_centerx As Double

    Dim table_centery As Double

    table_width = 253

    table_height =130

    table_centerx = 147

    table_centery = 117

    Set vsoapplication = Visio.Application

    i = 1

    Set vsopages = ActiveDocument.Pages

    For i = 1 To vsopages.Count

    Set vsopage = vsopages.Item(i)

    If InStr(vsopage.Name, “A4模板”)=0 Then

    Set vsoShapel = vsopage. Shapes.Item(2)

    cx = vsoShapel.Cells(“width”).Result(70)/ table_width

    cy = vsoShapel.Cells(“height”).Result(70)/ page_height

    If cx >= cy And cx > 1 Then

    size = cx

    Elself cy >= cx And cy > 1 Then

    size = cy

    Else

    size = 1

    End If

    vsoShapel.Cells(“pinx”).Result(70)= table_centerx

    vsoShapel .Cells(“piny”).Result(70)= table_centery

    vsoShapel.Cells(“width”).Result(70)= vsoShapel.Cells(“width”).Result(70)/ size

    vsoShapel.Cells(“height” ).Result(70)= vsoShapel.Cells(“height”).Result(70)/ size

    End If

    Next i

    End Sub

    3 結语

    随着通信设计行业的竞争日益激烈,提高工作效率和正确率是一个发展趋势,对设计工作进行自动化处理可以实现这个目标。对Excel/Visio/CAD/word的编程可以使用在很多地方,希望能在设计行业中更多地引入自动化应用。

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/22 16:23:52