ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-2 23:12 | 显示全部楼层
感谢几位的热情参与,正如Lee1892童鞋在3楼所提出的这种情况,之前的确没有考虑到。还有代码后面的注释也不容易判断,是正则表达式不能完成的任务;越来越觉得这个课题真的不容易完成,但是我相信几位的代码针于个人的代码书写习惯应该都是可以实现。{:soso_e179:}
感慨一下:有一个标准的书写规范是多么重要啊!

TA的精华主题

TA的得分主题

发表于 2013-10-3 16:04 | 显示全部楼层
确实版主的题目有一定难度,需要考虑的方面比较多。
续行
两类注释(' 、Rem)
两类标签(纯数字的、后面带冒号的)
字符串常量
汉字等特殊字符变量
Redim 定义的变量和使用的变量

点评

因不能在同一贴子中多次评分,再本题加1分。  发表于 2013-10-11 12:16

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-3 20:36 | 显示全部楼层
lee1892 发表于 2013-8-5 16:32
写得贼啰嗦,本来是为了应付普遍检查的~~

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

分离此类变量可以通过判断括号是否成对出现来定位一个变量。以下针对该字符串实现的代码。

Sub GetRedimVar()

    Dim sStr As String
    sStr = "Redim arr(UBound(Array(1, 2)), UBound(Array(2, 3))), brr(UBound(Array(1, 2)), UBound(Array(2, 4)))"
    sStr = Mid(sStr, 7, Len(sStr))
    sStr = Replace(sStr, ", ", "")
    GetRedimV sStr

End Sub

Function GetRedimV(s As String)
    Dim k As Long, cnt As Long, i As Long
    k = InStr(1, s, "(")
    If k > 0 Then Debug.Print Mid(s, 1, k - 1)
    cnt = 1
    For i = k + 1 To Len(s)
        If Mid(s, i, 1) = "(" Then
            cnt = cnt + 1
        ElseIf Mid(s, i, 1) = ")" Then
            cnt = cnt - 1
        End If
        If cnt = 0 Then
            GetRedimV Mid(s, i + 1, Len(s))
            Exit Function
        End If
    Next
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-3 23:46 | 显示全部楼层
本帖最后由 清风_ll 于 2013-10-3 23:47 编辑

没仔细看Lee1892帖中的代码,基本相同。{:soso_e106:}

TA的精华主题

TA的得分主题

发表于 2013-10-11 12:29 | 显示全部楼层
清风_ll 发表于 2013-10-3 20:36
分离此类变量可以通过判断括号是否成对出现来定位一个变量。以下针对该字符串实现的代码。

Sub GetRed ...
  1. Sub GetRedimVar_2() '保留数组声明的原始定义
  2.     Dim sStr As String
  3.     sStr = "Redim crr(1,2,3),arr(UBound(Array(1, 2)), UBound(Array(Array(Array(2, 3), 3), 3))), brr(UBound(Array(1, 2)), UBound(Array(2, 4)))"
  4.     For Each s In Split(GetRedimV_2(sStr), "|")
  5.         Debug.Print s
  6.     Next
  7. End Sub

  8. Function GetRedimV_2(s As String) As String
  9.     s = Trim(Mid(Trim(s), 7))
  10.     For i = 1 To Len(s)
  11.         c = Mid(s, i, 1)
  12.         If VarNameStart = 0 Then
  13.             If c <> "," And c <> " " Then
  14.                 VarNameStart = i
  15.                 i = InStr(i, s, "(")
  16.                 ParenthesesNumber = 1
  17.             End If
  18.         Else
  19.             ParenthesesNumber = ParenthesesNumber + IIf(c = "(", 1, IIf(c = ")", -1, 0))
  20.             If ParenthesesNumber = 0 Then
  21.                 GetRedimV_2 = GetRedimV_2 & "|" & Mid(s, VarNameStart, i - VarNameStart + 1)
  22.                 VarNameStart = 0
  23.             End If
  24.         End If
  25.     Next
  26.     If Len(GetRedimV_2) > 0 Then GetRedimV_2 = Right(GetRedimV_2, Len(GetRedimV_2) - 1)
  27. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-13 23:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
因为这段时间忙得焦头烂额,所以这个题目一拖再拖,实在抱歉得很。抽空简单总结一下。
1、测评结果:
测评结果.JPG

2、存在问题:
几位参赛者都存在的一个问题是,检验变量是否已使用都在所有代码中查找,而不是在定义以后的代码中查找,这样在以下情况下有缺陷。

Sub Test1()
    Dim a$, s
    a = Left(s, k - 1)
    Dim k As Long
    ReDim arrCommentsPos(lngStart To lngEnd, 1)
        
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-14 00:14 | 显示全部楼层
清风_ll 发表于 2013-10-13 23:08
因为这段时间忙得焦头烂额,所以这个题目一拖再拖,实在抱歉得很。抽空简单总结一下。
1、测评结果:

嗯,看来记录行号是有用处的,呵呵。

原本你出题全面查的时候就开始写了,所以上来就先构造了一堆自定义的数据类型,改题后就顺着写了。

数据组织好对理清思路还是很有帮助的,扩展功能、修订问题、调试代码等,相对也容易很多。

另外感觉正则表达式写相对容易,一旦长的话要读懂含义可真不容易~

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-14 00:25 | 显示全部楼层
本帖最后由 清风_ll 于 2013-10-14 00:34 编辑


我的作业,有些发现的问题只能以后再完善了。
检查冗余变量.rar (23.91 KB, 下载次数: 19)

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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