ContextePourquoi cette boucle ne traite-t-elle pas l'ensemble de données complet?
J'ai une feuille de calcul des allocations de tickets pour un événement. Sur chaque ligne de la feuille de calcul se trouve un nom et le nombre de tickets alloués.
je dois changer la feuille de calcul afin que chaque nom est reproduit une fois par billet sur les lignes séparées, comme ceci:
J'ai une macro pour ce faire, mais il présente un comportement étrange
Le problème
La macro ne parcourt pas tout l'ensemble de données. En parcourant le code montre que, malgré délibérément augmenter la valeur de LastRow
, la boucle For ne boucle que pour plusieurs fois la valeur d'origine spécifiée. La nouvelle valeur de LastRow
à la fin de chaque itération semble être ignorée.
Cela semble particulièrement étrange que l'équivalent Do While fonctionne en boucle fine (Voir ci-dessous pour le code de travail en utilisant une boucle Do While)
La question
Pourquoi le comportement décrit dans la section problème (voir ci-dessus) et pourquoi est-ce incompatible avec des structures équivalentes?
La boucle For Macro
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
La boucle Do While Macro
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
Comme je le soupçonnais, même si c'est encore étrange que ce n'est pas cohérent à travers différentes constructions de boucle – chrisbunney