1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9250|回复: 10

主要是关于SpecialCells(xlCellTypeBlanks).Count,还有一些小问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-31 18:27 | 显示全部楼层 |阅读模式
  1. Option Base 1
  2. Sub test()
  3. Dim i As Integer
  4. Dim j As Integer
  5. Dim arr() As Integer
  6. Dim m As Integer
  7. Dim ran As Range
  8. Dim ran2 As Range
  9. Dim zz
  10. Dim fz
  11. '总体思路把相邻B列空单元格之间的区域选出来,然后在这个小区域内循环比较出正数与12、负数与-12最接近的数
  12. n = 1
  13. m = Range("b65536").End(xlUp).Row + 1 'B列最下面非空单元格下一个空单元格所在行
  14. s = Range("b1:b" & m).SpecialCells(xlCellTypeBlanks).Count '为什么b1:b36 空单元格是3个?不是4个么?
  15. ReDim arr(s) '
  16. 'ran = Range("b1:b" & m).SpecialCells(xlCellTypeBlanks) '为什么不能这样赋值?
  17. For Each ran2 In Range("b1:b" & m).SpecialCells(xlCellTypeBlanks)
  18.     arr(n) = ran2.Row '这个循环几次后里面ran2.row也没36,导致最后面的桩号无法标注出来
  19.     If n > 1 Then
  20.         For p = arr(n - 1) + 1 To arr(n) - 2
  21.             zz = Range("b" & p)
  22.             fz = Range("b" & p)
  23.             If zz >= 0 And Abs(zz - 12) > Abs(Range("b" & p + 1) - 12) Then
  24.                 z = p + 1
  25.             End If
  26.             If fz < 0 And Abs(zz + 12) > Abs(Range("b" & p + 1) + 12) Then
  27.                 f = p + 1
  28.             End If
  29.         Next p
  30.         Range("d" & z) = "ZZ"
  31.         Range("d" & f) = "FZ"
  32.     End If
  33.     n = n + 1
  34. Next
  35. End Sub
复制代码

标记.zip

9.53 KB, 下载次数: 18

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-31 18:36 | 显示全部楼层
咋不能编辑了??问题都没有显示啊,还发错版了。。。帮个忙移动一下吧,谢谢版主

问题是,在B列找出与12差为0 的单元格(如果没有,则选出与之差值最接近0的,正负各一个),并在正值对应的D列标出“zz”,负值对应的D列标出“fz”
主要问题好像是出在,SpecialCells(xlCellTypeBlanks),请看14、16、18行
谢谢指点

TA的精华主题

TA的得分主题

发表于 2012-10-31 19:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请参考:
  1. Sub test()
  2. Dim i As Integer
  3. Dim j As Integer
  4. Dim arr() As Integer
  5. Dim m As Integer
  6. Dim ran As Range
  7. Dim ran2 As Range
  8. Dim zz
  9. Dim fz
  10. '总体思路把相邻B列空单元格之间的区域选出来,然后在这个小区域内循环比较出正数与12、负数与-12最接近的数
  11. n = 1
  12. 'm = Range("b65536").End(xlUp).Row + 1 'B列最下面非空单元格下一个空单元格所在行
  13. m = Range("b65536").End(xlUp).Row  '这里+1没有用
  14. 's = Range("b1:b" & m).SpecialCells(xlCellTypeBlanks).Count '为什么b1:b36 空单元格是3个?不是4个么?
  15. 'ReDim arr(s) '
  16. 'ran = Range("b1:b" & m).SpecialCells(xlCellTypeBlanks) '为什么不能这样赋值?
  17. Set ran = Range("b1:b" & m).SpecialCells(xlCellTypeBlanks) '要加Set
  18. Set ran = Union(ran, Range("b" & m + 1))
  19. s = ran.Count
  20. ReDim arr(s)
  21. For Each ran2 In ran
  22.     arr(n) = ran2.Row '这个循环几次后里面ran2.row也没36
  23.     If n > 1 Then
  24.         For p = arr(n - 1) + 1 To arr(n) - 2
  25.             zz = Range("b" & p)
  26.             fz = Range("b" & p)
  27.             If zz >= 0 And Abs(zz - 12) > Abs(Range("b" & p + 1) - 12) Then
  28.                 z = p + 1
  29.             End If
  30.             If fz < 0 And Abs(zz + 12) > Abs(Range("b" & p + 1) + 12) Then
  31.                 f = p + 1
  32.             End If
  33.         Next p
  34.         Range("d" & z) = "ZZ"
  35.         Range("d" & f) = "FZ"
  36.     End If
  37.     n = n + 1
  38. Next
  39. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-31 20:46 | 显示全部楼层
