Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1975|回复: 1

[已解决]求助vba80集数组代码解释

[复制链接]
发表于 2012-9-4 10:07 | 显示全部楼层 |阅读模式
  1. Sub 数组方法()
  2. Dim arr, t
  3. Dim x As Integer
  4. Dim sr As String, sr1 As String
  5. 清除颜色
  6. t = Timer
  7. arr = Range("d2:d" & Range("a65536").End(xlUp).Row)
  8. For x = 1 To UBound(arr)
  9.    If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3
  10.    If arr(x, 1) > 500 Then
  11.       sr1 = sr
  12.       sr = sr & "A" & x + 1 & ":D" & x + 1 & ","
  13.       If Len(sr) > 255 Then
  14.         sr = sr1
  15.         Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3
  16.         sr = ""
  17.       End If
  18.    End If
  19. Next x
  20. MsgBox Timer - t
  21. End Sub
复制代码
求代码解释,特别是  if len(sr)>255 then, 255到底是什么意思,看视频没有听懂,求解释
最佳答案
2012-9-4 19:36
本帖最后由 zjdh 于 2012-9-4 19:53 编辑

宏的原意是将D列数据大于500的行A-D列底色改为红色,但是你的宏bug不少!
1.  If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3
     应该放在 Next x 之前,否则将遗漏对最后一个符合条件数据的处理!
2.  if len(sr)>255 then  意思是字符串长度大于255时作一次处理,也可改成100、200....
     range() 括弧内只能允许255个字符串,一旦字符串长度大于255,就将字符串退回到前一次记录,将记录的区域设置为
     红色,但未处理本次记录 ,这次记录就丢失了!

不信你运行附件可得到验证(注意:45、89、117、150行)

应将宏改为:
Sub 数组方法2()   '新宏
    Dim arr, t
    Dim x As Integer
    Dim sr As String, sr1 As String
    清除颜色
    t = Timer     '开始时间
    arr = Range("d2:d" & Range("a65536").End(xlUp).Row)   ‘数组赋值
    For x = 1 To UBound(arr)            '循环逐个处理
        If arr(x, 1) > 500 Then
            sr1 = sr         '暂存以前的记录
            sr = sr & "A" & x + 1 & ":D" & x + 1 & ","    '记录符合条件的区域(逐次添加)
            If Len(sr) > 255 Then
                sr = sr1       '退回到上次记录
                Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3     '字符串去除尾部逗号,作为多区域,设置底色
                sr = "A" & x + 1 & ":D" & x + 1 & ","       '记录本次符合条件的区域
            End If
        End If
        If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3   
                 
'当处理到最后一个数据时对记录的区域作处理
    Next x
    MsgBox Timer - t    ’统计显示运行时间
End Sub

Book3.rar (9.8 KB, 下载次数: 1)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-9-4 19:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zjdh 于 2012-9-4 19:53 编辑

宏的原意是将D列数据大于500的行A-D列底色改为红色,但是你的宏bug不少!
1.  If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3
     应该放在 Next x 之前,否则将遗漏对最后一个符合条件数据的处理!
2.  if len(sr)>255 then  意思是字符串长度大于255时作一次处理,也可改成100、200....
     range() 括弧内只能允许255个字符串,一旦字符串长度大于255,就将字符串退回到前一次记录,将记录的区域设置为
     红色,但未处理本次记录 ,这次记录就丢失了!

不信你运行附件可得到验证(注意:45、89、117、150行)

应将宏改为:
Sub 数组方法2()   '新宏
    Dim arr, t
    Dim x As Integer
    Dim sr As String, sr1 As String
    清除颜色
    t = Timer     '开始时间
    arr = Range("d2:d" & Range("a65536").End(xlUp).Row)   ‘数组赋值
    For x = 1 To UBound(arr)            '循环逐个处理
        If arr(x, 1) > 500 Then
            sr1 = sr         '暂存以前的记录
            sr = sr & "A" & x + 1 & ":D" & x + 1 & ","    '记录符合条件的区域(逐次添加)
            If Len(sr) > 255 Then
                sr = sr1       '退回到上次记录
                Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3     '字符串去除尾部逗号,作为多区域,设置底色
                sr = "A" & x + 1 & ":D" & x + 1 & ","       '记录本次符合条件的区域
            End If
        End If
        If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3   
                 
'当处理到最后一个数据时对记录的区域作处理
    Next x
    MsgBox Timer - t    ’统计显示运行时间
End Sub

Book3.rar (9.8 KB, 下载次数: 1)
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 08:14 , Processed in 0.680125 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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