2016-04-20 1 views
0

J'ai un code que je connais fonctionne, j'applique une formule SUMIF à une gamme de cellules. Ca marche mais ça ajoute une charge de rang supplémentaire en bas qui ne devrait pas être là. J'ai essayé d'ajouter une boucle "do" jusqu'à ce qu'elle se bloque dans une boucle infinie et se bloque.Appliquer la formule à une gamme de cellules

Ceci est mon premier lot de code qui fonctionne mais ajoute la ligne supplémentaire uniquement sur les colonnes qui ont été copiées.

Dim z As Workbook 'Budget Workbook 
    Dim y As Workbook 'Formatted - current workbook 
    Dim lastRow As Integer 
    Dim budgLastRow As Integer 
    Dim rng As Range 

    Set y = Workbooks("DLT.xlsm") 
    Set z = Workbooks.Open("C:\Reports\Budget.xlsx") 

'Apply function to columns to pull costing data 
    With y.Worksheets("DLT") 
     lastRow = Cells(Rows.Count, 5).End(xlUp).Row 

      For Each rng In .Range("AI22:AI" & lastRow) 
       rng.Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E" & rng.Row & ",'[Budget.xlsx]DynamicReport'!H:H)" 
       rng.Value = rng.Value 
      Next rng 

      For Each rng In .Range("AJ22:AJ" & lastRow) 
       rng.Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E" & rng.Row & ",'[Budget.xlsx]DynamicReport'!I:I)" 
       rng.Value = rng.Value 
      Next rng 

      For Each rng In .Range("AN22:AN" & lastRow) 
       rng.Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E" & rng.Row & ",'[Budget.xlsx]DynamicReport'!E:E)" 
       rng.Value = rng.Value 
      Next rng 

      For Each rng In .Range("AO22:AO" & lastRow) 
       rng.Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E" & rng.Row & ",'[Budget.xlsx]DynamicReport'!G:G)" 
       rng.Value = rng.Value 
      Next rng 

    End With 

Je pense que les autres lignes supplémentaires ont été copiés parce que le classeur budgétaire contient plus de données, puis le livre de travail formaté. Je sais avoir pensé à supprimer éventuellement l'autre rangée inutile qui ont été copiés croisés.

J'ai donc ajouté ce petit morceau de code dans

With y.Worksheets("Formatted") 
     lastRow = Cells(Rows.Count, 5).End(xlUp).Row - 1 
     budgLastRow = Cells(Rows.Count, 35).End(xlUp).Row 
     Rows("AI" & lastRow & ":AO" & budgLastRow).EntireRow.Delete 
    End With 

Je reçois une erreur définie par l'application objet erreur définie sur la ligne

Rows("AI" & lastRow & ":AO" & budgLastRow).EntireRow.Delete 

Ceci est probablement pas la façon la plus efficace de faites ceci, mais c'est la seule façon dont je pourrais penser. Je suis assez nouveau à VBA codant seulement quelques mois donc la plupart du temps juste essayer différentes façons et voir ce qui fonctionne. Quelqu'un peut-il m'aider s'il-vous-plaît.

Répondre

0

Vous n'y étiez pas admissible correctement les plages de la variable lastRow:

lastRow = .Cells(.Rows.Count, 5).End(xlUp).Row 

Notez les points avant Cells et Rows.

Un couple de points supplémentaires:

Toujours utiliser Long plutôt que Integer pour les variables de ligne comme il y a plus de lignes dans une feuille d'un nombre entier pouvant contenir.

Vous n'avez pas besoin de boucler pour mettre la même formule dans une colonne de cellules.

Dim z      As Workbook 'Budget Workbook 
Dim y      As Workbook 'Formatted - current workbook 
Dim lastRow    As Long 
Dim budgLastRow   As Long 

Set y = Workbooks("DLT.xlsm") 
Set z = Workbooks.Open("C:\Reports\Budget.xlsx") 

'Apply function to columns to pull costing data 
With y.Worksheets("DLT") 
    lastRow = .Cells(.Rows.Count, 5).End(xlUp).Row 

    With .Range("AI22:AJ" & lastRow) 
     .Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E22,'[Budget.xlsx]DynamicReport'!H:H)" 
     .Value2 = .Value2 
    End With 

    With .Range("AN22:AN" & lastRow) 
     .Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E22,'[Budget.xlsx]DynamicReport'!E:E)" 
     .Value2 = .Value2 
    End With 

    With .Range("AO22:AO" & lastRow) 
     .Formula = "=SUMIF('[Budget.xlsx]DynamicReport'!$C:$C,$E22,'[Budget.xlsx]DynamicReport'!G:G)" 
     .Value2 = .Value2 
    End With 

End With 
+0

merci, je n'ai même pas remarqué cela. Ça fonctionne maintenant – user3088476