La méthode value de l'objet range a échoué

PBeaudet

XLDnaute Nouveau
Bonjour à tous,

J'ai le code suivant :

Private Sub Worksheet_Change(ByVal Target As Range)


If Worksheets("Personnage").Cells(4, 22).Value = "Matelassée" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(3, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Cuir" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(4, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Cuir renforcé" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(5, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Cuir à plaques" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(6, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Écailles" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(7, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Mailles" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(8, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Plaques" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(9, 3).Value
End If

If Worksheets("Personnage").Cells(4, 22).Value = "Plaques renforcées" Then
Worksheets("Personnage").Cells(4, 24).Value = Worksheets("Équipements").Cells(10, 3).Value
End If

'If Worksheets("Personnage").Cells(4, 23).Value = "Légère" Then
' Worksheets("Personnage").Cells(4, 25).Value = Worksheets("Équipements").Cells(3, 4).Value
' Worksheets("Personnage").Cells(4, 26).Value = Worksheets("Équipements").Cells(3, 6).Value
' Worksheets("Personnage").Cells(4, 27).Value = Worksheets("Équipements").Cells(3, 7).Value
'End If

'If Worksheets("Personnage").Cells(6, 27).Value = "Rondache" Then
' Worksheets("Personnage").Cells(7, 27).Value = Worksheets("Équipements").Cells(3, 13).Value
'End If

End Sub


Le problème que j'ai c'est que dès que je met un des deux derniers IF en fonction en retirant les guillemets, j'ai de code d'erreur : la méthode value de l'objet range a échoué. Quand ils sont en commentaire, le code fonctionne correctement.

Je ne vois pas ce qu'il y a de différent qui fait que ça ne fonctionne pas.

Merci à vous!
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour PBeaudet, Job,
Votre sub Worksheet_Change est ré-entrante : elle est appelée quand vous modifiez votre feuille. Sub qui modifie cette même feuille donc qui rappelle la sub.
Il faut bloquer les events :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
....
Application.EnableEvents = True
End Sub
En PJ une maquette qui fonctionne avec tous les IF.
D'autre part vous pouvez simplifier ces IF avec des Cases, ce sera plus rapide.
 

Pièces jointes

  • Classeur111.xlsm
    21.9 KB · Affichages: 10

job75

XLDnaute Barbatruc
Votre macro évènementielle va donc boucler sans fin si les tests If renvoient True.

Il faut donc en début de macro ajouter :
VB:
Application.EnableEvents = False
Et en fin de macro :
VB:
Application.EnableEvents = True
J'avais donné au départ ces informations mais j'ai préféré faire d'abord la demande du post #3.

Salut sylvanu.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re le fil,
Les Case et With simplifie la lecture et accélère le processus. en PJ avec le code.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
With Worksheets("Personnage")
    Select Case .Cells(4, 22)
        Case "Matelassée"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(3, 3).Value
        Case "Cuir"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(4, 3).Value
        Case "Cuir renforcé"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(5, 3).Value
        Case "Cuir à plaques"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(6, 3).Value
        Case "Écailles"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(7, 3).Value
        Case "Mailles"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(8, 3).Value
        Case "Plaques"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(9, 3).Value
        Case "Plaques renforcées"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(10, 3).Value
    End Select
    If .Cells(4, 23).Value = "Légère" Then
        .Cells(4, 25).Value = Worksheets("Équipements").Cells(3, 4).Value
        .Cells(4, 26).Value = Worksheets("Équipements").Cells(3, 6).Value
        .Cells(4, 27).Value = Worksheets("Équipements").Cells(3, 7).Value
    End If
    If .Cells(6, 27).Value = "Rondache" Then
        .Cells(7, 27).Value = Worksheets("Équipements").Cells(3, 13).Value
    End If
End With
Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Classeur111 (V2).xlsm
    19.8 KB · Affichages: 8

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re le fil,
A l'examen de votre macro vous exécutez toute la macro à chaque fois qu'une valeurs change dans la feuille.
Or seules les cellules V4,W4 et AA6 sont concernées.
Alors autant n'effectués les calculs que si une de ces trois cellules a été modifiée.
On y gagne en temps.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
With Worksheets("Personnage")
If Target.Address = "$V$4" Then
    Select Case Target.Value
        Case "Matelassée"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(3, 3).Value
        Case "Cuir"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(4, 3).Value
        Case "Cuir renforcé"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(5, 3).Value
        Case "Cuir à plaques"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(6, 3).Value
        Case "Écailles"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(7, 3).Value
        Case "Mailles"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(8, 3).Value
        Case "Plaques"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(9, 3).Value
        Case "Plaques renforcées"
            .Cells(4, 24).Value = Worksheets("Équipements").Cells(10, 3).Value
    End Select
End If
If Target.Address = "$W$4" Then
    If Target.Value = "Légère" Then
        .Cells(4, 25).Value = Worksheets("Équipements").Cells(3, 4).Value
        .Cells(4, 26).Value = Worksheets("Équipements").Cells(3, 6).Value
        .Cells(4, 27).Value = Worksheets("Équipements").Cells(3, 7).Value
    End If
End If
If Target.Address = "$AA$6" Then
    .Cells(7, 27).Value = Worksheets("Équipements").Cells(3, 13).Value
End If
End With
Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Classeur111 (V3).xlsm
    21.3 KB · Affichages: 7

job75

XLDnaute Barbatruc
Avec des Arrays c'est nettement plus simple :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Variant
i = Application.Match(Cells(4, 22), Array("Matelassée", "Cuir", "Cuir renforcé", "Cuir à plaques", "Écailles", "Mailles", "Plaques", "Plaques renforcées"), 0)
Application.EnableEvents = False
With Sheets("Équipements")
    If IsNumeric(i) Then Cells(4, 24) = .Cells(i + 3, 3)
    If Cells(4, 23) = "Légère" Then Cells(4, 25).Resize(, 3) = Array(.Cells(3, 4), .Cells(3, 6), .Cells(3, 7))
    If Cells(6, 27) = "Rondache" Then Cells(7, 27) = .Cells(3, 13)
End With
Application.EnableEvents = True
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 628
Messages
2 111 341
Membres
111 107
dernier inscrit
cdel