當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 建筑OA系統(tǒng) > 建筑工程項(xiàng)目管理軟件
Excel VBA在工程測(cè)量上的應(yīng)用
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
Excel是大家很熟悉的辦公,相信大家在工作中經(jīng)常使用吧。在測(cè)量工作中,你是否感覺(jué)到有很不方便的時(shí)候?比如,計(jì)算一個(gè)角度的三角函數(shù)值,而角度的單位是60進(jìn)制的,此時(shí),你一定感到很無(wú)奈,因?yàn)椋?span lang="EN-US">Excel本身無(wú)法直接計(jì)算60進(jìn)制的角度的三角函數(shù)!還有,如果你的工作表中有了點(diǎn)坐標(biāo)值(二維或者三維),要在中展繪出來(lái),怎樣才能又快又直接?不然,就只有拐彎摸角了,很痛苦啊!其實(shí),只要對(duì) Excel進(jìn)行一些挖掘,就可以發(fā)現(xiàn)Excel的功能我們還沒(méi)有好好的利用呢。Excel本身提供了強(qiáng)大的二次開(kāi)發(fā)功能,只要我們仔細(xì)的研究,沒(méi)有什么能難倒我們的。下面,好好筆者將帶你走近Excel,認(rèn)識(shí)它的強(qiáng)大的二次開(kāi)發(fā)環(huán)境VBAIDE,用它來(lái)解決上面所提到的問(wèn)題,就非常容易了。
初識(shí)VBAIDE,首先,你必須懂得一些簡(jiǎn)單的VB編程常識(shí)。如果不懂就只有通過(guò)其他的途徑去學(xué)習(xí)了。但用不著深入的研究,只要靜下心來(lái),幾個(gè)小時(shí)就可以了。
打開(kāi)Excel,按Alt+F11即進(jìn)入VBAIDE,學(xué)過(guò)VB的人一看就知道那就是熟悉的VB界面。下面看看如何定義一個(gè)函數(shù),然后利用它來(lái)解決60進(jìn)制的角度的三角函數(shù)計(jì)算問(wèn)題。在菜單上依次點(diǎn)擊[插入]->[模塊],然后輸入如下代碼
Public 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
這樣,就定義了一個(gè)名字叫DEG的函數(shù),它的作用就是轉(zhuǎn)換60進(jìn)制的角度為Excel認(rèn)識(shí)的弧度。編輯完后按Alt+Q即返回Excel,再在某一單元格輸入=sin(deg(A1))(A1既可以是單元格的值,也可以是輸入的角度值),回車(chē),哈哈,怎么樣?結(jié)果出來(lái)了吧?你可以用計(jì)算器檢驗(yàn)一下是否正確。如果出現(xiàn)#NAME?那就要設(shè)置一下安全設(shè)置。依次點(diǎn)[工具]->[宏]->[安全性],在安全級(jí)選項(xiàng)卡上選擇“中”或者“低”,然后關(guān)閉后重新打開(kāi)就可以了,以后只要是60進(jìn)制的角度,就用它轉(zhuǎn)換,非常方便哦。
工程測(cè)量中,經(jīng)常碰到導(dǎo)線的計(jì)算,如果手頭沒(méi)有平差計(jì)算程序就只有手工計(jì)算了,這時(shí)候你曾經(jīng)想過(guò)編個(gè)小程序來(lái)計(jì)算?其實(shí),這很簡(jiǎn)單,筆者在宛坪(上海至武威)高速公路上做測(cè)量,因?yàn)橛写罅康膶?dǎo)線需要復(fù)核,故編寫(xiě)了一個(gè)附合導(dǎo)線計(jì)算程序,代碼很簡(jiǎn)單,但很實(shí)用。下面是該程序的代碼:
Sub附合導(dǎo)線計(jì)算()
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
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(sht.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)
'坐標(biāo)增量
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))), "#####.####")
'坐標(biāo)增量和
xx = xx + sht.Cells(n, 6)
yy = yy + sht.Cells(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) = "相對(duì)精度 1/" & Format(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").Select
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
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
End Function
值得注意的是,前面提到的DEG函數(shù)別忘記加進(jìn)去。
如果自己定義一個(gè)名字叫“計(jì)算”的按鈕,指定此工具的宏為“單一附合導(dǎo)線計(jì)算”,那么,只要按下面的格式輸入原始數(shù)據(jù)(斜體是輸入的),點(diǎn)“計(jì)算”就可以得到計(jì)算結(jié)果了。所有的過(guò)程都是自動(dòng)的,無(wú)須再手工填寫(xiě),是不是很方便?
下面我們就來(lái)解決上面提到的與CAD的連接和通訊問(wèn)題。
進(jìn)入VBAIDE,按[工具]->[引用],找到可使用的引用,在“AutoCAD2000類(lèi)型庫(kù)”的左邊打鉤,點(diǎn)確定就行了。在模塊中輸入以下代碼:
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 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 Get_ACAD(Dwt As String) As Boolean
Dim YER As Integer
On Error Resume Next
Set acadApp = GetObject(, "AutoCAD.Application")
If Err Then
Err.Clear
Set acadApp = CreateObject("AutoCAD.Application")
If Err Then
MsgBox Err.Description
On Error GoTo 0
Get_ACAD = 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, PitchandFamily
acadDoc.ActiveTextStyle.SetFont "宋體", Bold, Italic, charSet, PitchandFamily
End Function
Sub 顯示對(duì)話框()
Form1.Show (0)
End Sub
Public Function Draw_Point(Point() As 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
再按以下模式做個(gè)對(duì)話框:窗體的名字就叫“Form1”
雙擊“展點(diǎn)”按鈕,輸入以下代碼:
Dim p0(2) As Double, p1(2) As Double, p2(2) As Double
Dim T1 As Double, T2 As Double, T3 As Double, T4 As Double
Public ne As Integer, sp As Single, cz As Single
Call Get_ACAD("")
Dim txt 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
With Sheet
p1(0) = .Cells(i + 1, 3).Value
p1(1) = .Cells(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 = TextBox5.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) - fontHight
Set txt = acadDoc.ModelSpace.AddText(Format(Cells(i + 1, 5), "00.0"), p, fontHight)
txt.Color = acMagenta
II:
i = i + 1
Loop
End Sub
當(dāng)然,你在Excel上同樣可以再加個(gè)工具按鈕,比如叫“展點(diǎn)”,指定宏為“顯示對(duì)話框”,只要你的Excel有了X,Y或者X,Y,Z(格式如下表),點(diǎn)擊“展點(diǎn)” 就可以自動(dòng)啟動(dòng)A utoCAD展點(diǎn)啦!當(dāng)然,如果A utoCAD已經(jīng)啟動(dòng),就直接在已經(jīng)打開(kāi)的A utoCAD文檔中展點(diǎn),展點(diǎn)完畢后,會(huì)顯示一個(gè)對(duì)話框,提示“展點(diǎn)完畢“,再切換到A utoCAD看看,你所要展的點(diǎn)是否已經(jīng)出現(xiàn)了?如果沒(méi)有輸入錯(cuò)誤,應(yīng)該可以得到滿意的結(jié)果。如果有點(diǎn)號(hào),還可以顯示點(diǎn)號(hào),并且可以輸入字體的高度。
下面是坐標(biāo)格式,其中第一列為點(diǎn)名,第二列為編碼(可以為空),第三列為X,第四列為Y,第五列為高程。注意,X,Y是A utoCAD的橫坐標(biāo)和縱坐標(biāo),與測(cè)量坐標(biāo)系不同。
Excel的功能是非常強(qiáng)大的,如果有興趣,你還可以在AutoCAD中直接與Excel通訊,比如一條三維多段線的所有結(jié)點(diǎn)的三維坐標(biāo)直接導(dǎo)入到Excel,比在AutoCAD中用列表的方法要方便的多,限于篇幅,無(wú)法在此詳細(xì)敘述了。如果讀者有興趣,可以深入的學(xué)習(xí)和探討。
- 12015年二級(jí)建造師《機(jī)電工程》場(chǎng)景試題18
- 2【1月21日成都】建材價(jià)格弱勢(shì)維穩(wěn)
- 32015年監(jiān)理工程師《理論與法規(guī)》每日一練(3.14)
- 4風(fēng)機(jī)盤(pán)管試壓如何套用子目
- 5水庫(kù)底孔事故閘門(mén)計(jì)算說(shuō)明書(shū)12p
- 62015年監(jiān)理工程師《理論與法規(guī)》每日一練(6.30)
- 72015年一建建設(shè)工程基本法律知識(shí):專利權(quán)
- 8中鐵五局集團(tuán)拉日鐵路靜動(dòng)態(tài)初步驗(yàn)收進(jìn)入SD2標(biāo)段
- 9工程項(xiàng)目管理信息系統(tǒng)的功能
- 102015年二級(jí)建造師《公路工程實(shí)務(wù)》每日一練(4.16)
- 112015二級(jí)建造師《施工管理》復(fù)習(xí)資料(18)
- 12中鐵五局“亞洲第一隧” 贛龍鐵路新考塘隧道施工進(jìn)展順利
- 132015一級(jí)建造師指導(dǎo):混凝土施工
- 14水電驗(yàn)收表格全套
- 15建設(shè)工程安全生產(chǎn)管理?xiàng)l例:施工單位安全責(zé)任
- 16某學(xué)院?jiǎn)误w宿舍施工組織設(shè)計(jì)方案66P
- 17外行爭(zhēng)相涉足櫥柜行業(yè)的三大原因分析
- 18造價(jià)工程師《技術(shù)與計(jì)量安裝》第五章通用工程安裝(9)
- 19聊城:建筑節(jié)能不達(dá)標(biāo)不予驗(yàn)收
- 20海門(mén)市今年實(shí)施18項(xiàng)交通重點(diǎn)工程,涉及航道、鐵路等
- 21[北京]大廈工程鋼筋施工方案
- 222015年監(jiān)理工程師《理論與法規(guī)》每日一練(2.7)
- 232015年一級(jí)建造師《法規(guī)及相關(guān)知識(shí)》:合同的種類(lèi)
- 2409年造價(jià)工程師建設(shè)工程技術(shù)與計(jì)量(土建)精華(54)
- 25照明按照明范圍大小可以分為哪幾類(lèi)?
- 26項(xiàng)目進(jìn)度的監(jiān)控——淺談TOC
- 272015年一建建設(shè)工程知識(shí)點(diǎn):技術(shù)方案不確定性分析內(nèi)容
- 28日式設(shè)計(jì)的理論
- 2909年監(jiān)理工程師《建設(shè)工程質(zhì)量控制》復(fù)習(xí)資料(7)
- 302015年一建管理知識(shí)點(diǎn):項(xiàng)目管理規(guī)劃的內(nèi)容
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