Réinitialiser la variable de plage dans la boucle VBA entraîne une erreur 424

Donc, je sais que j'ai posé une question très similaire hier, c'est en fait le même code. Une ancienne question peut être trouvée ici.

Son 99% est complet, mais il y a une erreur d'exécution dans la boucle qui l'entraîne. Ce que je ne comprends pas, c'est qu'il court une fois, fait tout ce qu'il faut pour, puis réinitialiser la variable variable YTD l'entraîne à YTD.Formula = YTDs. Code ci-dessous.

Sub offset(rows1 As Long) Dim sh As Worksheet 'Integers Dim i As Long Dim k As Long 'Movers Dim current As Range Dim first As Range 'Mesortingcs Dim QTRA As Range Dim YTD As Range Dim yr1 As Range Dim yr3 As Range Dim yr7 As Range Dim yr5 As Range Dim yr10 As Range Dim SI As Range Dim QTR As Range Dim YTD_2 As Range Dim yr1_2 As Range Dim yr3_2 As Range Dim yr5_2 As Range Dim yr7_2 As Range Dim yr10_2 As Range Dim SI_2 As Range 'Ssortingngs Dim QTRAs As Ssortingng Dim YTDs As Ssortingng Dim yr1s As Ssortingng Dim yr3s As Ssortingng Dim yr7s As Ssortingng Dim yr5s As Ssortingng Dim yr10s As Ssortingng Dim SIs As Ssortingng Dim QTRs As Ssortingng Dim YTD_2s As Ssortingng Dim yr1_2s As Ssortingng Dim yr3_2s As Ssortingng Dim yr5_2s As Ssortingng Dim yr7_2s As Ssortingng Dim yr10_2s As Ssortingng Dim SI_2s As Ssortingng 'Puts in the mesortingc names on the top row. Can be adjusted for 2nd row if need be Sheets("Comparative Performance1").Range("T1").Formula = "YTD" Sheets("Comparative Performance1").Range("U1").Formula = "yr1" Sheets("Comparative Performance1").Range("V1").Formula = "yr3" Sheets("Comparative Performance1").Range("W1").Formula = "yr5" Sheets("Comparative Performance1").Range("Y1").Formula = "yr7" Sheets("Comparative Performance1").Range("X1").Formula = "yr10" Sheets("Comparative Performance1").Range("Z1").Formula = "SI" Sheets("Comparative Performance1").Range("AA1").Formula = "QTR" Sheets("Comparative Performance1").Range("AB1").Formula = "YTD_2" Sheets("Comparative Performance1").Range("AC1").Formula = "yr1" Sheets("Comparative Performance1").Range("AD1").Formula = "yr3" Sheets("Comparative Performance1").Range("AE1").Formula = "yr5" Sheets("Comparative Performance1").Range("AF1").Formula = "yr7" Sheets("Comparative Performance1").Range("AG1").Formula = "yr10" Sheets("Comparative Performance1").Range("AH1").Formula = "SI" 'Finds the length of the data 'Dim rn As Range 'Set sh = ThisWorkbook.Sheets("Comparative Performance1") 'Set rn = sh.UsedRange 'k = rn.Rows.Count + rn.Row - 1 k = rows1 For i = 3 To k 'Setting vari ables for each respective data column Set current = Sheets("Comparative Performance1").Range("J" & i) Set first = Sheets("Comparative Performance1").Range("B" & i) Set QTRA = Sheets("Comparative Performance1").Range("S" & i) Set YTD = Sheets("Comparative Performance1").Range("T" & i) Set yr1 = Sheets("Comparative Performance1").Range("U" & i) Set yr3 = Sheets("Comparative Performance1").Range("V" & i) Set yr5 = Sheets("Comparative Performance1").Range("W" & i) Set yr7 = Sheets("Comparative Performance1").Range("Y" & i) Set yr10 = Sheets("Comparative Performance1").Range("X" & i) Set SI = Sheets("Comparative Performance1").Range("Z" & i) Set QTR = Sheets("Comparative Performance1").Range("AA" & i) Set YTD_2 = Sheets("Comparative Performance1").Range("AB" & i) Set yr1_2 = Sheets("Comparative Performance1").Range("AC" & i) Set yr3_2 = Sheets("Comparative Performance1").Range("AD" & i) Set yr5_2 = Sheets("Comparative Performance1").Range("AE" & i) Set yr7_2 = Sheets("Comparative Performance1").Range("AF" & i) Set yr10_2 = Sheets("Comparative Performance1").Range("AG" & i) Set SI_2 = Sheets("Comparative Performance1").Range("AH" & i) 'Moves the benchmarks if it is missing a creation date If current = "" Then Range(first, current).Select Selection.Copy Range(first, current).offset(-1, 9).Select ActiveSheet.Paste 'I have it deleting the entire row, which may remove necessary data, not sure yet rows(i).EntireRow.Delete End If 'First we have to create ssortingngs for all of the formulas using the variable i YTDs = "=C" + CStr(i) + "-L" + CStr(i) yr1s = "=D" + CStr(i) + "-M" + CStr(i) yr3s = "=E" + CStr(i) + "-N" + CStr(i) yr5s = "=F" + CStr(i) + "-O" + CStr(i) yr7s = "=G" + CStr(i) + "-P" + CStr(i) yr10s = "=H" + CStr(i) + "-Q" + CStr(i) SIs = "=I" + CStr(i) + "-R" + CStr(i) QTRs = "=S" + CStr(i) + "/B" + CStr(i) YTD_2s = "=S" + CStr(i) + "/B" + CStr(i) yr1_2s = "=U" + CStr(i) + "/D" + CStr(i) yr3_2s = "=V" + CStr(i) + "/E" + CStr(i) yr5_2s = "=W" + CStr(i) + "/F" + CStr(i) yr7_2s = "=X" + CStr(i) + "/G" + CStr(i) yr10_2s = "=Y" + CStr(i) + "/H" + CStr(i) SI_2s = "=Z" + CStr(i) + "/I" + CStr(i) 'This should assign all of the mesortingcs using the correct variables YTD.Formula = YTDs ********** THIS IS WHERE IT FAILS ************ yr1.Formula = yr1s yr3.Formula = yr3s yr5.Formula = yr5s yr7.Formula = yr7s yr10.Formula = yr10s SI.Formula = SIs QTR.Formula = QTRs YTD_2.Formula = YTD_2s yr1_2.Formula = yr1_2s yr3_2.Formula = yr3_2s yr5_2.Formula = yr5_2s yr7_2.Formula = yr7_2s yr10_2.Formula = yr10_2s SI_2.Formula = SI_2s Next i End Sub 

