《Excel在测量上的应用.pdf》由会员分享,可在线阅读,更多相关《Excel在测量上的应用.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 Excel VBA 在工程测量上的应用作者:湖北省水文地质工程地质勘察院别业仁武汉市公路工程咨询监理公司刘志刚熊泽红关键字:Excel,测量,CAD Excel是大家很熟悉的办公软件,相信大家在工作中经常使用吧,它功能强大且简单易学。在测量工作中是用的比较多的,遗憾的是,它计算三角函数采用的是弧度或者是十进制的角度,而我们测量上的角度却是60 进制的,要命的是 Excel 也没有弧度与 60 进制的角度的转换函数。这时的你也许会感到很无奈吧?还有,如果你的工作表中有了点坐标值(二维或者三维),要在 CAD 中展绘出来,怎样才能直接调用CAD 将它展绘出来?不然,就只有拐弯摸角借助第三方软件
2、来实现了,很痛苦啊!其实,只要对Excel 进行一些挖掘,就可以发现Excel的功能我们还没有好好的利用呢。Excel本身提供了强大的二次开发功能,只要我们仔细的研究,上面所提到的问题是可以很容易解决的。首先,你必须懂得一些简单的VB 编程常识。如果不懂就只有通过其他的途径去学习了。但用不着深入的研究,只要静下心来,几个小时就可以了。打开 Excel,按 Alt+F11 即进入 VBAIDE,学过 VB 的人一看就知道 VBAIDE 界面和 VB 界面是非常相似的。下面看看如何定义一个函数,然后利用它来解决60 进制的角度的三角函数计算问题。在菜单上依次点击 插入-模块,然后输入如下代码Pub
3、lic Const pi=3.14159265359 Public Function DEG(n As Double)Dim A As Double,B As Double,C As Double,D As Double,E As Double,F As Double,G As Double,KA As Double D=Abs(n)+0.000000000000001 F=Sgn(n)A=Int(D)B=Int(D-A)*100)C=D-A-B/100 DEG=F*(A+B/60+C/0.36)*pi/180 End Function 这样,就定义了一个名字叫DEG 的函数,它的作用就是转换
4、60 进制的角度为 Excel认识的弧度。编辑完后按 Alt+Q 即返回 Excel,再在某一单元格输入=sin(deg(A1)(A1既可以是单元格的值,也可以是手工输入的角度值),回车,哈哈,怎么样?结果出来了吧?你可以用计算器检验一下是否正确。如果出现#NAME?那就要设置一下安全设置。依次点工具-宏-安全性,在安全级选项卡上选择“中”或者“低”,然后关闭后重新打开就可以了,以后只要是60 进制的角度,就用它转换,非常方便哦。工程测量中,经常碰到导线的计算,如果手头没有平差计算程序就只有手工计算了,这时候你曾经想过编个小程序来计算?其实,这很简单,下面是该程序的代码:Sub附合导线计算()
5、Dim m As Integer,n As Integer,ms As Double,gg As Double,sht As Object,xx As Double,yy As Double,S As Double Set sht=ThisWorkbook.ActiveSheet 2 Do While sht.Cells(m+3,4)m=m+1 Loop For n=3 To m+2 ms=DEG(ms)+DEG(sht.Cells(n,4)ms=RAD(ms)S=S+sht.Cells(n,3)Next ms=DEG(ms)gg=RAD(DEG(sht.Cells(3,5)+ms-DEG(s
6、ht.Cells(3+m,5)-pi*m)xx=0:yy=0 For n=4 To m+2 方位角sht.Cells(n,5)=RAD(DEG(sht.Cells(n-1,5)+DEG(sht.Cells(n-1,4)-pi-DEG(gg)/m)坐标增量sht.Cells(n,6)=Format(sht.Cells(n-1,3)*Cos(DEG(sht.Cells(n,5),#.#)sht.Cells(n,7)=Format(sht.Cells(n-1,3)*Sin(DEG(sht.Cells(n,5),#.#)坐标增量和xx=xx+sht.Cells(n,6)yy=yy+sht.Cells(
7、n,7)Next xx=xx+sht.Cells(3,10)-sht.Cells(m+2,10)yy=yy+sht.Cells(3,11)-sht.Cells(m+2,11)sht.Cells(m+4,5)=&Format(gg,#.#)sht.Cells(m+4,6)=X=&Format(xx,#.#)sht.Cells(m+4,7)=Y=&Format(yy,#.#)sht.Cells(m+4,3)=S=&Format(S,#.#)sht.Cells(m+4,9)=S=&Format(Sqr(xx*xx+yy*yy),#.#)sht.Cells(m+4,10)=相对精度1/&Format(
8、S/Sqr(xx*xx+yy*yy),#)For n=4 To m+2 sht.Cells(n,8)=Format(xx/S*sht.Cells(n-1,3),#.#)sht.Cells(n,9)=Format(yy/S*sht.Cells(n-1,3),#.#)Next For n=4 To m+1 sht.Cells(n,10)=sht.Cells(n-1,10)+sht.Cells(n,6)-sht.Cells(n,8)sht.Cells(n,11)=sht.Cells(n-1,11)+sht.Cells(n,7)-sht.Cells(n,9)Next Columns(F:K).Sele
9、ct Selection.NumberFormatLocal=0.000_ End Sub Public Function RAD(Nu As Double)As Double Dim A As Double,B As Double,C As Double,D As Double,E As Double,F As Double,G As Double,p As Double 3 D=Abs(Nu)F=Sgn(Nu)p=180#/pi G=p*60#A=Int(D*p)B=Int(D-A/p)*G)W=B C=(D-A/p-B/G)*20.62648062 RAD=(C+A+B/100)*F E
10、nd Function 值得注意的是,前面提到的DEG()函数别忘记加进去。如果自己定义一个名字叫“计算”的按钮,指定此工具的宏为“单一附合导线计算”,那么,只要按下面的格式输入原始数据(斜体是输入的),点“计算”就可以得到计算结果了。所有的过程都是自动的,无须再手工填写,是不是很方便?下面我们就来解决上面提到的与CAD 的连接和通讯问题。进入 VBAIDE,按 工具-引用,找到可使用的引用,在“AutoCAD2000 类型库”的左边打钩,点确定就行了。在模块中输入以下代码,主要是一些需要用到的变量定义:Dim p0(2)As Double,p1(2)As Double,p2(2)As Dou
11、ble Dim T1 As Double,T2 As Double,T3 As Double,T4 As Double Public ne As Integer,sp As Single,cz As Single 4 Global Sheet As Object,acadmtext As acadmtext,fontHight As Double Global xlBook As Excel.Workbook Global p0(2)As Double,p1(2)As Double,p2(2)As Double Global acadApp As AcadApplication Global
12、acadDoc As AcadDocument Global acadPoint As acadPoint Global number As Integer Public Type pt n As Integer pt(2)As Double Global pt()As pt Global text1 As AcadText Global CAD As Object Global p(2)As Double,i As Integer,j As Integer Global h As Integer,l As Integer Public Function Draw_Point(Point()A
13、s Double)As acadPoint Set Draw_Point=acadDoc.ModelSpace.AddPoint(Point)Draw_Point.Update End Function Public Sub Set_layer(s As String)Dim layerObj As AcadLayer Set layerObj=acadDoc.Layers.Add(s)acadDoc.ActiveLayer=layerObj End Sub 再按以下模式做个对话框:窗体的名字就叫“Form1”文本框的名称改为TextBox,CAPTIONS 属性改为”展点”按钮的名称改为ZD
14、,text 属性改为 3.下面是如何调用CAD 的函数,也是一个很重要的函数。Public Function Get_ACAD(Dwt As String)As Boolean Dim YER As Integer On Error Resume Next Set acadApp=GetObject(,AutoCAD.Application)5 If Err Then Err.Clear Set acadApp=CreateObject(AutoCAD.Application)If Err Then MsgBox Err.Description On Error GoTo 0 Get_ACAD
15、=False Exit Function End If End If On Error GoTo 0 Set acadDoc=acadApp.ActiveDocument acadApp.Visible=True Get_ACAD=True Dim typeFace As String Dim Bold As Boolean Dim Italic As Boolean Dim charSet As Long Dim PitchandFamily As Long acadDoc.ActiveTextStyle.GetFont typeFace,Bold,Italic,charSet,Pitcha
16、ndFamily acadDoc.ActiveTextStyle.SetFont 宋体,Bold,Italic,charSet,PitchandFamily End Function 下面是如何在 CAD 中设置图层的函数。Public Sub Set_layer(s As String)Dim layerObj As AcadLayer Set layerObj=acadDoc.Layers.Add(s)acadDoc.ActiveLayer=layerObj End Sub 双击“展点”按钮,输入以下代码:Private Sub ZD_Click()Call Get_ACAD()Dim t
17、xt As AcadText Dim la As AcadLayer For Each Layer In acadDoc.ModelSpace Next Call Set_layer(zdh)Set Sheet=ThisWorkbook.ActiveSheet Dim i As Integer Do While Sheet.Cells(i+1,3)Or Sheet.Cells(i+1,1)If Sheet.Cells(i+1,3)=Or Sheet.Cells(i+1,4)=Then GoTo II 6 With Sheet p1(0)=.Cells(i+1,3).Value p1(1)=.C
18、ells(i+1,4).Value p1(2)=.Cells(i+1,5).Value End With p(0)=p1(0)p(1)=p1(1)Call Set_layer(ZDH)Call Draw_Point(p1)fontHight=TextBox.Value If Cells(i+1,2)=Then GoTo oo Set txt=acadDoc.ModelSpace.AddText(Cells(i+1,2),p,fontHight)txt.Color=acMagenta oo:If Cells(i+1,5)=Then GoTo II Set_layer(GCD)p(1)=p1(1)
19、-fontHight Set txt=acadDoc.ModelSpace.AddText(Format(Cells(i+1,5),00.0),p,fontHight)txt.Color=acMagenta II:i=i+1 Loop MsgBox(展点完毕)End Sub 当然,你在 Excel 上同样可以再加个工具按钮,比如叫“展点”,指定宏为“显示对话框”,只要你的 Excel有了 X,Y 或者 X,Y,Z(格式如下表),点击“展点”就可以自动启动 A utoCAD 展点啦!当然,如果 A utoCAD 已经启动,就直接在已经打开的A utoCAD 文档中展点,展点完毕后,会显示一个对话
20、框,提示“展点完毕“,再切换到 A utoCAD 看看,你所要展的点是否已经出现了?如果没有输入错误,应该可以得到满意的结果。如果有点号,还可以显示点号,并且可以输入字体的高度。下面是坐标格式,其中第一列为点名,第二列为编码(可以为空),第三列为 X,第四列为 Y,第五列为高程。注意,X,Y 是 A utoCAD 的横坐标和纵坐标,与测量坐标系不同。7 Excel的功能是非常强大的,如果有兴趣,你还可以在A utoCAD 中直接与 Excel通讯,比如一条三维多段线的所有结点的三维坐标直接导入到Excel,比在 A utoCAD 中用列表的方法要方便的多,将上述代码稍加修改,把他移植到CADIDE 中去,就可以直接在CAD 中调用活动的 Excel文档数据进行展点。限于篇幅,无法在此详细叙述了。