【发布时间】:2011-03-07 23:10:38
【问题描述】:
背景
我有一个活动门票分配的电子表格。电子表格的每一行都有一个名称和分配的票数。
我需要更改电子表格,以便每个票的每个名称在不同的行上重复一次,如下所示:
我有一个宏来执行此操作,但它表现出奇怪的行为
问题
宏不会循环遍历整个数据集。单步执行代码表明,尽管故意增加了 LastRow 的值,但 For 循环仅循环指定原始值的多少倍。每次迭代结束时LastRow 的新值似乎被忽略了。
这似乎特别奇怪,因为等效的 Do While 循环可以正常工作(请参阅下面的使用 Do While 循环的工作代码)
问题
为什么会出现问题部分(上文)中描述的行为,为什么它与等效结构不一致?
For 循环宏
Sub InsertSurnames()
Dim LastRow As Long
Dim r As Long
Dim surname As String
Dim tickets As Integer
Dim surnameCol As Integer
Dim ticketCol As Integer
Dim targetCol As Integer
surnameCol = 1
ticketCol = 3
targetCol = 4
LastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
For r = 1 To LastRow
surname = Cells(r, surnameCol).Value
tickets = Cells(r, ticketCol).Value
If (Not (Len(surname) = 0)) Then
Cells(r, targetCol).Value = surname
For x = 1 To tickets - 1
Cells(r + x, 1).EntireRow.Insert
Cells(r + x, targetCol).Value = surname
Next x
LastRow = LastRow + tickets - 1
End If
Next r
End Sub
Do While 循环宏
Sub InsertSurnames()
Dim LastRow As Long
Dim r As Long
Dim surname As String
Dim tickets As Integer
Dim surnameCol As Integer
Dim ticketCol As Integer
Dim targetCol As Integer
surnameCol = 1
ticketCol = 3
targetCol = 4
LastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
r = 1
Do While r <= LastRow
surname = Cells(r, surnameCol).Value
tickets = Cells(r, ticketCol).Value
If (Not (Len(surname) = 0)) Then
Cells(r, targetCol).Value = surname
For x = 1 To tickets - 1
Cells(r + x, 1).EntireRow.Insert
Cells(r + x, targetCol).Value = surname
Next x
LastRow = LastRow + tickets - 1
End If
r = r + 1
Loop
End Sub
【问题讨论】: