Excel精英培训网

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

[已解决]单元格内字符之间数字相减

[复制链接]
发表于 2015-5-5 21:06 | 显示全部楼层 |阅读模式
请问各位老师:
一列单元格内全部为文本型的“N112-N119、N87-N96、34-45、N9、N11、#12、N17、N7-N9、N19-N21、N27、N30、N38、N39、N43-N47、#51-#52、N54-N59、N62-N64、N84、N85、N89”类似内容,里面的内容全部是文本型的,数字之间全部是以“、”隔开的,现在想要提取出含有“-”的前后两个数据相减(姑且称为距离),如N19-N21则为2,并把所有的距离(两数字相减)之和全部加起来,而含有“-”前后的两个数字可能是1、2、3位的。
请问该怎么解决,谢谢了。
最佳答案
2015-5-6 09:49
  1. Function aa(rng)
  2. x = Split(rng, "、")
  3. For i = 0 To UBound(x)
  4.     If InStr(x(i), "-") Then
  5.         y = Split(x(i), "-")
  6.         n = IIf(IsNumeric(y(0)), 1, 2)
  7.         s = s + Abs(Mid(y(1), n) - Mid(y(0), n))
  8.     End If
  9. Next
  10. aa = UBound(x) + s + 1
  11. End Function
复制代码
公式=aa(单元格)
发表于 2015-5-6 06:31 | 显示全部楼层
1、数字之前是否只有一个字符,而且是成对出现的,
2、之和是否只加 相减后的结果,
3,上传附件,模拟结果。
回复

使用道具 举报

 楼主| 发表于 2015-5-6 08:42 | 显示全部楼层
雪舞子 发表于 2015-5-6 06:31
1、数字之前是否只有一个字符,而且是成对出现的,
2、之和是否只加 相减后的结果,
3,上传附件,模拟结 ...

1、数字之前只有一个字符,是成对出现的,有的数字之前没有字符
2、之和只相加相减后的结果
3、有的单元格内没有“-”的字符,不用计算相减后的结果


使用情况统计表 ().rar

15.02 KB, 下载次数: 7

回复

使用道具 举报

发表于 2015-5-6 09:34 | 显示全部楼层
测试一下。
285行数据N13-N14+1手工处理了一下,
如果表格确这样数据再另行更改一下代码。
  1. Sub test()
  2.     Dim arr, brr(1000, 1 To 1), ar, br, i%, j%, m&, n&
  3.     arr = [a3].CurrentRegion
  4.     For i = 2 To UBound(arr)
  5.         m = 0: n = 0
  6.         ar = Split(arr(i, 1), "、")
  7.         For j = 0 To UBound(ar)
  8.             If InStr(ar(j), "-") Then
  9.                 br = Split(ar(j), "-")
  10.                 If IsNumeric(Left(br(0), 1)) Then
  11.                     n = Abs(br(0) - br(1))
  12.                 Else
  13.                     n = Abs(Mid(br(0), 2) - Mid(br(1), 2))
  14.                 End If
  15.             End If
  16.             m = m + n
  17.         Next
  18.        brr(i, 1) = m
  19.     Next
  20.     [c1].Resize(i - 1) = brr
  21. End Sub
复制代码
使用情况统计表 ().rar (22.17 KB, 下载次数: 3)
回复

使用道具 举报

发表于 2015-5-6 09:49 | 显示全部楼层    本楼为最佳答案   
  1. Function aa(rng)
  2. x = Split(rng, "、")
  3. For i = 0 To UBound(x)
  4.     If InStr(x(i), "-") Then
  5.         y = Split(x(i), "-")
  6.         n = IIf(IsNumeric(y(0)), 1, 2)
  7.         s = s + Abs(Mid(y(1), n) - Mid(y(0), n))
  8.     End If
  9. Next
  10. aa = UBound(x) + s + 1
  11. End Function
复制代码
公式=aa(单元格)

使用情况统计表 ().rar

15.97 KB, 下载次数: 6

回复

使用道具 举报

发表于 2015-5-7 10:58 | 显示全部楼层
  1. Sub test()
  2.     Dim arr, ar, br, i%, j%
  3.     arr = [a3].CurrentRegion
  4.     ReDim brr(1 To UBound(arr), 1 To 1)
  5.     For i = 2 To UBound(arr)
  6.         ar = Split(arr(i, 1), "、")
  7.         For j = 0 To UBound(ar)
  8.             If InStr(ar(j), "-") > 0 Then
  9.                 br = Split(ar(j), "-")
  10.                 brr(i, 1) = brr(i, 1) + Abs(GetNum(br(1)) - GetNum(br(0)))
  11.             End If
  12.         Next
  13.     Next
  14.     [d2].Resize(i - 1) = brr
  15. End Sub

  16. Function GetNum(str)
  17.     For i = 1 To Len(str)
  18.         If IsNumeric(Mid(str, i, 1)) Then GetNum = GetNum & Mid(str, i, 1)
  19.     Next
  20.     GetNum = Val(GetNum)
  21. End Function
复制代码

使用情况统计表 ().rar

23.26 KB, 下载次数: 5

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 14:09 , Processed in 1.385498 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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