ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [开_144]提示冗余的变量和常量[已总结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-8-1 11:32 | 显示全部楼层 |阅读模式
本帖最后由 清风_ll 于 2013-10-14 10:46 编辑

VBA中,有Option Explicit 语句来强制变量声明,在代码执行时如果存在未声明的变量时,系统将会给出一个提示。反之,如果定义了某些变量,而代码自始至终都没有使用到,这些变量将是冗余变量。例如在你发布的VBA作品中,代码中可能就会存在这样一些冗余的变量或常量,这会让有些人(特别是初学者)觉得莫名其妙。本题目由此而来。

竞赛要求:
制作一个VBE工具,提取指定过程代码中未使用到的变量和常量。
(实现要求:将光标置于过程中,执行代码完成功能)

评分规则:
1、提取代码中的所有变量和常量(包括数组,静态变量等),得2分。
2、充分考虑各种书写情况(包括数据类型符号、注释语句等),正确提取代码中未使用的变量和常量,得2分。


本题竞赛时间已结束!

因我个人考虑不全面,本题涉及内容较多,因此评分标准有所调整,行号标签不进行测评,希各知照。
另因不能在同一贴子中多次评分,jsxjd 在另一回复贴再加1分。




TA的精华主题

TA的得分主题

发表于 2013-8-4 23:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我觉得吧,原来要求的普遍查的话太繁琐了,代码量很大呀~

指定过程就好太多了~

函数、事件的参数变量要考虑不?

点评

也是因为这个考虑,才简化了要求。参数不考虑  发表于 2013-8-5 00:40

TA的精华主题

TA的得分主题

发表于 2013-8-5 16:32 | 显示全部楼层
本帖最后由 lee1892 于 2013-8-6 14:56 编辑

写得贼啰嗦,本来是为了应付普遍检查的~~

把检查用的代码放出来呗。

================
Rev 1
发现忘了把Const语句删掉了
增加了Static语句的静态变量提取
细微调整

================
Rev 2
经提示(仅提示数组会有问题,而没说什么问题,不算作弊吧,呵呵),发现处理申明语句时,删除()及其中的内容的Pattern是贪婪的,会将同行的第一个(到最后一个)间的字符全部删除,已修正。


补充内容 (2013-8-13 16:26):
就我一个人作这题吗~~不好玩呀~~

补充内容 (2013-9-2 15:28):
谁能把ReDim的变量分离出来呀~
  1. ReDim arr(UBound(Array(1,2)), UBound(Array(2,3))), brr(UBound(Array(1,2)), UBound(Array(2,3)))
复制代码

补充内容 (2013-10-2 10:57):
貌似我忘了行号一说,估计要被扣分了,555~

提示冗余的变量和常量 Rev_2 by Lee1892.rar

34.74 KB, 下载次数: 56

点评

本题应该不需要考虑 Redim ,直接删除就行。  发表于 2013-10-1 13:43

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-9-3 10:40 | 显示全部楼层
本帖最后由 lee1892 于 2013-9-3 12:36 编辑

ReDim 会是一个非常让人头痛的问题,其申明新的数组变量时,不受Option Explicit限制
1、ReDim语句可能出像()的嵌套,而VBS的RegExp对象不支持嵌套查找
2、ReDim语句可以重复申明,提取其申明的变量时需要同时记录顺序位置
3、变量可能出现在ReDim语句中,用来计算数组上下限,所以该句需要作为普通语句检查
4、ReDim申明的新变量,可能出现在后续的ReDim语句中用来计算上下限
...

总之,题目不限制的话,ReDim部分是非常消耗耐心的事!我严重怀疑楼主没有考虑这个问题~~

下面的代码取代我之前的附件中的RemoveBracketContent函数,可以提取含有()嵌套的ReDim语句申明的变量名,保留了oExp参数是避免更改原代码中引用该函数的部分。
[code=vb]
Function RemoveBracketContent$(ByVal sStr$, ByRef oExp As Object)
    '// REMOVED of REV 3
    'Dim bFlag As Boolean, sPattern$
    'With oExp
    '    bFlag = .Global: sPattern = .Pattern
    '    .Global = True
    '    .Pattern = "\(.*?\)"
    '    RemoveBracketContent = .Replace(sStr, "")
    '    .Global = bFlag: .Pattern = sPattern
    'End With
    '// NEW of REV 3
    Dim i&, nBrks&, sLet$, sRes$
    sRes = "": nBrks = 0
    For i = 1 To Len(sStr)
        sLet = Mid(sStr, i, 1)
        If sLet = "(" Then
            nBrks = nBrks + 1
        ElseIf sLet = ")" Then
            nBrks = nBrks - 1
        ElseIf nBrks = 0 Then
            sRes = sRes & sLet
        End If
    Next
    RemoveBracketContent = sRes
End Function
[/code]

TA的精华主题

TA的得分主题

发表于 2013-9-2 22:08 | 显示全部楼层
看到清风版主回了一个贴,不会是打算开贴吧?不过状态还是“仅作者可见”,赶紧再修改下:

试做竞赛题_wcymiss2.rar (15.5 KB, 下载次数: 39)

调整了一下整理的顺序:先去引号,再整理换行,再去注释,再整理多行。(原来是先整理换行,再整理多行,再去引号,再去注释,漏了“引号内文本包含冒号”的情况。)

点评

按本附件进行的测评  发表于 2013-10-15 11:52

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-2 09:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
因近段时间较忙,本题竞赛时间延长到本月底~~~
正则表达式应该是最好也方便的实现方法,看看还有没有其它的实现方法。{:soso_e113:}

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-8-15 12:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wcymiss 于 2013-8-16 22:34 编辑

vba语法还不大熟,不晓得考虑得周全不:

试做竞赛题_wcymiss.rar (16.26 KB, 下载次数: 50)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-9-30 20:01 | 显示全部楼层
点击工作表“安装”按钮 或 执行过程“InstallVBEMenu” 在VBE编辑的快捷菜单中添加“查找过程冗余变量”命令,即可使用。
Excel 2003 测试通过,适用于 汉字或其他特殊字符变量。
详见附件。

RedundantVar-JSXjd.rar

50.84 KB, 下载次数: 47

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-1 19:55 | 显示全部楼层
jsxjd 发表于 2013-9-30 20:01
点击工作表“安装”按钮 或 执行过程“InstallVBEMenu” 在VBE编辑的快捷菜单中添加“查找过程冗余变量”命 ...

您在哪看到可以不管ReDim的?

TA的精华主题

TA的得分主题

发表于 2013-10-1 20:30 | 显示全部楼层
lee1892 发表于 2013-10-1 19:55
您在哪看到可以不管ReDim的?

说的是 不写 Dim 直接写 Redim ?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 14:59 , Processed in 0.045279 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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