VBA水准平差

10 篇文章 0 订阅

Public Enum Workenum
    RgCola = 1
    rgcolb = 2
    rgcolc = 3
    RgCold = 4
    RgCole = 5
    RgColf = 6
    RgColg = 7
    RgColh = 8
    RgColi = 9
    RgColj = 10
    RgColk = 11
    RgColl = 12
    RgColo = 15
    Rgcolp = 16
End Enum
Const WorkNameYs As String = "原测数据"
Const WorkNameCg As String = "过程数据"
Const WorkNameGc As String = "线路高差"
Const WorkNameSj As String = "平差数据"
Const sttp As String = "TP"
Private Function WorkFunction(s As Double, b As Boolean) As Double '获取后视、前视视距函数
Dim Fx As WorksheetFunction
Dim y As Long, x As Long, z As Double, w As Variant
Set Fx = WorksheetFunction
If b Then
    y = 100
    x = 10
    z = 0.1
Else
   ' w5 = InStr(s, ".")
    'w6 = Len(s)
    y = 1000000
    x = 100000
    z = 0.00001
End If

Select Case Right(s, 1) * 1                   'Select Case Right(Int(s * y), 1) * 1
    Case 5                                            '小数最后一位是5
        If Left(Right(s, 2), 1) <> "." Then
            If Left(Right(s, 2), 1) * 1 Mod 2 = 0 Then   '如果5前一位是偶数
                WorkFunction = Fx.Floor(s, z)             '向下舍入
            Else
                WorkFunction = Fx.Ceiling(s, z)           '反之向上舍入
            End If
        Else
            WorkFunction = Fx.Floor(s, z)
        End If
    Case Is > 5
        WorkFunction = Fx.Ceiling(s, z)
    Case Is < 5
        WorkFunction = Fx.Floor(s, z)
End Select
Set Fx = Nothing
End Function

Public Sub Workarray()
Dim brr As Variant
Dim arr(), crr(RgCola To rgcolc, RgCola To RgColg)
Dim i%, t As Double, c As Double, u As Double, j%, n%, l%, h As Double, w As Double, o%, s%
brr = Sheets(WorkNameYs).UsedRange
ReDim arr(RgCola To UBound(brr) * rgcolc, RgCola To RgColh)
i = RgCola
n = RgCola
Do While i <= UBound(brr)
If brr(i, RgCola) <> "" Then
    crr(RgCola, RgCola) = brr(i, RgCola)              '点号
    crr(rgcolb, RgCola) = brr(i, RgColj)
    
    
    t = brr(i, rgcolb)
    crr(RgCola, rgcolb) = WorkFunction(t, True)             '后视距
    t = brr(i, RgColk)
    crr(rgcolb, rgcolb) = WorkFunction(t, True)             '前视距

'-----------------------------------------------------------------------------------------------------------
    crr(rgcolb, rgcolc) = crr(RgCola, rgcolb) - crr(rgcolb, rgcolb)        '视距差
       If Abs(crr(rgcolb, rgcolc)) > 1.5 Then
        GetStadiaDifference crr
        
    End If

    crr(rgcolc, rgcolc) = Round(c + crr(rgcolb, rgcolc), RgCola)      '累积视距差
    c = crr(rgcolc, rgcolc)
    If Abs(c) > 5 Then
        GetChange crr, c
        c = crr(3, 3) + crr(2, 3)
        crr(3, 3) = c
    End If
    
  
    
    crr(RgCola, RgCold) = brr(i, rgcolc)
    crr(RgCola, RgCole) = brr(i, RgColg)
    
    crr(rgcolb, RgCold) = brr(i, RgColl)
    crr(rgcolb, RgCole) = brr(i, Rgcolp)
    
    crr(rgcolc, RgCold) = Round(crr(RgCola, RgCold) - crr(rgcolb, RgCold), RgCole)
    crr(rgcolc, RgCole) = Round(crr(RgCola, RgCole) - crr(rgcolb, RgCole), RgCole)
    
    crr(RgCola, RgColf) = Round((crr(RgCola, RgCold) - crr(RgCola, RgCole)) * 100000, 0)
    crr(rgcolb, RgColf) = Round((crr(rgcolb, RgCold) - crr(rgcolb, RgCole)) * 100000, 0)
    crr(rgcolc, RgColf) = Round((crr(rgcolc, RgCold) - crr(rgcolc, RgCole)) * 100000, 0)
    
    u = (crr(rgcolc, RgCold) + crr(rgcolc, RgCole)) / rgcolb
    
    crr(rgcolc, RgColg) = WorkFunction(Abs(u), False)
    
    If u < 0 Then crr(rgcolc, RgColg) = crr(rgcolc, RgColg) * -1
        
   
    For j = RgCola To rgcolc
        For l = RgCola To RgColg
            arr(n, l) = crr(j, l)
        Next
        n = n + 1
    Next
