Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1004|回复: 9

[已解决]请教如何用VBA从左边的数据自动生成右边这样的合计

[复制链接]
发表于 2022-7-23 18:17 | 显示全部楼层 |阅读模式
VBA分类汇总。
最佳答案
2022-7-23 22:19
试试看!!!!
微信图片_20220723181638.png

土石方分类汇总.rar

15.16 KB, 下载次数: 6

发表于 2022-7-23 20:22 | 显示全部楼层
  1. Function total(ByVal data As Variant)
  2. Dim reg As Object
  3. Dim MatchChar, cols As Variant
  4. Dim DataRows(0 To 2) As Double
  5. Set reg = CreateObject("VbScript.RegExp")
  6. cols = Array("填", "挖", "石方")

  7.     For Each MatchChar In data
  8.         For i = 0 To 2
  9.             reg.Pattern = "^(?:" + cols(i) + ")(\d+$)|^(?:" + cols(i) + ")(\d+\.\d+$)"
  10.             If reg.test(MatchChar) Then
  11.             DataRows(i) = DataRows(i) + CDbl(reg.Replace(MatchChar, "$1$2"))
  12.         
  13.             Exit For
  14.             End If
  15.         Next
  16.     Next
  17.     total = DataRows
  18. Set reg = Nothing
  19. End Function

  20. Sub main()
  21. For i = 4 To 101
  22. Range("L" & i).Resize(1.3) = total(Range("B" & i).Resize(1, 8))
  23. Next
  24. End Sub
复制代码

土石方分类汇总.zip

27.42 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2022-7-23 20:56 | 显示全部楼层

类似,但结果不对。 因为可能原数据是我这样的数据
要同一个桩号的填和挖及石方。各自要累加

土石方分类计算.rar

18.41 KB, 下载次数: 8

回复

使用道具 举报

发表于 2022-7-23 22:19 | 显示全部楼层    本楼为最佳答案   
试试看!!!!

土石方分类计算(正则20220723).rar

23.64 KB, 下载次数: 10

回复

使用道具 举报

发表于 2022-7-24 08:49 | 显示全部楼层
供参考

土石方分类汇总.rar

21.1 KB, 下载次数: 9

回复

使用道具 举报

发表于 2022-7-25 17:51 | 显示全部楼层
本帖最后由 我行我速2008 于 2022-7-25 17:54 编辑

Sub 清除()
    Range("K2").CurrentRegion.Offset(1).ClearContents
End Sub

Sub tt()
    Dim Ar, R%, C%, Reg, Str$, Br()
    清除
    Ar = [A1].CurrentRegion.Offset(2)
    ReDim Br(1 To UBound(Ar), 1 To 4)
    For R = 1 To UBound(Ar)
        For C = 1 To UBound(Ar, 2)
            Str = Ar(R, C)
            If InStr(Str, "K0+") Then
                Br(R, 1) = Str
            ElseIf InStr(Str, "填") Then
                Br(R, 2) = Application.Round(Br(R, 2) + TQ(Str, 1), 3)
            ElseIf InStr(Str, "挖") Then
                Br(R, 3) = Application.Round(Br(R, 3) + TQ(Str, 1), 3)
            ElseIf InStr(Str, "石方") Then
                Br(R, 4) = Application.Round(Br(R, 4) + TQ(Str, 1), 3)
            End If
        Next C
    Next R
    Range("K3").Resize(UBound(Ar), 4) = Br
End Sub

Function TQ(Str As String, Optional I As String = "1")
    Dim matches, match, A, S
    With CreateObject("vbscript.regexp")
        Select Case I
            Case "1": .Pattern = "\d+\.?\d+"
        End Select
        .Global = True
         Set matches = .Execute(Str)
         For Each match In matches
         A = A & S & match
        Next
        TQ = IIf(Len(A) > 0, A, "")
    End With
End Function
回复

使用道具 举报

 楼主| 发表于 2022-7-25 19:46 | 显示全部楼层

很强啊,功能很厉害。。但是被分类中的桩号如果不是刚好在第一列,如果修改呢。
回复

使用道具 举报

 楼主| 发表于 2022-7-25 19:47 | 显示全部楼层

谢谢你,刚刚才看到内容,我测试了一下。当内容为整数的时候就出错了。
回复

使用道具 举报

发表于 2022-7-25 19:53 | 显示全部楼层
本帖最后由 hasyh2008 于 2022-7-25 19:57 编辑

Case "1": .Pattern = "\d+\.\d+"
这里加个问号,改为
Case "1": .Pattern = "\d+\.?\d+"

回复

使用道具 举报

发表于 2022-7-25 20:48 | 显示全部楼层
大学好我是新来 发表于 2022-7-25 19:46
很强啊,功能很厉害。。但是被分类中的桩号如果不是刚好在第一列,如果修改呢。

桩号是否在第一列没有任何影响,在第二列就改为arr(i,2),第三列arr(i,3)……第n列就arr(i,n),乱序不在一列上,if判断里面else来接收桩号,第二个for循环调成从1开始。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-5 02:46 , Processed in 0.342259 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表