ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba使用效率太低,有没有办法提高效率

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-28 12:43 | 显示全部楼层 |阅读模式
主要是其中的HideEmptyRows函数,涉及大概至少300行数据,使用效率太低了,有没有办法进行提高效率
  1. Sub completeedit()
  2.     Dim found1 As Boolean, found2 As Boolean, found3 As Boolean
  3.     Dim ws As Worksheet
  4.     Dim cell As Range
  5.       
  6.     found1 = False
  7.     found2 = False
  8.     found3 = False
  9.       
  10.     Application.ScreenUpdating = False
  11.     Application.Calculation = xlCalculationManual
  12.       
  13.     For Each cell In Sheet7.Range("F7:F37")
  14.         If InStr(1, cell.Value, "确权", vbTextCompare) > 0 Then
  15.             found1 = True
  16.         ElseIf InStr(1, cell.Value, "确权外", vbTextCompare) > 0 Then
  17.             found2 = True
  18.         ElseIf InStr(1, cell.Value, "其他", vbTextCompare) > 0 Then
  19.             found3 = True
  20.         End If
  21.     Next cell
  22.     If found1 Then HideEmptyRows Sheet3, "D6:D35", "D39:D68"
  23.     If found2 Then HideEmptyRows Sheet4, "D6:D35", "D39:D68"
  24.     If found3 Then HideEmptyRows Sheet5, "D5:D25"
  25.     HideEmptyRows Sheet6, "D6:D300"
  26.     HideEmptyRows Sheet7, "G7:G37"
  27.     HideNegativeRows Sheet2, "E8:E11"
  28.     Application.ScreenUpdating = True
  29.     Application.Calculation = xlCalculationAutomatic
  30. End Sub
  31. Sub HideEmptyRows(ws As Worksheet, ParamArray ranges() As Variant)
  32.    Dim rng As Range
  33.    Dim r As Variant
  34.    For Each r In ranges
  35.        For Each rng In ws.Range(r)
  36.            If rng.Value = "" Then
  37.                rng.EntireRow.Hidden = True
  38.            End If
  39.         Next rng
  40.    Next r
  41. End Sub

  42. Sub HideNegativeRows(ws As Worksheet, rngAddress As String)
  43.    Dim rng As Range
  44.    Dim cell As Range
  45.    
  46.    For Each cell In ws.Range(rngAddress)
  47.        If cell.Value <= 0 Then
  48.            cell.EntireRow.Hidden = True
  49.        End If
  50.    Next cell
  51. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-6-28 13:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
使用Union方法将需要隐藏的行联合成一个单元格区域,然后一次性隐藏。

TA的精华主题

TA的得分主题

发表于 2024-6-28 13:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上传个附件吧

TA的精华主题

TA的得分主题

发表于 2024-6-28 17:03 | 显示全部楼层
不是VBA效率低,你才300行数据,3万行数据也不会慢哪里去。关键在于你搞了2个自定义过程,效率低的问题所在吧。没有附件也说不清楚,也许只要不多的代码就能达到目的。

TA的精华主题

TA的得分主题

发表于 2024-6-30 01:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你那个两个过程效率太低了    判断空行 可以使用工作表函数 counta,隐藏操作之前 可以把所有符合隐藏条件的行 union 组合在一起,最后只需要隐藏一次。  循环操作工作表是比较慢 的

TA的精华主题

TA的得分主题

