天天干夜夜弄_黄毛片网站_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è)省份群,中介人員勿擾

    主站蜘蛛池模板: 欧美秋霞 | 国产日韩欧美一区 | 亚洲视频三区 | 日韩精品在线观看视频 | 精品久久一区二区三区 | 中文字幕综合在线 | 色接久久| 91精品国产综合久久久蜜臀图片 | 久久国产综合 | 日本在线观看视频一区 | 国产精品成人在线观看 | 国产一区二区三区免费 | 久热最新 | 国产伦精品一区二区三区四区视频 | 久久精品久久久 | 久久久激情视频 | 国产成人精品二区 | 日本在线一区二区 | 午夜精品久久久久久久久 | 不卡一区二区三区四区 | 一区二区三区四区国产 | 国产综合久久久 | 成人在线激情 | 久久国产视频一区二区 | 午夜精品久久久久久久久久久久 | 狠狠狠干| 免费超碰 | 日韩精品一区二区在线观看 | www.99热.com | 午夜在线视频 | 久久成人精品视频 | 国产精品成人国产乱一区 | 日韩欧美综合在线 | 国产成人精品午夜在线播放 | 亚洲精品在线播放视频 | 韩国三级中文字幕hd久久精品 | 夜本色| 男女啪网站 | 中文视频在线 | 欧美一区 | 国产精品一区二区三区四区 |