Excel精英培训网

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

[已解决]代码解析?

[复制链接]
发表于 2013-5-25 20:28 | 显示全部楼层 |阅读模式
本帖最后由 hahada 于 2013-5-25 21:38 编辑

代码解析,最好详细点?
Sub aaa()
Application.ScreenUpdating = False
    Dim r&, arr() As String, m As Long
    For r = 5 To Range("G65536").End(3).Row
        If Cells(r, "M") <> "" Then
            Cells(r, "P") = "(" & Cells(r, "G") & "/" & Cells(r, "H") & "*" & Cells(r, "I") & ")" & Cells(r, "M")
            m = m + 1
            ReDim Preserve arr(1 To m)
            arr(m) = Cells(r, "P").Value
         End If
    Next
    Workbooks.Open Filename:=ThisWorkbook.Path & "\B.xls"
    Range("F8") = Join(arr, ",")
Application.ScreenUpdating = True
End Sub
最佳答案
2013-5-25 21:07
hahada 发表于 2013-5-25 21:02
这个m是不是指累加的行数?

不是行数,是符合条件的单元格的个数。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-5-25 20:49 | 显示全部楼层
  1. Sub aaa()
  2.     '关闭屏幕更新
  3.     Application.ScreenUpdating = False
  4.     Dim r&, arr() As String, m As Long
  5.     '从5行开始循环,一直到G列行最后一行数据所在的行号
  6.     For r = 5 To Range("G65536").End(3).Row
  7.         'M列R行是否为空
  8.         If Cells(r, "M") <> "" Then
  9.             'P列R行赋值 (G列R行 / H列R行 * I列R行)& M列R行
  10.             Cells(r, "P") = "(" & Cells(r, "G") & "/" & Cells(r, "H") & "*" & Cells(r, "I") & ")" & Cells(r, "M")
  11.             m = m + 1
  12.             '动态数组,扩维
  13.             ReDim Preserve arr(1 To m)
  14.             'P列值存入数组
  15.             arr(m) = Cells(r, "P").Value
  16.         End If
  17.     Next
  18.    
  19.     '打开工作簿B.XLS
  20.     Workbooks.Open Filename:=ThisWorkbook.Path & "\B.xls"
  21.    
  22.     '把生成的数组元素转换成用“,”连接的字符写主F8
  23.     '这里有BUG,万一数组没有数据需要考虑
  24.     Range("F8") = Join(arr, ",")
  25.    
  26.     '打开屏幕更新
  27.     Application.ScreenUpdating = True
  28. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-5-25 20:51 | 显示全部楼层
hwc2ycy 发表于 2013-5-25 20:49

m=m+1是怎么循环的?
回复

使用道具 举报

发表于 2013-5-25 20:57 | 显示全部楼层
If Cells(r, "M") <> "" Then
如果M列R行内容不为空
M=M+1,这是自加的运算,M的初值为0,
m=m+1后,m的值就是1
然后再满种条件的时候就2,3,4,5,这样自动加1了。
回复

使用道具 举报

 楼主| 发表于 2013-5-25 21:02 | 显示全部楼层
hwc2ycy 发表于 2013-5-25 20:57
If Cells(r, "M")  "" Then
如果M列R行内容不为空
M=M+1,这是自加的运算,M的初值为0,

这个m是不是指累加的行数?
回复

使用道具 举报

发表于 2013-5-25 21:04 | 显示全部楼层
  1. Sub aaa()
  2. '关闭屏幕更新
  3.     Application.ScreenUpdating = False
  4.     Dim r&, arr() As String, m As Long
  5.     '从5行开始循环,一直到G列行最后一行数据所在的行号
  6.     For r = 5 To Range("G65536").End(3).Row
  7.         'M列R行是否为空
  8.         If Cells(r, "M") <> "" Then
  9.             'P列R行赋值 (G列R行 / H列R行 * I列R行)& M列R行
  10.             Cells(r, "P") = "(" & Cells(r, "G") & "/" & Cells(r, "H") & "*" & Cells(r, "I") & ")" & Cells(r, "M")
  11.             m = m + 1
  12.             '动态数组,扩维
  13.             ReDim Preserve arr(1 To m)
  14.             'P列值存入数组
  15.             arr(m) = Cells(r, "P").Value
  16.             Debug.Print "m:" & m
  17.         End If
  18.     Next

  19.     '打开工作簿B.XLS
  20.     Workbooks.Open Filename:=ThisWorkbook.Path & "\B.xls"

  21.     '把生成的数组元素转换成用“,”连接的字符写主F8
  22.     '这里有BUG,万一数组没有数据需要考虑
  23.     Range("F8") = Join(arr, ",")

  24.     '打开屏幕更新
  25.     Application.ScreenUpdating = True
  26. End Sub
复制代码
你看立即窗口输出的M值。
回复

使用道具 举报

发表于 2013-5-25 21:07 | 显示全部楼层    本楼为最佳答案   
hahada 发表于 2013-5-25 21:02
这个m是不是指累加的行数?

不是行数,是符合条件的单元格的个数。
回复

使用道具 举报

 楼主| 发表于 2013-5-25 21:39 | 显示全部楼层
hwc2ycy 发表于 2013-5-25 21:07
不是行数,是符合条件的单元格的个数。

ReDim Preserve arr(1 To m)
这里有个Preserve是什么,为什么要重新定义数组?

回复

使用道具 举报

 楼主| 发表于 2013-5-25 21:55 | 显示全部楼层
hwc2ycy 发表于 2013-5-25 20:49

你说这里有BUG,万一数组没有数据需要考虑
应该怎么写?

回复

使用道具 举报

发表于 2013-5-25 22:32 | 显示全部楼层
判断M是否大于0
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 02:50 , Processed in 0.424268 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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