发表于 2024-7-5 15:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub completeedit()
  2.     Dim ws As Worksheet
  3.     Dim cell As Range, hideRanges As Range
  4.     Dim found(1 To 3) As Boolean
  5.    
  6.     Application.ScreenUpdating = False
  7.     Application.Calculation = xlCalculationManual
  8.    
  9.     ' 优化 Sheet7 搜索逻辑
  10.     For Each cell In Sheet7.Range("F7:F37")
  11.         Select Case True
  12.             Case InStr(1, cell.Value, "确权", vbTextCompare) > 0: found(1) = True
  13.             Case InStr(1, cell.Value, "确权外", vbTextCompare) > 0: found(2) = True
  14.             Case InStr(1, cell.Value, "其他", vbTextCompare) > 0: found(3) = True
  15.         End Select
  16.         If found(1) And found(2) And found(3) Then Exit For
  17.     Next cell
  18.    
  19.     ' 隐藏相应工作表的空行
  20.     If found(1) Then HideRowsBasedOnCondition Sheet3, "D6:D35,D39:D68", "=""", True
  21.     If found(2) Then HideRowsBasedOnCondition Sheet4, "D6:D35,D39:D68", "=""", True
  22.     If found(3) Then HideRowsBasedOnCondition Sheet5, "D5:D25", "=""", True
  23.     HideRowsBasedOnCondition Sheet6, "D6:D300", "=""", True
  24.     HideRowsBasedOnCondition Sheet7, "G7:G37", "=""", True
  25.     HideRowsBasedOnCondition Sheet2, "E8:E11", "<=0", False
  26.    
  27.     Application.ScreenUpdating = True
  28.     Application.Calculation = xlCalculationAutomatic
  29. End Sub

  30. Sub HideRowsBasedOnCondition(ws As Worksheet, rangeAddress As String, condition As String, useCountA As Boolean)
  31.     Dim rng As Range, cell As Range, hideRanges As Range
  32.    
  33.     For Each rng In ws.Range(rangeAddress)
  34.         If useCountA Then
  35.             If Application.WorksheetFunction.CountA(rng) = 0 Then
  36.                 If hideRanges Is Nothing Then
  37.                     Set hideRanges = rng.EntireRow
  38.                 Else
  39.                     Set hideRanges = Union(hideRanges, rng.EntireRow)
  40.                 End If
  41.             End If
  42.         Else
  43.             If Evaluate(rng.Address & condition) Then
  44.                 If hideRanges Is Nothing Then
  45.                     Set hideRanges = rng.EntireRow
  46.                 Else
  47.                     Set hideRanges = Union(hideRanges, rng.EntireRow)
  48.                 End If
  49.             End If
  50.         End If
  51.     Next rng
  52.    
  53.     If Not hideRanges Is Nothing Then hideRanges.Hidden = True
  54. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-7-6 16:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub completeedit()
  2.     Dim found1 As Boolean, found2 As Boolean, found3 As Boolean
  3.     Dim cell As Range
  4.    
  5.     Application.ScreenUpdating = False
  6.     Application.Calculation = xlCalculationManual
  7.    
  8.     ' Reset flags
  9.     found1 = False
  10.     found2 = False
  11.     found3 = False
  12.    
  13.     ' Check the required range and set flags accordingly
  14.     For Each cell In Sheet7.Range("F7:F37")
  15.         If Not found1 And InStr(1, cell.Value, "确权", vbTextCompare) > 0 Then
  16.             found1 = True
  17.         ElseIf Not found2 And InStr(1, cell.Value, "确权外", vbTextCompare) > 0 Then
  18.             found2 = True
  19.         ElseIf Not found3 And InStr(1, cell.Value, "其他", vbTextCompare) > 0 Then
  20.             found3 = True
  21.         End If
  22.         ' Exit the loop early if all flags are set
  23.         If found1 And found2 And found3 Then Exit For
  24.     Next cell
  25.    
  26.     ' Apply row hiding based on flags
  27.     If found1 Then HideEmptyRows Sheet3, "D6:D35", "D39:D68"
  28.     If found2 Then HideEmptyRows Sheet4, "D6:D35", "D39:D68"
  29.     If found3 Then HideEmptyRows Sheet5, "D5:D25"
  30.    
  31.     HideEmptyRows Sheet6, "D6:D300"
  32.     HideEmptyRows Sheet7, "G7:G37"
  33.     HideNegativeRows Sheet2, "E8:E11"
  34.    
  35.     Application.ScreenUpdating = True
  36.     Application.Calculation = xlCalculationAutomatic
  37. End Sub

  38. Sub HideEmptyRows(ws As Worksheet, ParamArray ranges() As Variant)
  39.     Dim rng As Range
  40.     Dim r As Variant
  41.     Dim cell As Range
  42.     Dim fullRange As Range
  43.    
  44.     ' Combine all ranges into one
  45.     For Each r In ranges
  46.         If fullRange Is Nothing Then
  47.             Set fullRange = ws.Range(r)
  48.         Else
  49.             Set fullRange = Union(fullRange, ws.Range(r))
  50.         End If
  51.     Next r
  52.    
  53.     ' Iterate over the entire range and hide rows
  54.     If Not fullRange Is Nothing Then
  55.         For Each cell In fullRange
  56.             If cell.Value = "" Then
  57.                 cell.EntireRow.Hidden = True
  58.             End If
  59.         Next cell
  60.     End If
  61. End Sub

  62. Sub HideNegativeRows(ws As Worksheet, rngAddress As String)
  63.     Dim cell As Range
  64.     Dim fullRange As Range
  65.    
  66.     ' Get the specified range
  67.     Set fullRange = ws.Range(rngAddress)
  68.    
  69.     ' Iterate over the range and hide rows with non-positive values
  70.     If Not fullRange Is Nothing Then
  71.         For Each cell In fullRange
  72.             If cell.Value <= 0 Then
  73.                 cell.EntireRow.Hidden = True
  74.             End If
  75.         Next cell
  76.     End If
  77. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 23:47 , Processed in 0.034637 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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