ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA的多重条件判断和运行速度优化

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-14 10:03 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lyhvvv 于 2023-4-15 17:25 编辑

想通过多重筛选实现对应数据行的选择,但是目前运行起来非常慢。表格中有VBA和公式,VBA目前运行起来要130s左右(渣电脑);公式的问题是,1)改动表1后,运行起来容易卡顿,2)在表“2023”进行列数据的调整,表格容易卡顿崩溃。
请各位大佬帮助,提供一些想法思路,优化运行时间!!!


4月15日进展

在各位大佬的帮助下,理了一下,快了一点,
1.关闭自动计算和屏幕刷新
2.给几个固定数值先赋值
3.重新理了逻辑顺序,少了一些冗余的语句
但是还不能达到正常使用的速度(设想30s内)。
下一步准备学习按数组的方式处理数据,继续请大家指教!

示例表-2023年4月14日.rar

1.88 MB, 下载次数: 12

示例表-2023年4月15日 - 2.part1.rar

2 MB, 下载次数: 4

最新-1

示例表-2023年4月15日 - 2.part2.rar

1.42 MB, 下载次数: 4

最新-2

TA的精华主题

TA的得分主题

发表于 2023-4-14 13:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你代码还需要加强学习:

1、宏按钮不需要用activaX,内部按钮就很好用;
2、你注释做的很好,看得出来你很有条理,但你的代码却没有条理,只是简单的罗列;
3、尽量用数组来取代单元格读取,一般小数量关系不大,大数据量影响就很大,分界线在5000行数据左右;
4、简单说说思路,我其实也写了完整的代码,但后来发现你的文件不能另存,导致代码丢失,我也不想再写了,只说下思路:
     1)先把参数存放在参数表中,参数表可以是数组,也可以是字典或者其他,避免后续的反复读取单元格;
          比如指标C,可以这么定义:
          dim arr(1 to 3)
          if cells(2,3)<>0 or cells(2,4)<>0 then   '任何一个参数不为零,即为有定义,这里的规则可以按你的需求改
             arr(1,1)=true           '有定义的标志
             arr(1,2)=cells(2,3)    '定义的下限值
             arr(1,3)=cells(2,4)    '定义的上限值
         else
             arr(1,1)=false           '无参数定义
         endif
         其他参数类似

      2)后续参数的连续判断,有一个相对有条理的方法:
         bz=true         '先设定一个判断标识,初始化为符合所有条件
         if arr(1,1) then  '如果指标C有定义,无定义就不改变标识
            if brr(i,67)<arr(1,2) or brr(i,67)>arr(1,3)  then  'brr是原始数据的数组,先要把所有数组读入到数组brr。
               bz=false     '如果当前行的指标C不在定义范围内,改变筛选标识
            endif
         endif
         其他条件用类似的方法在后面罗列,任何条件不满足都要改变bz的值
      
      3)复制满足全部条件的筛选结果
        if bz then   '如果所有条件都满足
           rows(i).copy worksheets(3).cells(worksheets(3).[a65000].end(3).row,1)    '带格式复制,不需要格式的话,就加一个无格式的参数
        endif

基本结构就是这样吧,但上述还有很多参数是需要注意的,比如rows(i).copy中的i其实是不对的,因为数据先存储到数组brr,数组从1开始,而实际要复制的行参数 i 是从3开始,所以正确的应该是rows(i-2).copy

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-4-14 13:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你不要说多重if,也不要提多重筛选,你就说要一个怎么的结果就好了。

TA的精华主题

TA的得分主题

发表于 2023-4-14 14:34 | 显示全部楼层
你这种文件的问题,在于整个表格的设置上面,多余的东西太多,包括格式、颜色、公式、数据的基本设置都存在问题。所以建议还是学习一下基础数据表的设置后再来说问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-14 14:57 | 显示全部楼层
洋务德雷 发表于 2023-4-14 14:34
你这种文件的问题,在于整个表格的设置上面,多余的东西太多,包括格式、颜色、公式、数据的基本设置都存在 ...

好,谢谢                  

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-14 15:21 | 显示全部楼层
fanyoulin 发表于 2023-4-14 13:14
你代码还需要加强学习:

1、宏按钮不需要用activaX,内部按钮就很好用;

谢谢大佬,提的几条建议都先学习一下!

TA的精华主题

TA的得分主题

发表于 2023-4-14 15:23 | 显示全部楼层
先禁止公式自动计算,我这能从101减少到82.
用with替代多次调用工作表,或者直接数组。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-14 15:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lyhvvv 于 2023-4-14 15:32 编辑
ykcbf1100 发表于 2023-4-14 13:41
你不要说多重if,也不要提多重筛选,你就说要一个怎么的结果就好了。

就是根据表"2023"的数据,筛选符合条件的数据行,放到表"2023筛选"里,具体的筛选条件是以下这些:
1.如果年份【列DF】≥2022,则指标G、指标H与表1的C7-F17做比对,对应的指标右侧的列为1,就筛选这个指标,如果不是1,就不筛选这个指标;
2.如果年份【列DF】<2022,则不判断指标G、指标H的列
3.根据表2023【列C】区域,判断L2:M40,对应片区的匹配(M列)为1则满足,为0则不满足(一个指标的筛选开关)
4.大小判断,满足条件的就筛选
表"2023" 指标A【BH】列,≥表1指标A【A2】
表"2023"指标B【BG】列,≥表1指标B【B2】
表"2023"指标C【BO】列,≥表1指标C下限【C2】,≤指标C上上限【D2】
表"2023" 指标D【AY】列,≥表1指标D下限【E2】,≤指标C上上限【F2】
表"2023"指标E【AZ】列,≥表1指标E下限【G2】,≤指标E上上限【H2】
表"2023" 指标F【AX】列,≥表1指标F【I2】

以上条件都满足,则筛选,筛选的数据的整行(或者A:DI列)放到表"2023筛选"里,从A3开始放。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-14 15:25 | 显示全部楼层
sosomc 发表于 2023-4-14 15:23
先禁止公式自动计算,我这能从101减少到82.
用with替代多次调用工作表,或者直接数组。

好的,把禁止自动计算加到代码里试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-14 15:35 | 显示全部楼层
ykcbf1100 发表于 2023-4-14 13:41
你不要说多重if,也不要提多重筛选,你就说要一个怎么的结果就好了。

刚刚回复被吞了,需求我发在楼下一下,请大佬看看
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 05:49 , Processed in 0.048174 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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