Excel精英培训网

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

[已解决]求大咖帮忙写个公式

[复制链接]
发表于 2016-4-18 14:23 | 显示全部楼层 |阅读模式
本帖最后由 csq1007 于 2016-4-18 18:21 编辑

各位老师,工作中遇到要将习惯性的说法变成运算,我是做汽车玻璃的,经常遇到左右对称和不对称的问题。比如:
左右对称各30块,左30右40。单子的数据经常出现的几种情况如下:
玻璃名称      数量   
1                   30
2                 左40
3                 右50
4                对称各60
5                 左70套
6                 左80右90
7                左100右110套(这个表示(100+110)*2=420)
具体问题在附件里
最佳答案
2016-4-20 15:06
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    Dim k As Integer
    Dim str As String

    k = 1
    str = rng.Text

    '1)求倍数
    If str Like "*套*" Then k = k * 2
    If str Like "*对称各*" Then k = k * 2

    '2)将所有的数相加
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\d*\.?\d+"
        Set matchs = .Execute(str)
        For Each match In matchs
            mySum = mySum + Val(match)
        Next
    End With

    '3)输出
    mySum = mySum * k
End Function

带特定字符的单元格求和3.rar (15.11 KB, 下载次数: 8)

带特定字符的单元格求和.rar

9.55 KB, 下载次数: 9

 楼主| 发表于 2016-4-18 18:20 | 显示全部楼层
回复

使用道具 举报

发表于 2016-4-19 11:01 | 显示全部楼层
QQ截图20160419104624.jpg

带特定字符的单元格求和2.rar (14.81 KB, 下载次数: 8)

评分

参与人数 1 +1 收起 理由
csq1007 + 1 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-4-20 13:02 | 显示全部楼层
爱疯 发表于 2016-4-19 11:01
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    D ...

老师,您好!非常感谢老师的出手相助。
我试了一下,就我提供的参数,您的公式没有问题,但在实际使用中出现一些错误,比如“左5”显示为0,“左05”就出现数字5了,像这种情况该怎么处理。
回复

使用道具 举报

 楼主| 发表于 2016-4-20 13:17 | 显示全部楼层
本帖最后由 csq1007 于 2016-4-20 13:28 编辑
csq1007 发表于 2016-4-20 13:02
老师,您好!非常感谢老师的出手相助。
我试了一下,就我提供的参数,您的公式没有问题,但在实际使用中 ...


我目前使用的是公式:
=SUMPRODUCT(TEXT(LEFT(TEXT(MID(B2&"a",ROW($1:$19),COLUMN($A:$Y)),),COLUMN($A:$Y)-1),"0;;0;!0")*(MID(1&B2,ROW($1:$19),1)>="福"))*MAX(1,SUM(COUNTIF(B2,{"*对称*","*套*"}))*2)+SUM(B2)
这个公式是从左边开始计算字符的,所以第一个必须是字符,比如“30套”就不认,只好在下单的时候在类似这种单的情况在前面加一个字符“共”
我把我的公式和老师的VB公式放在一张表里,出错的地方标黄底。
我是excel和VB菜鸟,望老师多指教。

爱疯老师的vb单元格求和.rar

16 KB, 下载次数: 1

回复

使用道具 举报

 楼主| 发表于 2016-4-20 13:32 | 显示全部楼层
爱疯 发表于 2016-4-19 11:01
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    D ...

老师所言既是,刚看见爱疯老师是超级版主,非常感谢!
回复

使用道具 举报

发表于 2016-4-20 15:06 | 显示全部楼层    本楼为最佳答案   
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    Dim k As Integer
    Dim str As String

    k = 1
    str = rng.Text

    '1)求倍数
    If str Like "*套*" Then k = k * 2
    If str Like "*对称各*" Then k = k * 2

    '2)将所有的数相加
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\d*\.?\d+"
        Set matchs = .Execute(str)
        For Each match In matchs
            mySum = mySum + Val(match)
        Next
    End With

    '3)输出
    mySum = mySum * k
End Function

带特定字符的单元格求和3.rar (15.11 KB, 下载次数: 8)

评分

参与人数 1 +1 收起 理由
csq1007 + 1 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-4-20 15:29 | 显示全部楼层
爱疯 发表于 2016-4-20 15:06
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    Dim k As Inte ...

非常好用,谢谢爱大咖!
回复

使用道具 举报

 楼主| 发表于 2016-4-20 15:34 | 显示全部楼层
爱疯 发表于 2016-4-20 15:06
Function mySum(rng As Range) As Double
    Dim matchs As Object, match As Object
    Dim k As Inte ...

为了学习,我正在恶补正则表达式的入门知识。再一次感谢爱疯大咖!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 06:04 , Processed in 0.576022 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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