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

  • Initiateur de la discussion Initiateur de la discussion PBeaudet
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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!
 
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

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.
 
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

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

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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
45
Réponses
3
Affichages
442
Réponses
0
Affichages
367
Réponses
3
Affichages
485
Réponses
9
Affichages
833
Retour