ExcelVBA在工程测量上的应用
发布日期:2023-05-08 05:38
Excel是大家很熟知的办公软件,坚信大家在工作中常常用于吧。在测量工作中,你否感觉到有很不方便的时候?比如,计算出来一个角度的三角函数值,而角度的单位是60十进制的,此时,你一定深感很不得已,因为,Excel本身无法必要计算出来60十进制的角度的三角函数!还有,如果你的工作表中有了点坐标值(二维或者三维),要在CAD中展绘出来,怎样才能又慢又必要?不然,就只有拐弯碰角了,很伤痛啊!只不过,只要对Excel展开一些挖出,就可以找到Excel的功能我们还没只想的利用呢。
Excel本身获取了强劲的二次开发功能,只要我们细心的研究,没什么能难倒我们的。下面,只想笔者将带上你走进Excel,了解它的强劲的二次开发环境VBAIDE,用它来解决问题上面所提及的问题,就非常容易了。
初识VBAIDE,首先,你必需懂一些非常简单的VB编程常识。如果不懂就只有通过其他的途径去自学了。但用不着了解的研究,只要静下心来,几个小时就可以了。 关上Excel,按Alt+F11即转入VBAIDE,习过VB的人一看就告诉那就是熟知的VB界面。
下面想到如何定义一个函数,然后利用它来解决问题60十进制的角度的三角函数计算出来问题。在菜单上依序页面[放入]-[模块],然后输出如下代码PublicConstpi=3.14159265359PublicFunctionDEG(nAsDouble)DimAAsDouble,BAsDouble,CAsDouble,DAsDouble,EAsDouble,FAsDouble,GAsDouble,KAAsDoubleD=Abs(n)+0.000000000000001F=Sgn(n)A=Int(D)B=Int((D-A)*100)C=D-A-B/100DEG=F*(A+B/60+C/0.36)*pi/180EndFunction 这样,就定义了一个名字叫DEG的函数,它的起到就是切换60十进制的角度为Excel了解的弧度。
编辑完了后按Alt+Q即回到Excel,再行在某一单元格输出=sin(deg(A1))(A1既可以是单元格的值,也可以是输出的角度值),开路,哈哈,怎么样?结果出来了吧?你可以用计算器检验一下否准确。如果经常出现#NAME?那就要设置一下安全性设置。依序点[工具]-[宏]-[安全性],在安全性级选项卡上自由选择中或者较低,然后重开后新的关上就可以了,以后只要是60十进制的角度,就用它切换,十分便利哦。
工程测量中,常常遇到导线的计算出来,如果手头没平差计算出来程序就只有手工计算出来了,这时候你曾多次想要过编成个小程序来计算出来?只不过,这很非常简单,笔者在宛坪(上海至武威)高速公路上做到测量监理,因为有大量的导线必须审核,故撰写了一个附合导线计算出来程序,代码很非常简单,但很简单。下面是该程序的代码:Sub附合导线计算出来()DimmAsInteger,nAsInteger,msAsDouble,ggAsDouble,shtAsObject,xxAsDouble,yyAsDouble,SAsDoubleSetsht=ThisWorkbook.ActiveSheetDoWhilesht.Cells(m+3,4)m=m+1LoopForn=3Tom+2ms=DEG(ms)+DEG(sht.Cells(n,4))ms=RAD(ms)S=S+sht.Cells(n,3)Nextms=DEG(ms)gg=RAD(DEG(sht.Cells(3,5))+ms-DEG(sht.Cells(3+m,5))-pi*m)xx=0:yy=0Forn=4Tom+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(n,7)Nextxx=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(S/Sqr(xx*xx+yy*yy),######)Forn=4Tom+2sht.Cells(n,8)=Format(xx/S*sht.Cells(n-1,3),###.####)sht.Cells(n,9)=Format(yy/S*sht.Cells(n-1,3),###.####)NextForn=4Tom+1sht.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)NextColumns(F:K).SelectSelection.NumberFormatLocal=0.000_EndSubPublicFunctionRAD(NuAsDouble)AsDoubleDimAAsDouble,BAsDouble,CAsDouble,DAsDouble,EAsDouble,FAsDouble,GAsDouble,pAsDoubleD=Abs(Nu)F=Sgn(Nu)p=180#/piG=p*60#A=Int(D*p)B=Int((D-A/p)*G)W=BC=(D-A/p-B/G)*20.62648062RAD=(C+A+B/100)*FEndFunction 值得注意的是,前面提及的DEG函数别忘记加进去。
如果自己定义一个名字叫计算出来的按钮,登录此工具的宏为单一附合导线计算出来,那么,只要按下面的格式输出原始数据(斜体是输出的),点计算出来就可以获得计算结果了。所有的过程都是自动的,无须再手工填上,是不是很便利? 下面我们就来解决问题上面提及的与CAD的相连和通讯问题。 转入VBAIDE,按[工具]-[提到],寻找可用于的提到,在AutoCAD2000类型库的左边打钩,点确认就行了。在模块中输出以下代码:GlobalSheetAsObject,acadmtextAsacadmtext,fontHightAsDoubleGlobalxlBookAsExcel.WorkbookGlobalp0(2)AsDouble,p1(2)AsDouble,p2(2)AsDoubleGlobalacadAppAsAcadApplicationGlobalacadDocAsAcadDocumentGlobalacadPointAsacadPointGlobalnumberAsIntegerPublicTypeptnAsIntegerpt(2)AsDoubleGlobalpt()AsptGlobaltext1AsAcadTextGlobalCADAsObjectGlobalp(2)AsDouble,iAsInteger,jAsIntegerGlobalhAsInteger,lAsIntegerPublicFunctionGet_ACAD(DwtAsString)AsBooleanDimYERAsIntegerOnErrorResumeNextSetacadApp=GetObject(,AutoCAD.Application)IfErrThenErr.ClearSetacadApp=CreateObject(AutoCAD.Application)IfErrThenMsgBoxErr.DescriptionOnErrorGoTo0Get_ACAD=FalseExitFunctionEndIfEndIfOnErrorGoTo0SetacadDoc=acadApp.ActiveDocumentacadApp.Visible=TrueGet_ACAD=TrueDimtypeFaceAsStringDimBoldAsBooleanDimItalicAsBooleanDimcharSetAsLongDimPitchandFamilyAsLongacadDoc.ActiveTextStyle.GetFonttypeFace,Bold,Italic,charSet,PitchandFamilyacadDoc.ActiveTextStyle.SetFont宋体,Bold,Italic,charSet,PitchandFamilyEndFunctionSub表明对话框()Form1.Show(0)EndSubPublicFunctionDraw_Point(Point()AsDouble)AsacadPointSetDraw_Point=acadDoc.ModelSpace.AddPoint(Point)Draw_Point.UpdateEndFunctionPublicSubSet_layer(sAsString)DimlayerObjAsAcadLayerSetlayerObj=acadDoc.Layers.Add(s)acadDoc.ActiveLayer=layerObjEndSub再行按以下模式做到个对话框:窗体的名字就叫Form1双击展点按钮,输出以下代码:Dimp0(2)AsDouble,p1(2)AsDouble,p2(2)AsDoubleDimT1AsDouble,T2AsDouble,T3AsDouble,T4AsDoublePublicneAsInteger,spAsSingle,czAsSingleCallGet_ACAD()DimtxtAsAcadTextDimlaAsAcadLayerForEachLayerInacadDoc.ModelSpaceNextCallSet_layer(zdh)SetSheet=ThisWorkbook.ActiveSheetDimiAsIntegerDoWhileSheet.Cells(i+1,3)OrSheet.Cells(i+1,1)IfSheet.Cells(i+1,3)=OrSheet.Cells(i+1,4)=ThenGoToIIWithSheetp1(0)=.Cells(i+1,3).Valuep1(1)=.Cells(i+1,4).Valuep1(2)=.Cells(i+1,5).ValueEndWithp(0)=p1(0)p(1)=p1(1)CallSet_layer(ZDH)CallDraw_Point(p1)fontHight=TextBox5.ValueIfCells(i+1,2)=ThenGoToooSettxt=acadDoc.ModelSpace.AddText(Cells(i+1,2),p,fontHight)txt.Color=acMagentaoo:IfCells(i+1,5)=ThenGoToIISet_layer(GCD)p(1)=p1(1)-fontHightSettxt=acadDoc.ModelSpace.AddText(Format(Cells(i+1,5),00.0),p,fontHight)txt.Color=acMagentaII:i=i+1LoopEndSub 当然,你在Excel上某种程度可以加上个工具按钮,比如叫展点,登录宏为表明对话框,只要你的Excel有了X,Y或者X,Y,Z(格式如下表格),页面展点就可以自动启动AutoCAD展点啦!当然,如果AutoCAD早已启动,就必要在早已关上的AutoCAD文档中展点,展点完后,不会表明一个对话框,提醒展点完,再行转换到AutoCAD想到,你所要展的点否早已经常出现了?如果没输出错误,应当可以获得失望的结果。
如果有点号,还可以表明点号,并且可以输出字体的高度。 下面是座标格式,其中第一列入严厉批评,第二列入编码(可以为空),第三列入X,第四列入Y,第五列入高程。留意,X,Y是AutoCAD的横坐标和纵坐标,与测量坐标系有所不同。 Excel的功能是十分强劲的,如果有兴趣,你还可以在AutoCAD中必要与Excel通讯,比如一条三维多段线的所有结点的三维座标必要导入到Excel,比在AutoCAD中用列表的方法要便利的多,仅限于篇幅,无法在此详尽描述了。
如果读者有兴趣,可以了解的自学和探究。.。
本文关键词:ExcelVBA,在,工程测量,上,的,开云平台,应用,Excel,是,大家
本文来源:开云平台-www.findandcraft.com
Copyright © 2007-2023 www.findandcraft.com. 开云平台科技 版权所有 网站备案号:ICP备92062154号-7