zhaogang1960 发表于 2012-10-31 19:32
请参考:

帮我指点一下这个问题吧
为什么b1:b36 空单元格是3个?不是4个么?
谢谢啦

TA的精华主题

TA的得分主题

发表于 2012-10-31 21:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
杨柳依 发表于 2012-10-31 20:46
帮我指点一下这个问题吧
为什么b1:b36 空单元格是3个?不是4个么?
谢谢啦

如果b1:b36空单元格是4个,那么b1:b37空单元格就应该是5个,但实际上最下面的空格不会包含在xlCellTypeBlanks范围内,即:xlCellTypeBlanks应该是所选区域b1:b36中的空单元格区域,与已经使用区域UsedRange的交汇区域,不包含UsedRange之外的单元格,请看下图:
无标题.jpg
已经使用区域是:A1:F14,Range("b1:b26").SpecialCells(xlCellTypeBlanks)就是上图阴影部分,包含B14已经涂了黄色的单元格

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-1 16:19 | 显示全部楼层
zhaogang1960 发表于 2012-10-31 21:30
如果b1:b36空单元格是4个,那么b1:b37空单元格就应该是5个,但实际上最下面的空格不会包含在xlCellTypeBl ...

那我在b36随便输入一个数字后,再将b36的数据删了,这样b36算不算是usedrange?
我这样做了之后在原来的代码中将Set ran = Union(ran, Range("b" & m + 1))去了,再把m = Range("b65536").End(xlUp).Row 变成m = Range("b65536").End(xlUp).Row + 1,可是不行,求指点,谢谢

TA的精华主题

TA的得分主题

发表于 2012-11-1 16:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
杨柳依 发表于 2012-11-1 16:19
那我在b36随便输入一个数字后,再将b36的数据删了,这样b36算不算是usedrange?
我这样做了之后在原来的 ...

3楼代码Set ran = Union(ran, Range("b" & m + 1))后,ran就是4个空格

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-1 20:44 | 显示全部楼层
zhaogang1960 发表于 2012-11-1 16:41
3楼代码Set ran = Union(ran, Range("b" & m + 1))后,ran就是4个空格

可能是我没说明白,您可能误解我的意思了,对于这个UsedRange,是不是说我新建一个工作表后在A1内填上一个数,然后再清除数据,这样后的A1算不算是UsedRange?谢谢

TA的精华主题

TA的得分主题

发表于 2012-11-1 21:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
杨柳依 发表于 2012-11-1 20:44
可能是我没说明白,您可能误解我的意思了,对于这个UsedRange,是不是说我新建一个工作表后在A1内填上一个 ...

如果设置了格式,只清除数据不会影响这个UsedRange,如果输入数据时不涉及格式,如输入1,2等,清除该数据后会影响这个UsedRange,即这些单元格不在UsedRange中
如果单元格既没有数据,也没有格式,它就不在UsedRange中

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-1 21:23 | 显示全部楼层
zhaogang1960 发表于 2012-11-1 21:15
如果设置了格式,只清除数据不会影响这个UsedRange,如果输入数据时不涉及格式,如输入1,2等,清除该数据 ...

多谢老师..
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-4-23 03:20 , Processed in 0.027479 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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