天天干夜夜弄_黄毛片网站_2012中文版免费观看_久操视频在线_欧美日韩一区二区电影_日韩av片在线免费观看

  • Cehui8.com 測(cè)繪地理信息領(lǐng)域?qū)I(yè)門戶
  • 首頁(yè) > 測(cè)繪論文 > 其他

    Excel VBA在工程測(cè)量上的應(yīng)用

    2013-07-07 08:29:09 來(lái)源: 測(cè)繪論壇 作者:
    聊聊

      摘要:Excel是大家很熟悉的辦公軟件,相信大家在工作中經(jīng)常使用吧。在測(cè)量工作中,你是否感覺(jué)到有很不方便的時(shí)候?比如,計(jì)算一個(gè)角度的三角函數(shù)值,而角度的單位是60進(jìn)制的,此時(shí),你一定感到很無(wú)奈,因?yàn)椋珽xcel本身無(wú)法直接計(jì)算60進(jìn)制的角度的三角函數(shù)!還有,如果你的工作表中有了點(diǎn)坐標(biāo)值(二維或者三維),要在CAD中展繪出來(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)題,就非常容易了。 
    關(guān)鍵詞:Excel VBA 工程測(cè)量 

    Excel是大家很熟悉的辦公軟件,相信大家在工作中經(jīng)常使用吧。在測(cè)量工作中,你是否感覺(jué)到有很不方便的時(shí)候?比如,計(jì)算一個(gè)角度的三角函數(shù)值,而角度的單位是60進(jìn)制的,此時(shí),你一定感到很無(wú)奈,因?yàn)椋珽xcel本身無(wú)法直接計(jì)算60進(jìn)制的角度的三角函數(shù)!還有,如果你的工作表中有了點(diǎn)坐標(biāo)值(二維或者三維),要在CAD中展繪出來(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既可以是單元格的值,也可以是輸入的角度值),回車,哈哈,怎么樣?結(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è)量監(jiān)理,因?yàn)橛写罅康膶?dǎo)線需要復(fù)核,故編寫了一個(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ú)須再手工填寫,是不是很方便?
      下面我們就來(lái)解決上面提到的與CAD的連接和通訊問(wèn)題。
      進(jìn)入VBAIDE,按[工具]->[引用],找到可使用的引用,在“AutoCAD2000類型庫(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í)和探討。

      聲明①:文章部分內(nèi)容來(lái)源互聯(lián)網(wǎng),如有侵權(quán)請(qǐng)聯(lián)系刪除,郵箱 cehui8@qq.com

      聲明②:中測(cè)網(wǎng)登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其描述,文章內(nèi)容僅供參考。

      加群提示:我們創(chuàng)建了全國(guó)32個(gè)省份的地方測(cè)繪群,旨在打造本地測(cè)繪同行交流圈,有需要請(qǐng)聯(lián)系管理員測(cè)小量(微信 cexiaoliang)進(jìn)群,一人最多只能進(jìn)入一個(gè)省份群,中介人員勿擾

    主站蜘蛛池模板: 亚洲免费精品网站 | 午夜影院免费体验区 | 久久国产视频一区二区 | 成人 在线 | 亚洲精品蜜桃 | 亚洲精品日韩av | 午夜精品久久久久久久久久久久久蜜桃 | 国产一页 | 国产精品成人在线 | 成人国产精品视频 | 欧美亚洲国产一区 | 美女隐私视频黄www曰本 | 亚洲精品在线播放 | 婷婷激情综合 | 久久国语| 视频一区二区在线观看 | 久久精品国产99国产 | 久久999| 成人天堂噜噜噜 | 91视频免费播放 | 国产精品久久久久久久久免费软件 | 欧美日韩一区二区三区视频 | 久久aⅴ乱码一区二区三区 午夜在线播放 | 国产日韩欧美精品一区 | 91成人短视频在线观看 | 国产福利电影一区 | 欧美美女黄色网 | 国产精品久久久久久吹潮 | 蜜臀99久久精品久久久久久软件 | 日韩成人影院 | 亚洲一区二区三区日韩 | 日本精品久久久一区二区三区 | 午夜精品久久久久久久久久久久 | 四虎永久在线 | 亚洲呦呦 | 国产91久久精品一区二区 | 日韩欧美精品一区二区三区 | 日韩精品小视频 | 久久激情综合 | 久久久91精品国产一区二区 | 欧美日韩综合精品 |