Excel精英培训网

 找回密码
 注册

QQ登录

只需一步,快速开始

你正在寻找更好的Excel学习教程吗?Excel技巧80集+数据透视表+函数初中高全套+VBA80集,想学的这儿全都有
查看: 177|回复: 12

[已解决] [已解决]求助一个VBA代码,可以自动计算并显示剩余的数字段区间

[复制链接]
发表于 2017-8-7 16:30 | 显示全部楼层 |阅读模式
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
求助可以计算并显示去掉对应单元格中的数据点、数据区间或者两种混合形式的代码,具体想实现的效果请见附件,谢谢!

如何显示剩余数据区间.zip

5.36 KB, 下载次数: 10

大灰狼1976发布于 2017-8-8 15:50 |显示全部回帖
给你一个附件。
说明,选中(不是编辑)A列某个单元格时,会跳出输入框,输入剔除数据(注意格式以,号或-号分隔规则不要变)后,B列会自动显示结果。
发表于 2017-8-7 17:03 | 显示全部楼层
没想出简洁的方法,就这样吧。
  1. Sub aaa()
  2. Dim arr, brr, brr1, crr, i&, j&, k&, s$
  3. arr = [e2].CurrentRegion
  4. For i = 2 To UBound(arr)
  5.   ReDim crr(Split(arr(i, 1), "-")(0) To Split(arr(i, 1), "-")(UBound(Split(arr(i, 1), "-"))))
  6.   brr = Split(arr(i, 1), ",")
  7.   For j = 0 To UBound(brr)
  8.     brr1 = Split(brr(j), "-")
  9.     For k = brr1(0) To brr1(1)
  10.       crr(k) = 1
  11.     Next k
  12.   Next j
  13.   brr = Split(arr(i, 2), ",")
  14.   For j = 0 To UBound(brr)
  15.     brr1 = Split(brr(j), "-")
  16.     For k = brr1(0) To brr1(UBound(brr1))
  17.       crr(k) = ""
  18.     Next k
  19.   Next j
  20.   For j = LBound(crr) To UBound(crr) - 1
  21.     If crr(j) = 1 Then
  22.       For k = j + 1 To UBound(crr)
  23.         If crr(k) = "" Then Exit For
  24.       Next k
  25.       s = s & "," & j & "-" & k - 1
  26.       j = k
  27.     End If
  28.   Next j
  29.   arr(i, 3) = Mid(s, 2)
  30.   s = ""
  31. Next i
  32. [e2].Resize(UBound(arr), 3) = arr
  33. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 11:12 | 显示全部楼层
非常感谢版主的回答,试了一下可以完美运行,如果我想要实现跳出一个输入框来实现将输入的内容从本行的e列剔除的话要怎么样实现呢?从哪里添加这个input对话框比较合理呢,菜鸟一个希望版主能够再指导一下,谢谢
回复 支持 反对

使用道具 举报

发表于 2017-8-8 11:16 | 显示全部楼层
你的意思是,你输入一次,每一行都剔除相同的内容?
回复 支持 反对

使用道具 举报

发表于 2017-8-8 11:20 | 显示全部楼层
原代码作了最小改动。
  1. Sub aaa()
  2. Dim arr, brr, brr1, crr, i&, j&, k&, s$, s1$
  3. arr = [e2].CurrentRegion
  4. s1 = InputBox("Pls Input...")
  5. For i = 2 To UBound(arr)
  6.   ReDim crr(Split(arr(i, 1), "-")(0) To Split(arr(i, 1), "-")(UBound(Split(arr(i, 1), "-"))))
  7.   brr = Split(arr(i, 1), ",")
  8.   For j = 0 To UBound(brr)
  9.     brr1 = Split(brr(j), "-")
  10.     For k = brr1(0) To brr1(1)
  11.       crr(k) = 1
  12.     Next k
  13.   Next j
  14.   brr = Split(s1, ",")
  15.   For j = 0 To UBound(brr)
  16.     brr1 = Split(brr(j), "-")
  17.     For k = brr1(0) To brr1(UBound(brr1))
  18.       crr(k) = ""
  19.     Next k
  20.   Next j
  21.   For j = LBound(crr) To UBound(crr) - 1
  22.     If crr(j) = 1 Then
  23.       For k = j + 1 To UBound(crr)
  24.         If crr(k) = "" Then Exit For
  25.       Next k
  26.       s = s & "," & j & "-" & k - 1
  27.       j = k
  28.     End If
  29.   Next j
  30.   arr(i, 3) = Mid(s, 2)
  31.   s = ""
  32. Next i
  33. [e2].Resize(UBound(arr), 3) = arr
  34. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 11:38 | 显示全部楼层
谢谢,版主,效率太高了,我会通过一个change事件来调用您的代码来实现对本行的数据进行剔除,希望您的代码加入一个可以输入的对话框,本行剔除的内容就是输入框中输入的内容
回复 支持 反对

使用道具 举报

发表于 2017-8-8 12:00 | 显示全部楼层
你用change事件处理也可以的,可以输入的对话框就是inputbox,借用s1 = InputBox("Pls Input...")的处理方式就行。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 15:22 | 显示全部楼层
谢谢版主,这个若只剔除本行,而不是E2往下所有的单元格的话,需要怎么修改呢,我自己尝试了下修改,但太菜了对循环不懂,没能修改成功,能否再麻烦一下版主呢,谢谢
回复 支持 反对

使用道具 举报

发表于 2017-8-8 15:50 | 显示全部楼层    本楼为最佳答案   
给你一个附件。
说明,选中(不是编辑)A列某个单元格时,会跳出输入框,输入剔除数据(注意格式以,号或-号分隔规则不要变)后,B列会自动显示结果。

test.zip

12.57 KB, 下载次数: 8

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 17:24 | 显示全部楼层
非常感谢版主,附件就是想要实现的效果,单个数字左右没有相邻数字时候会出现N-N这种情况,例如1-10,剔除2,4,就会成为1-1,3-3,5-10这种情况,估计要把你的原始代码再好好研究下,回头研究不出来再请教版主哈,谢谢~

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2017-8-23 08:47 , Processed in 0.124800 second(s), 25 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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