Je pense que votre problème pourrait être dans votre déclaration If sur la ligne qui indique les Rows(i).entirerow.delete . Vous supprimez essentiellement la Row(i) avec la plage atsortingbuée à YTD qui est égale à la Range("T"& i ) . Vous devez soit

  1. Supprimez la ligne avant d'atsortingbuer des valeurs à vos variables

  2. Ajoutez ce qui suit après avoir supprimé la ligne:

    i=i-1 'cela va refaire la ligne que vous avez supprimée

    Next i , cela vous ramènera au sumt du look.

  3. Effectuez une gestion des erreurs qui vous renvoie au sumt après avoir frappé cette erreur.

Vous rencontrerez des problèmes si vous supprimez des lignes dans une instruction FOR qui augmente sur chaque passe car vous finissez par des anomalies en ligne.

Le code suivant peut vous être utile …

 Sub Offset(Optional rows1 As Long) Dim sh As Worksheet: Set sh = Sheets("Comparative Performance1") Dim HeaderRow As Long: HeaderRow = 1 Dim LastRow As Long: LastRow = sh.Cells.Find("*", _ SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row If rows1 > HeaderRow Then LastRow = rows1 Dim i As Long, k As Long, Counter As Long: Counter = 0 With sh 'Puts in the mesortingc names on the top row. Can be adjusted for 2nd row if need be Dim Headers() As Ssortingng: Headers = _ Split("YTD,yr1,yr3,yr5,yr7,yr10,SI,QTR,YTD_2,yr1,yr3,yr5,yr7,yr10,SI", ",") For i = 0 To UBound(Headers) .Cells(HeaderRow, 20 + i) = Headers(i) 'Starts at Col T Next i For i = LastRow To HeaderRow + 2 Step -1 If .Cells(i, 10).Value = "" Then .Range(.Cells(i, 2), .Cells(i, 10)).Copy .Range(.Cells(i, 2), .Cells(i, 10)).Offset(-1, 9).PasteSpecial xlPasteValues .Rows(i).EntireRow.Delete Counter = Counter + 1 End If Next i For i = HeaderRow + 2 To LastRow - Counter For k = 1 To 7 'Mesortingcs on YTD to SI .Cells(i, k + 19).FormulaR1C1 = "=RC[-17]-RC[-8]" .Cells(i, k + 27).FormulaR1C1 = "=RC[-8]/RC[-25]" Next k .Cells(i, 27).FormulaR1C1 = "=RC[-8]/RC[-25]" 'Mesortingc on QTR Next i End With End Sub 

Oh – Je suppose également que vous avez une erreur avec la ligne suivante:

 YTD_2s = "=S" + CStr(i) + "/B" + CStr(i) 

Où je devine qu'il devrait être:

 YTD_2s = "=T" + CStr(i) + "/C" + CStr(i)