Excel精英培训网

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

[已解决]跪求大神給这段代码打个注释

[复制链接]
发表于 2017-7-3 19:57 | 显示全部楼层 |阅读模式
Sub lqxs()
Dim Arr, i&, j&, s$
Sheet1.Activate
Arr = [h4:an65536]
For i = 1 To UBound(Arr) - 2
    For j = 1 To UBound(Arr, 2) - 2
        If Arr(i, j) > 0 And Arr(i + 1, j + 1) > 0 And Arr(i + 2, j + 2) > 0 Then
            s = s & Cells(i + 3, j + 7).Address(0, 0) & "|" & Cells(i + 4, j + 8).Address(0, 0) & "|" & Cells(i + 5, j + 9).Address(0, 0) & vbCrLf
        End If
    Next
Next
MsgBox s

End Sub

这是一位老师提供的代码,求帮忙给个注释帮助理解,非常感谢!
还有如果s=s那行,如何改写成if条件成立赋值1else赋值0到一列单元格

最佳答案
2017-7-5 12:59
本帖最后由 大灰狼1976 于 2017-7-5 13:00 编辑

加注释方便理解。
  1. Sub lqxs()
  2. Dim Arr, brr, i&, j&, s$
  3. Arr = Range("h4:an" & [an65536].End(3).Row)  '将数据区域装入数组Arr
  4. ReDim brr(1 To UBound(Arr), 1 To 1)  '将数组brr调整至跟Arr数据行数一样,但仅有1列,不用一维数组的理由是不用转置
  5. For i = 1 To UBound(Arr) - 2         '从数组Arr第一行循环遍历至倒数第三行,不到最后一行的理由是确认倒数第三行时会同时判断下面两行
  6.     For j = 1 To UBound(Arr, 2) - 2    '从数组Arr第一列循环遍历至倒数第三列,不到最后一列的理由是确认倒数第三列时会同时判断后面两列
  7.         If Arr(i, j) > 0 And Arr(i + 1, j + 1) > 0 And Arr(i + 2, j + 2) > 0 Then brr(i + 2, 1) = 1: Exit For
  8.         '如果斜线排列的三个元素都大于0的话,就在brr数组相应行标记1,出现标记1之后,后面就没有判断的必要了,退出循环
  9.     Next
  10.     If brr(i + 2, 1) = "" Then brr(i + 2, 1) = 0   '如果一行循环结束后没有找到符合上述条件的组合,则在brr数组相应行填写0
  11. Next
  12. [ao4].Resize(UBound(brr)) = brr    '将brr数组输出至AO4为首的单元格区域(1列)
  13. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-7-3 20:55 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2017-7-3 23:31 | 显示全部楼层
本帖最后由 zyning 于 2017-7-3 23:33 编辑
chart888 发表于 2017-7-3 20:55
怎么个赋值
在哪边赋值呢

非常感谢,帮看一下附件,带花求解

弹窗版.rar

284.01 KB, 下载次数: 10

回复

使用道具 举报

发表于 2017-7-5 12:51 | 显示全部楼层
先解决第一个问题,假设输出在AO列,后面不同规则的处理,原理跟这个是一样的,最好你自己修改代码试试。
  1. Sub lqxs()
  2. Dim Arr, brr, i&, j&, s$
  3. Arr = Range("h4:an" & [an65536].End(3).Row)
  4. ReDim brr(1 To UBound(Arr), 1 To 1)
  5. For i = 1 To UBound(Arr) - 2
  6.     For j = 1 To UBound(Arr, 2) - 2
  7.         If Arr(i, j) > 0 And Arr(i + 1, j + 1) > 0 And Arr(i + 2, j + 2) > 0 Then brr(i + 2, 1) = 1: Exit For
  8.     Next
  9.     If brr(i + 2, 1) = "" Then brr(i + 2, 1) = 0
  10. Next
  11. [ao4].Resize(UBound(brr)) = brr
  12. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
zyning + 1 很给力

查看全部评分

回复

使用道具 举报

发表于 2017-7-5 12:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 大灰狼1976 于 2017-7-5 13:00 编辑

加注释方便理解。
  1. Sub lqxs()
  2. Dim Arr, brr, i&, j&, s$
  3. Arr = Range("h4:an" & [an65536].End(3).Row)  '将数据区域装入数组Arr
  4. ReDim brr(1 To UBound(Arr), 1 To 1)  '将数组brr调整至跟Arr数据行数一样,但仅有1列,不用一维数组的理由是不用转置
  5. For i = 1 To UBound(Arr) - 2         '从数组Arr第一行循环遍历至倒数第三行,不到最后一行的理由是确认倒数第三行时会同时判断下面两行
  6.     For j = 1 To UBound(Arr, 2) - 2    '从数组Arr第一列循环遍历至倒数第三列,不到最后一列的理由是确认倒数第三列时会同时判断后面两列
  7.         If Arr(i, j) > 0 And Arr(i + 1, j + 1) > 0 And Arr(i + 2, j + 2) > 0 Then brr(i + 2, 1) = 1: Exit For
  8.         '如果斜线排列的三个元素都大于0的话,就在brr数组相应行标记1,出现标记1之后,后面就没有判断的必要了,退出循环
  9.     Next
  10.     If brr(i + 2, 1) = "" Then brr(i + 2, 1) = 0   '如果一行循环结束后没有找到符合上述条件的组合,则在brr数组相应行填写0
  11. Next
  12. [ao4].Resize(UBound(brr)) = brr    '将brr数组输出至AO4为首的单元格区域(1列)
  13. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
zyning + 1 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-7-5 17:13 | 显示全部楼层

非常感谢,茅塞顿开,好厉害
回复

使用道具 举报

 楼主| 发表于 2017-7-5 17:21 | 显示全部楼层

只是花不知道为什么只能选一朵,想都送你这里,哈哈,要不你再随意回复下,我再加送
回复

使用道具 举报

 楼主| 发表于 2017-7-5 22:35 | 显示全部楼层
大灰狼1976 发表于 2017-7-5 12:51
先解决第一个问题,假设输出在AO列,后面不同规则的处理,原理跟这个是一样的,最好你自己修改代码试试。

您好,还要再请教一下,您指点的情况如果变成下面事例的第二种排列,代码该如何调整
1
2
3
1
2
3
非常感谢!!!
回复

使用道具 举报

 楼主| 发表于 2017-7-5 23:04 | 显示全部楼层
zyning 发表于 2017-7-5 22:35
您好,还要再请教一下,您指点的情况如果变成下面事例的第二种排列,代码该如何调整
非常感谢!!!

已解决,谢谢

评分

参与人数 1 +15 收起 理由
大灰狼1976 + 15 赞一个,新人能够举一反三,奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 15:43 , Processed in 0.549734 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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