ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何 用VBA 按条件 隐藏 行和列?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 18:31 | 显示全部楼层
  1. Sub 行列隐藏显示()
  2. Dim i As Integer
  3. Dim j As Integer
  4.     For i = 2 To 21
  5.         If Cells(i, 1).Value = "" Then
  6.             Cells(i, 1).EntireRow.Hidden = True
  7.         Else
  8.             Cells(i, 1).EntireRow.Hidden = False
  9.         End If
  10.     Next i
  11.     For j = 3 To 7
  12.         If Cells(1, j).Value = "" Then
  13.             Cells(1, j).EntireColumn.Hidden = True
  14.         Else
  15.             Cells(1, j).EntireColumn.Hidden = False
  16.         End If
  17.     Next
  18. End Sub
  19. Sub 恢复初始()
  20. Dim i As Integer
  21. Dim j As Integer
  22.     For i = 3 To 7
  23.     Cells(1, i).Select
  24.     Selection.EntireColumn.Hidden = False
  25.     Next i
  26.     For j = 2 To 21
  27.     Cells(j, 1).Select
  28.     Selection.EntireRow.Hidden = False
  29.     Next j
  30. End Sub
复制代码

条件隐藏与显示.zip

16.16 KB, 下载次数: 282

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 19:08 | 显示全部楼层
多谢各位老师,楼上的代码是我最新的成果,基本已经达到问题的效果,不过仍然有缺陷:
1 对需要处理行数列数较多的工作表,运行速度极慢无比 (因此出现了新的问题: 如何 判断已经被隐藏的行或者列 所对应的单元格的值 是否为 空值?)
2 现在的代码依然是用按钮来控制,有没有办法可以,自动判断(每更改一次指定区域单元格的值就会触发宏)或者关闭打开工作表后 自动执行判断程序?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 20:26 | 显示全部楼层
mchscofield 发表于 2013-4-22 18:03

您的代码需要再定义宏吗? 我这边为什么一点反应都没有呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 20:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub 行列隐藏显示()
  2. Dim i As Integer
  3. Dim j As Integer
  4.     For i = 2 To 21
  5.         If Cells(i, 1).Value = "" Then
  6.             Cells(i, 1).EntireRow.Hidden = True
  7.         Else
  8.             Cells(i, 1).EntireRow.Hidden = False
  9.         End If
  10.     Next i
  11.     For j = 3 To 7
  12.         If Cells(1, j).Value = "" Then
  13.             Cells(1, j).EntireColumn.Hidden = True
  14.         Else
  15.             Cells(1, j).EntireColumn.Hidden = False
  16.         End If
  17.     Next
  18. End Sub
  19. Sub 恢复初始()
  20. Dim i As Integer
  21. Dim j As Integer
  22.     For i = 3 To 7
  23.     Cells(1, i).Select
  24.     Selection.EntireColumn.Hidden = False
  25.     Next i
  26.     For j = 2 To 21
  27.     Cells(j, 1).Select
  28.     Selection.EntireRow.Hidden = False
  29.     Next j
  30. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-4-22 20:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
mchscofield 发表于 2013-4-22 18:03

比我的好多啦!!!
学习一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 21:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dufu021 发表于 2013-4-22 20:39
比我的好多啦!!!
学习一下

只是凭空硬挤的结果。您知道 如何判断被隐藏行的行号吗?

TA的精华主题

TA的得分主题

发表于 2013-4-22 21:10 | 显示全部楼层
kevinzhe 发表于 2013-4-22 21:01
只是凭空硬挤的结果。您知道 如何判断被隐藏行的行号吗?

我的理解是,空单元格的行号和列号来判断需要被隐藏的行号和列号。
你以为呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-22 21:53 | 显示全部楼层
dufu021 发表于 2013-4-22 21:10
我的理解是,空单元格的行号和列号来判断需要被隐藏的行号和列号。
你以为呢?

本题的功能我已经实现,但运行效率太低,目前我需要处理的工作表有上百行,所以每次判断需要恢复显示行的时间都是实际的上百倍。如果一次只改一个值(其实改值的概率很低只是纠错用),但程序却A列每行都要判断过来,就是说多少行就是理想代码的多少倍时间。
我刚才的问题的意思是,当判断完需要被隐藏的行后,保存其行号,当发生改值后 对改值后单元格的行号与被隐藏单元格的行号进行比较,如果相同则 取消对改值后单元格所在行的隐藏,如果不同 则 无动作。此法可省去大概将近一分钟的等待时间。

TA的精华主题

TA的得分主题

发表于 2013-4-23 08:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
建议你A列采用:
  1. For i = 2 to [A65536].End(xlUp).row
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-23 09:51 | 显示全部楼层
dufu021 发表于 2013-4-23 08:29
建议你A列采用:

如下是我编写的 最新版 代码,目前功能是 奇次触发A表单元格 隐显判断,偶次触发 整体恢复。
缺陷1: 不能 在 判断 A1 是否 更改值 后, 触发功能
缺陷2: 还是之前的速度慢的问题: 如何记录 被隐藏的行的 行号,并与更改值 的行 进行比较 ?
  1. Public k
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3. If Target.Count <> 1 Then Exit Sub
  4. If Target.Column <> 1 Then Exit Sub
  5. If Target.Row <> 1 Then Exit Sub
  6.     Call 隐显恢复
  7. End Sub

  8. Sub 隐显恢复()
  9.     k = k + 1
  10.     If k > 10 Then
  11.         k = 1
  12.         Call 行列隐藏显示
  13.     Else
  14.         If k Mod 2 = 1 Then
  15.             Call 行列隐藏显示
  16.         Else
  17.             Call 恢复初始
  18.         End If
  19.     End If
  20. End Sub
  21. Sub 行列隐藏显示()
  22. Dim i As Integer
  23. Dim j As Integer
  24.     For i = 2 To 21
  25.         If Cells(i, 1).Value = "" Then
  26.             Cells(i, 1).EntireRow.Hidden = True
  27.         Else
  28.             Cells(i, 1).EntireRow.Hidden = False
  29.         End If
  30.     Next i
  31.     For j = 3 To 7
  32.         If Cells(1, j).Value = "" Then
  33.             Cells(1, j).EntireColumn.Hidden = True
  34.         Else
  35.             Cells(1, j).EntireColumn.Hidden = False
  36.         End If
  37.     Next j
  38. End Sub
  39. Sub 恢复初始()
  40. Dim i As Integer
  41. Dim j As Integer
  42.     For i = 3 To 7
  43.     Cells(1, i).Select
  44.     Selection.EntireColumn.Hidden = False
  45.     Next i
  46.     For j = 2 To 21
  47.     Cells(j, 1).Select
  48.     Selection.EntireRow.Hidden = False
  49.     Next j
  50. End Sub

  51. Public arr(1 To 1, 1 To 1)

  52. Sub 集成功能()
  53. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 15:39 , Processed in 0.045575 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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