End If
    i = i + 1
Loop

'调用检验视距差过程

'********************

If n > UBound(arr) Then o = UBound(arr) Else o = n
With Sheets(WorkNameCg)
   .UsedRange.Offset(5).ClearContents
   .Range("B:C").NumberFormatLocal = "0.0"
   .Range("a6").Resize(o, UBound(arr, 2)) = arr
   With .Range("g" & o + RgColf)
      .Formula = "=SUM(G6:G" & o + RgCole & ")"
      .Offset(, -1) = "∑"
   End With
   GetGaoC
End With
End Sub
'*****************************************************
'*前后视距差不应该超过1.5m,视距累积差始终不超过5m       *
'*两个数求和再取二分之一,加个随机数,零差值小于1.5m就行 *
'******************************************************
Private Sub GetStadiaDifference(arr()) '效验视距差

Dim rou1 As Double, rou2 As Double, ss As Double
Randomize
Do
    sum1 = (arr(1, 2) + arr(2, 2)) / 2
    w = Round(Rnd() * 1.5, 2)
    rou1 = Round((sum1 - w), 1)
    rou2 = Round((sum1 + w), 1)
    ss = rou1 - rou2
    If Abs(ss) < 1.5 Then
            arr(1, 2) = rou1
            arr(2, 2) = rou2
            arr(2, 3) = ss
        Exit Do
    End If
Loop
End Sub
Private Sub GetChange(arr(), t As Double)
Dim rou1 As Double, rou2 As Double, ss As Double
rou1 = arr(1, 2)
arr(1, 2) = arr(2, 2)
arr(2, 2) = rou1
arr(2, 3) = arr(1, 2) - arr(2, 2)
arr(3, 3) = t + arr(2, 3)
End Sub
Public Sub GetPc()
Dim brr, i%, n%, c%, l%, dic As Object
Dim Dsum As Double
Dim arr(1 To 5000, 1 To 4)
Const cla% = 6
Const clb% = 10
Const clc% = 11
Const cld% = 14
Const sta As String = "h0"
Const stb As String = "n0"

brr = Sheets(WorkNameCg).UsedRange

For i = cla To UBound(brr) Step 3
    If brr(i, 1) <> sttp And brr(i, 1) <> "" Then
        n = n + 1
        arr(n, 1) = brr(i, 1)
        Dsum = brr(i + 2, 7)
        If brr(i + 1, 1) <> sttp Then
            arr(n, 2) = brr(i + 1, 1)
        Else
            l = i + 1
            Dsum = 0
           Do
              If brr(l, 1) <> "" And brr(l, 1) <> sttp Then
                 arr(n, 2) = brr(l, 1)
                 Exit Do
              Else
                If brr(l, 1) = sttp And brr(l + 1, 1) <> sttp Then
                    c = c + 1
                    If brr(l + 1, 7) <> "" Then Dsum = Dsum + brr(l + 1, 7) Else Dsum = Dsum + brr(l + 2, 7)
                        
                End If
              End If
              l = l + 1
           Loop
        End If
        arr(n, 3) = sta
        arr(n, 4) = Dsum
        n = n + 1
        arr(n, 2) = arr(n - 1, 2)
        arr(n, 3) = stb
        arr(n, 4) = IIf(c = 0, 1, c)
        c = 0
        Dsum = 0
        n = n + 2
    End If
Next

With Sheets(WorkNameSj)
    .Cells.ClearContents
    .Range("a6").Resize(n, 4) = arr
End With
End Sub

Private Sub GetGaoC()
Dim brr, l%, i%
Dim Dsum As Double
Dim strc As String
brr = Sheets(WorkNameCg).UsedRange
For i = 6 To UBound(brr) Step 3
    If brr(i, 1) <> sttp And brr(i, 1) <> "" Then
        strc = brr(i, 1)
        If brr(i + 1, 1) = sttp Then
           l = i + 1
           Do
              If brr(l, 1) <> "" And brr(l, 1) <> sttp Then
                 strc = strc & "-" & brr(l, 1)
                 Range("h" & l) = strc
                 Range("h" & l + 1) = Dsum
                 Exit Do
              Else
                If brr(l, 1) = sttp And brr(l + 1, 1) <> sttp Then
                    If brr(l + 1, 7) <> "" Then Dsum = Dsum + brr(l + 1, 7) Else Dsum = Dsum + brr(l + 2, 7)
                End If
              End If
              l = l + 1
           Loop
        End If
        Dsum = 0
    End If
Next
End Sub


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值