2016-11-11 1 views
0

J'ai une instruction If qui s'exécute lors du changement d'une cellule. Cette partie fonctionne bien. Cependant, quand il exécute la macro, pour une raison quelconque, il ajoute environ 40 lignes supplémentaires. J'ai utilisé le point d'arrêt et j'ai découvert que les lignes sont ajoutées après le collage spécial. Quelqu'un peut-il me dire pourquoi?Exécution d'une macro sur le changement d'adresse cible

Merci d'avance.

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address = "$AG$4" Then 

Call CapEx_Copy_Paste_Delete 

End If 

End Sub 

Sub CapEx_Copy_Paste_Delete() 
' 
' CapEx_Copy_Paste_Delete Macro 
' 

' 
    Rows("11:11").Select 

    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
    Range("B4:AG4").Select 
    Selection.Copy 
    Range("B11").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Range("AG4").Select 
    Selection.ClearContents 
    Range("B4:E4").Select 
    Selection.ClearContents 
    Range("H4:I4").Select 
    Selection.ClearContents 
    Range("L4:M4").Select 
    Selection.ClearContents 
    Range("P4:Q4").Select 
    Selection.ClearContents 
    Range("T4:U4").Select 
    Selection.ClearContents 
    Range("X4:Y4").Select 
    Selection.ClearContents 
    Range("Z4").Select 
    Selection.ClearContents 
    Range("AA4").Select 
    Selection.ClearContents 
    Range("AC4").Select 
    Selection.ClearContents 
    Range("AD4").Select 
    Selection.ClearContents 
    Range("B4").Select 
End Sub 
+0

non apparentés , mais n'utilisez pas 'Select' pour ce genre de chose. Appelez 'Range (" AG4 "). ClearContents'. – jsheeran

+0

Également sans rapport, mais vous pouvez combiner des plages telles que 'Range (" AG4 "," B4: E4 "," H4: I4 "). ClearContents' ect –

+0

@TimWilkinson, je ne pouvais pas faire fonctionner ça ...' Wrong nombre d'arguments ou affectation de propriété non valide – CallumDA

Répondre

3

Est-ce que ce travail mieux ??:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$AG$4" Then 
     Application.EnableEvents = False 
      Call CapEx_Copy_Paste_Delete 
     Application.EnableEvents = True 
    End If 
End Sub 
2

Voici la version plus propre de votre code. Il est probable que tout ce que l'utilisation de Select n'aide pas vos problèmes:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$AG$4" Then 
     Application.EnableEvents = False 
      Call CapEx_Copy_Paste_Delete 
     Application.EnableEvents = True 
    End If 
End Sub 

Sub CapEx_Copy_Paste_Delete() 
    Dim ws As Worksheet 
    Dim arrRanges As Variant, v As Variant 

    'set this as the worksheet you want to update 
    Set ws = ThisWorkbook.Worksheets("Sheet1") 

    'set this as the ranges you want to clear 
    arrRanges = Array("AG4", "B4:E4", "H4:I4", "L4:M4", "P4:Q4", "T4:U4", "X4:Y4", "Z4") 

    With ws 
     .Rows("11:11").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 

     .Range("B4:AG4").Copy 
     .Range("B11").PasteSpecial Paste:=xlPasteValues 

     For Each v In arrRanges 
      .Range(v).ClearContents 
     Next v 
    End With 
End Sub 


Mise à jour pour inclure la suggestion de Gary étudiant - tout le crédit lui va pour suggérer de désactiver les événements dans votre premier sous