EXCEL VBA 下面这段代码怎么简化,初学者求教

For k = 2 To 2000
If Cells(k, 1) = "" Then
For j = 1 To 4
Cells(k, j) = Cells(3, j + 8)
Next
Exit For
End If
Next
For k = 2 To 2000
If Cells(k, 1) = "" Then
For j = 1 To 4
Cells(k, j) = Cells(4, j + 8)
Next
Exit For
End If
Next
For k = 2 To 2000
If Cells(k, 1) = "" Then
For j = 1 To 4
Cells(k, j) = Cells(5, j + 8)
Next
Exit For
End If
Next
For k = 2 To 2000
If Cells(k, 1) = "" Then
For j = 1 To 4
Cells(k, j) = Cells(6, j + 8)
Next
Exit For
End If
Next

如图,k=3代表I列数据开始的行号,

rng为单元格变量,

For Each 循环会让rng每次代表A3:A2000中的一个单元格,

如果rng单元格的值为空值时,则提取数值过去,并同时k进行累加1

假如k始终没达到>6的条件,则会一直遍历到A2000为止,

假如k达到>6的条件时,则会直接跳出for,提前结束循环。

代码如下:

Sub 宏宏()

    Dim rng As Range, k& '声明rng为单元格对象,k为loog型

    k = 3 '给k赋一个初值

    For Each rng In Range("A3:A2000") '遍历该区域每个单元格

        If rng = "" Then '如果rng单元格的值为空值

            rng.Resize(1, 4) = Range("I" & k).Resize(1, 4).Value

            'rng重选1行4列 = Range("I" & k)重选1行4列的值

            k = k + 1 '累加

            If k > 6 Then Exit For '满足此条件则跳出for

        End If

    Next

    MsgBox "处理完毕", 64 '弹出提醒对话框

End Sub

追问

如果循环的3-6行的9-12列和填充的不在同一个工作表,怎么写呢,谢谢!

追答

在这两处单元格(或区域)的前面指明工作表,即可。

工作表名有三种写法:

打开工作簿打开后,下左下方咱们可以重命名的,是工作表的小名。

工作表的大名是一成不变的,在VBA编辑器的左侧栏中可以看到。

在VBA编辑器的左侧栏中,每张表显示两个名字,没打括号的是大名,打了括号的是小名,就是你可以自由重命名的那个名字。

工作表的大名的写法:

Sheet1.Range("A1")

工作表的小名的写法:

Sheets("明细表").Range("A1")

这里Sheets是带s的,表示工作表的集合中,名字叫"明细表"的那张表,括号中的小名必须用文本表示。

另外,工作表名还有第三种写法,即顺序名:

Sheets(1).Range("A1")

这句表示工作表的集合中,顺序排在第1张的表。

Sheets(Sheets.Cuont).Range("A1")

这句表示工作表的集合中,顺序排在最后1张的表。

Sheets.Cuont是工作表集合中的表的数量,表示一个数字。

括号中必须是一个数字,或者是一个表示数字的变量。

例如:在每一张表的A1写入888

for i = 1 to Sheets.Cuont

Sheets(i).Range("A1")=888

Next

人还在吗?我感觉你这个问题,不应该遍历A3:A2000,这样浪费时间,而是应该遍历3至6

如果你的A列是依次向下逐行写入数据,可以重新写代码。

Sub 宏宏2()
Dim i%, irow& '声明i为Integer型,irow为Loog型
irow = Sheet1.Range("A" & Rows.Count).End(3).Row + 1 '获取Sheet1的A列最大行号并+1
If irow "" Then '如果Sheet2的I格不是空值
Sheet1.Range("A" & irow).Resize(1, 4) = Sheet2.Range("I" & i).Resize(1, 4).Value
irow = irow + 1 '每提取一行数据以后,就给irow累加上1
End If
Next
MsgBox "处理完毕", 64 '弹出提醒对话框
End Sub

前边那段代码能浪费运算时间,需要遍历3至2000
虽然有跳出for的机制,但如果数据接近2000行时,就会用时间多
最后这段代码能节省大量运算时间,只需要遍历3至6

注意一下:最后给你的的代码,有一个等于号被系统过滤掉了,请以图片代码为准。

再补充说明一下:两段代码各有优势吧,第一段能把A列里间隔夹杂的空行找出来并写入数据。第二段代码是直接往A列的底部空行写入数据。

追问

收到,感谢大神细心指点!

温馨提示:答案为网友推荐,仅供参考
相似回答