Excel精英培训网

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

[已解决]怎样在单元格中提取连续的数值

[复制链接]
发表于 2015-9-19 10:58 | 显示全部楼层 |阅读模式
本帖最后由 统计会计 于 2015-9-19 11:23 编辑

请问在B列的单元格里怎样用代码提取出连续的数值
如:1234  1020304  12345
4个连续以上的数值
最佳答案
2015-9-21 10:13
  1. Sub 提取()
  2.     Dim crr()
  3.     arr = Range("b2:c" & [b65536].End(3).Row)
  4.     For i = 1 To UBound(arr)
  5.         x = arr(i, 1)      '源数
  6.         ReDim crr(0 To 9)    '定义0-9的数组
  7.         For k = 1 To Len(x)      '源数各位进数组对应位置,数值大小为源数各位大小
  8.             s = Val(Mid(x, k, 1))
  9.             crr(s) = s
  10.         Next
  11.         xstr = ""     '定义空字符串,用于记录连续数
  12.         For k = 1 To 9      '数组连续取数
  13.             y = crr(k)
  14.             If y > 0 Then      '如果位置上有数,进字符串
  15.                 xstr = xstr & y
  16.             Else      '如果位置上没数
  17.                 If Len(xstr) >= 4 Then arr(i, 2) = arr(i, 2) & "," & xstr          '判断字符串是否大于4位,是则取用
  18.                 xstr = ""         '清空字符串以待下一个连续数
  19.             End If
  20.         Next
  21.         If Len(xstr) >= 4 Then arr(i, 2) = arr(i, 2) & "," & xstr       '如果到最后一位,字符串未清空,判断字符串是否大于4位,是则取用
  22.         If Len(arr(i, 2)) > 0 Then arr(i, 2) = Mid(arr(i, 2), 2)
  23.     Next
  24.     Range("b2:c" & [b65536].End(3).Row) = arr
  25. End Sub
复制代码

工作表 (2).rar

1.64 KB, 下载次数: 13

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-9-19 11:16 | 显示全部楼层
回复

使用道具 举报

发表于 2015-9-21 10:13 | 显示全部楼层    本楼为最佳答案   
  1. Sub 提取()
  2.     Dim crr()
  3.     arr = Range("b2:c" & [b65536].End(3).Row)
  4.     For i = 1 To UBound(arr)
  5.         x = arr(i, 1)      '源数
  6.         ReDim crr(0 To 9)    '定义0-9的数组
  7.         For k = 1 To Len(x)      '源数各位进数组对应位置,数值大小为源数各位大小
  8.             s = Val(Mid(x, k, 1))
  9.             crr(s) = s
  10.         Next
  11.         xstr = ""     '定义空字符串,用于记录连续数
  12.         For k = 1 To 9      '数组连续取数
  13.             y = crr(k)
  14.             If y > 0 Then      '如果位置上有数,进字符串
  15.                 xstr = xstr & y
  16.             Else      '如果位置上没数
  17.                 If Len(xstr) >= 4 Then arr(i, 2) = arr(i, 2) & "," & xstr          '判断字符串是否大于4位,是则取用
  18.                 xstr = ""         '清空字符串以待下一个连续数
  19.             End If
  20.         Next
  21.         If Len(xstr) >= 4 Then arr(i, 2) = arr(i, 2) & "," & xstr       '如果到最后一位,字符串未清空,判断字符串是否大于4位,是则取用
  22.         If Len(arr(i, 2)) > 0 Then arr(i, 2) = Mid(arr(i, 2), 2)
  23.     Next
  24.     Range("b2:c" & [b65536].End(3).Row) = arr
  25. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
统计会计 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2015-9-21 10:14 | 显示全部楼层
按你模拟结果,“0”未计入连续数。

新建 Microsoft Excel 工作表 (2).rar

8.74 KB, 下载次数: 3

回复

使用道具 举报

 楼主| 发表于 2015-9-21 16:36 | 显示全部楼层
grf1973 发表于 2015-9-21 10:13

老师感谢您写的太详细了
解决了我工作中的问题
还有疑问请问您
如果B列的单元格里的数值是1到20呢
是不是这样改
ReDim crr(1 To 20)    '定义0-9的数组
ReDim crr(1 To 20)    '定义0-9的数组
我要把提取的数值分别开在各C列到D E F G H I 列里是不是这样的
arr = Range("b2:c:d:e:F:g:h:i" & [b65536].End(3).Row)
回复

使用道具 举报

发表于 2015-9-21 16:38 | 显示全部楼层
要是两位数的话,比较麻烦的,最好上附件。比如0121314,是认为0,1,2,3,4 呢,还是认为0,12,13,14?这不是定义数组大小的问题。当然数组大小必须是重新定义的。
回复

使用道具 举报

发表于 2015-9-21 16:41 | 显示全部楼层
至于要把提取的数值分别开在各C列到D E F G H I 列里这是细节,重新定义arr没有必要,需要列个显示数组。
回复

使用道具 举报

发表于 2015-9-21 16:42 | 显示全部楼层
理解错了。不用重新定义crr。因为crr就是存放的各位数是否出现。
回复

使用道具 举报

 楼主| 发表于 2015-9-21 16:58 | 显示全部楼层
grf1973 发表于 2015-9-21 16:42
理解错了。不用重新定义crr。因为crr就是存放的各位数是否出现。

还得老师帮忙
给个数分开到各自列里
还有就是1到20 个数值
谢谢
回复

使用道具 举报

发表于 2015-9-22 09:44 | 显示全部楼层
  1. Sub 提取()
  2.     Dim crr()
  3.     arr = Range("b2:b" & [b65536].End(3).Row)
  4.     ReDim brr(1 To UBound(arr), 1 To 10)
  5.     For i = 1 To UBound(arr)
  6.         x = arr(i, 1)   '源数
  7.         ReDim crr(0 To 9)    '定义0-9的数组
  8.         For k = 1 To Len(x)      '源数各位进数组对应位置,数值大小为源数各位大小
  9.             s = Val(Mid(x, k, 1))
  10.             crr(s) = s
  11.         Next
  12.         xstr = ""     '定义空字符串,用于记录连续数
  13.         For k = 1 To 9      '数组连续取数
  14.             y = crr(k)
  15.             If y > 0 Then      '如果位置上有数,进字符串
  16.                 xstr = xstr & y
  17.             Else      '如果位置上没数
  18.                 If Len(xstr) >= 4 Then c = c + 1: brr(i, c) = xstr      '判断字符串是否大于4位,是则取用
  19.                 xstr = ""         '清空字符串以待下一个连续数
  20.             End If
  21.         Next
  22.         If Len(xstr) >= 4 Then c = c + 1: brr(i, c) = xstr   '如果到最后一位,字符串未清空,判断字符串是否大于4位,是则取用
  23.         maxc = IIf(maxc < c, c, maxc): c = 0
  24.     Next
  25.     [c2].Resize(UBound(brr), maxc) = brr
  26. End Sub
复制代码

新建 Microsoft Excel 工作表 (2).rar

9.68 KB, 下载次数: 2

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 07:49 , Processed in 0.480856 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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