受累帮我解释一下这段excel的vba代码吧,谢谢您了,越详细越好,用//在每行后面写吧,再次谢谢,

Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j&
Application.ScreenUpdating = False
Sheet1.Activate
Myr = [f65536].End(xlUp).Row
Arr = Range("a1:q" & Myr)
For i = 2 To UBound(Arr)
If Arr(i, 2) <> "" Then
r = r + 1
ReDim Preserve Arr1(1 To r)
Arr1(r) = i
End If
Next
For i = r To 1 Step -1
If i <> r Then
js = Arr1(i + 1) - 1
Else
js = UBound(Arr)
End If
ks = Arr1(i)
If Arr(js, 4) = "小计" Then
Cells(ks + 1, 1).Resize(js - ks, 3).Delete shift:=xlUp
Cells(ks, 4).Resize(js - ks, 8).Delete shift:=xlUp
End If
Next
Application.ScreenUpdating = True

Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j& '声明变量
Application.ScreenUpdating = False '关闭屏幕更新
Sheet1.Activate '激活sheet1表为活动表
Myr = [f65536].End(xlUp).Row '记录当前表里数据区域最末行的行号至Myr
Arr = Range("a1:q" & Myr) '将数据区A1:Q(Myr)赋给变量Arr,Q的行号有Myr确定
For i = 2 To UBound(Arr) '循环 UBound(Arr)去arr数组最大下标,因为省略参数,默认是第一维,可以理解为区域的行数, 循环条件是i 从2步进到这个最大小标数
If Arr(i, 2) <> "" Then '判断B列的当前行的单元格是否为空
r = r + 1 '非空则r计数加1
ReDim Preserve Arr1(1 To r) '重定义Arr1数组维数,并保护之前的数组信息
Arr1(r) = i '将该行行号至数组arr1
End If
Next '这个循环也就是说会记录B列有非空单元格的行号至数组arr1中
For i = r To 1 Step -1 '循环,条件是i= r到1,按1递减
If i <> r Then
js = Arr1(i + 1) - 1 '非初始循环时,i都是小于r的,都会执行这条语句将,其目的是记录上一个B列非空单元格的行号
Else
js = UBound(Arr) '初始循环时i=r,会执行这条语句,将arr第一维下标最大值 赋给js,其实就是记录arr这个range区域的行数
End If
ks = Arr1(i) '将arr1第i数组数赋给ks,目的是在循环中将B列的每个非空单元格的行号赋给ks
If Arr(js, 4) = "小计" Then '如果B列空单元所对应行与E列交叉单元格是“小计”
Cells(ks + 1, 1).Resize(js - ks, 3).Delete shift:=xlUp '判断条件成立则删除对应的区域,(此代码可能有问题哦),目的应该是清除小计之前的明细区域
Cells(ks, 4).Resize(js - ks, 8).Delete shift:=xlUp '此行也是删除区域的代码,(可能有问题分析下来)
End If
Next
Application.ScreenUpdating = True 开启屏幕更新
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-15
Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j&
'停止屏幕更新,用来加快执行速度
Application.ScreenUpdating = False
'激活SHEET1工作表
Sheet1.Activate
'找到当前工作表的最后一行
Myr = [f65536].End(xlUp).Row
从A1开始到Q列最后一行整个范围
Arr = Range("a1:q" & Myr)
'从第二行开始遍历上面范围
For i = 2 To UBound(Arr)
'如果第二列不是空字符串的话则将单元格中的值放入到数组中
If Arr(i, 2) <> "" Then
'用来计数
r = r + 1
'动态扩大数组元素个数
ReDim Preserve Arr1(1 To r)
'数组元素将行数存储起来
Arr1(r) = i
End If
Next
'从后往前遍历数组
For i = r To 1 Step -1
'判断是否是最后一个元素,是的话则用最后下标,否则取当前上一个元素的行号
If i <> r Then
js = Arr1(i + 1) - 1
Else
js = UBound(Arr)
End If
ks = Arr1(i)
'如果是小计,则将小计计算的上面范围清除掉,同时清除空值
If Arr(js, 4) = "小计" Then
Cells(ks + 1, 1).Resize(js - ks, 3).Delete shift:=xlUp
Cells(ks, 4).Resize(js - ks, 8).Delete shift:=xlUp
End If
Next
'重新显示屏幕更新,之前作的操作开始显示
Application.ScreenUpdating = True
第2个回答  2012-05-15
Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j& '//定义变量
Application.ScreenUpdating = False '//关闭屏幕更新,这个可以提高程序的运行速度。。。程序中间过程不显示,直到最后出结果
Sheet1.Activate '//让sheet1处于当前工作表
Myr = [f65536].End(xlUp).Row '//将F列最后一个非空单元格的行数值赋值给myr
Arr = Range("a1:q" & Myr) '//将单元格区间a1到f列最后一行这个区间的值赋值给数组arr,这个也是相应的提高程序的运行速度。如果这个区间非常大。速度提高的越明显、。
For i = 2 To UBound(Arr) '//循环i从2到UBound(Arr),ubound(arr)就等于myr的值,相当于从第二排循环到最后一排。。(不知道说明白没有),你有基础应该很容易看懂。
If Arr(i, 2) <> "" Then '//相当于第i排,第二列的值如果不为空。则执行下面的代码。
r = r + 1 '//这个是计数。计算第i排,第二列有多少个空值。
ReDim Preserve Arr1(1 To r) '//重新定义数组arr1,数组里面的下标为从1到r,以前的数组值不变
Arr1(r) = i '//赋值给多出来的那个数组为i,其实就是记录第二列哪些排的值为空,把记录的值放在arr1里面
End If
Next
For i = r To 1 Step -1 '//循环,从r到1,依次递减1这样循环
If i <> r Then '//判断是不是第一个,不是第一个则执行下面一句,是第一个跳到else
js = Arr1(i + 1) - 1 '//js里面放的值为上面往到的排数的上一排
Else
js = UBound(Arr) '//第1个值为arr有多少排
End If
ks = Arr1(i) '//ks等于arr(i)
If Arr(js, 4) = "小计" Then '//arr(js,4)相当于第4列第js排里面的值(js为第二列为空的排数的上一排)等于小计的话就往下执行
Cells(ks + 1, 1).Resize(js - ks, 3).Delete shift:=xlUp '//相当于如果第二列的值为空,则第一列相应的排数向右扩展为3列向下扩展js-ks排,然后删掉这些单元格,下面的单元格往上移动。
Cells(ks, 4).Resize(js - ks, 8).Delete shift:=xlUp '//相当于相应的排数的第4列值向右扩展为8列,向下扩展js-ks排,同样删掉
End If
Next
Application.ScreenUpdating = True '//打开屏幕更新
相似回答