Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

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 !

Victor21

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous !

L'un d'entre vous utilisant Excel 2010 pourrait-il tester la macro Worksheet_Change du fichier joint.
Chez moi, sous Excel 2003, elle fonctionne, mais l'utilisateur tourne avec Excel 2010 et me dit qu'elle plante lors du choix dans la zone D3:O40 😡
Ligne Target.value=Target value surlignée avec message :
Erreur d'exécution'-2147417848 (800 10 108)':
La méthode 'Value' de l'objet 'Range' a échoué.
Le code :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

   Dim Grade As String    ' Grade de l'agent
    Dim Off As Currency    ' Officiers
    Dim Sof As Currency    ' Sous/Officiers
    Dim Cap As Currency    ' Caporaux
    Dim Sap As Currency    ' Sapeurs

    ' Initialisation des variables et constantes
    Grade = Range("A" & Target.Row).Value    ' Valeur en colonne A
    Off = 11.2    ' Rémunération horaire des Officiers
    Sof = 9.03    ' Rémunération horaire des Sous-Officiers
    Cap = 8#    ' Rémunération horaire des Caporaux
    Sap = 7.45    ' Rémunération horaire des Sapeurs

    ' Permet de n'agir que sur la zone "Exercices"
    If Intersect(Target, Range("D3:O40")) Is Nothing Or Target.Count > 1 Then Exit Sub

    ' En fonction du choix dans la liste déroulante (1;2;3; Excusé; Absent)
    Select Case Target.Value
    ' Calcul du montant en fonction de la durée de présence et du grade
        Case 1 To 3
            If Grade = "LTN" _
               Then Target.Value = Round(Target.Value * Off / 2, 2)
            If Grade = "ADC" Or Grade = "ADJ" Or Grade = "SCH" Or Grade = "SGT" _
               Then Target.Value = Round(Target.Value * Sof / 2, 2)
            If Grade = "CCH" Or Grade = "CPL" _
               Then Target.Value = Round(Target.Value * Cap / 2, 2)
            If Grade = "SAP" Or Grade = "1CL" _
               Then Target.Value = Round(Target.Value * Sap / 2, 2)
    ' En cas d'absence
        Case Else
            Target.Value = Target.Value
    End Select
End Sub

D'avance, merci de bien vouloir tester (pour lui), et critiquer (pour moi)🙂

Complément : la division par 2, c'est parce que les exercices sont rémunérés à 50% du taux horaire.
 

Pièces jointes

Dernière édition:
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Salut Victor21,

Effectivement .... tu fais des modifications dans l'évènement Worksheet_Change()
Donc ça tourne en boucle ...

VB:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Grade As String    ' Grade de l'agent
  Dim Off As Currency    ' Officiers
  Dim Sof As Currency    ' Sous/Officiers
  Dim Cap As Currency    ' Caporaux
  Dim Sap As Currency    ' Sapeurs
' Initialisation des variables et constantes
  Grade = Range("A" & Target.Row).Value    ' Valeur en colonne A
  Off = 11.2    ' Rémunération horaire des Officiers
  Sof = 9.03    ' Rémunération horaire des Sous-Officiers
  Cap = 8#    ' Rémunération horaire des Caporaux
  Sap = 7.45    ' Rémunération horaire des Sapeurs
' Permet de n'agir que sur la zone "Exercices"
  If Intersect(Target, Range("D3:O40")) Is Nothing Or Target.Count > 1 Then Exit Sub
  ' Empècher les évènements, en cas de changement
  Application.EnableEvents = False
  ' En fonction du choix dans la liste déroulante (1;2;3; Excusé; Absent)
  Select Case Target.Value
    ' Calcul du montant en fonction de la durée de présence et du grade
  Case 1 To 3
    If Grade = "LTN" _
       Then Target.Value = Round(Target.Value * Off / 2, 2)
    If Grade = "ADC" Or Grade = "ADJ" Or Grade = "SCH" Or Grade = "SGT" _
       Then Target.Value = Round(Target.Value * Sof / 2, 2)
    If Grade = "CCH" Or Grade = "CPL" _
       Then Target.Value = Round(Target.Value * Cap / 2, 2)
    If Grade = "SAP" Or Grade = "1CL" _
       Then Target.Value = Round(Target.Value * Sap / 2, 2)
    ' En cas d'absence
  Case Else
    Target.Value = Target.Value
  End Select
  ' Activer les évènements
  Application.EnableEvents = True
End Sub

En revanche je ne comprends pas que cela puisse fonctionner sur 2003 !?

Attention, la prochaine fois ... c'est un blame 😉

A+
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonsoir Victor 🙂

Effectivement ça plante sous 2007.
Vu comme ça, comme il ne doit rien se passer si la valeur est différente de 1 2 ou 3, je me dit que l'on peut éliminer purement et simplement ces lignes là:
Code:
  ' En cas d'absence
        Case Else
            Target.Value = Target.Value

J'essaie de voir ce qui se passe, mais pas réussi pour l'instant car Excel se ferme (pour 2007) ...

@ + 🙂

m

Edit: Hello Bruno 🙂 🙂
Oui bien sûr tu as raison, message d'Excel avant fermeture ="Mémoire insufisante"
Bonne soirée à tous 🙂
m
 
Dernière édition:
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Le probleme est ici :

Code:
    Select Case Target.Value
    ' Calcul du montant en fonction de la durée de présence et du grade
        Case 1 To 3
            If Grade = "LTN" _
               Then Target.Value = Round(Target.Value * Off / 2, 2)
            If Grade = "ADC" Or Grade = "ADJ" Or Grade = "SCH" Or Grade = "SGT" _
               Then Target.Value = Round(Target.Value * Sof / 2, 2)
            If Grade = "CCH" Or Grade = "CPL" _
               Then Target.Value = Round(Target.Value * Cap / 2, 2)
            If Grade = "SAP" Or Grade = "1CL" _
               Then Target.Value = Round(Target.Value * Sap / 2, 2)
    ' En cas d'absence
        [B][U]Case Else
            Target.Value = Target.Value[/U][/B]
    End Select

Dans ton 'Case Else', donc dans le cas ou la valeur de la cellule changee ne correspond pas a une valeur prevue, tu lui reassignes sa propre valeur, tu declenches donc un evenement worksheet_change, qui refait la meme chose, et ainsi de suite... tu rentres dans une boucle infinie.

Peut etre que sous 2003 changer le target.value ne declenchait pas cet evenement ? en tout cas ca a bien fait planter mon 2010...
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonjour, Bruno.

' Empècher les évènements, en cas de changement
Application.EnableEvents = False
Je crois que je ne m'y ferai jamais...
Attention, la prochaine fois ... c'est un blame
Et au bout de 3 blames ? Dégradé ? M'en fous, suis pas gradé😛

Merci, Bruno, et au plaisir de te croiser à nouveau.
🙂
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Re,

Juste un petit coucou et un gros bisous à Mimi 😉

@Victor21,
Au bout de 3 tu ne pourras plus être maitre yoda ... c pas possible ... 🙂

A+
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Re,

Question subsidiaire, pour ne pas mourir complètement idiot, pourquoi, alors que CAP est déclaré en @ VBA rajoute-t'il le # dans :

@ Bruno :
Au bout de 3 tu ne pourras plus être maitre yoda ... c pas possible ...
Tant mieux, comme ça, CC ne pourra plus me mettre en boîte 😛
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Re,

[HS n'apporte rien à la discution]

Tiens ça me fait penser que j'ai jamais gouté à du squale en boite 😉
Ce n'est certainement pas aussi bon que fraichement tué ... 🙂

A+
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonjour à tous,

On remplaçe la ligne:
Code:
Target.Value = Target.Value
par :
Code:
Cells(Target.Row, Target.Column) = Cells(Target.Row, Target.Column)
dans le code...

Cordialement
 
Dernière édition:
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonsoir, Jean-Claude 🙂

Merci pour ta réponse 🙂
La question que je me pose, c'est justement pourquoi VBA modifie le type, déclaré au début en Currency de lui-même : Saisie "8", ou "8.00", et correction automatique "8#" alors que l'un et l'autre seront stockés, de toute manière sur 8 octets 🙂🙂🙂

C'est vrai que cela ne change rien, à priori, mais j'aimerais comprendre 🙂
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonjour à tous

Tu peux tester ce code (fait à la va vite, pas trop testé) 🙂:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    Dim Grade As String    ' Grade de l'agent
    Dim Off As Currency    ' Officiers
    Dim Sof As Currency    ' Sous/Officiers
    Dim Cap As Currency    'Caporaux
    Dim Sap As Currency    ' Sapeurs
    ' Initialisation des variables et constantes
    Grade = Range("A" & Target.Row).Value    ' Valeur en colonne A
    Off = 11.2    ' Rémunération horaire des Officiers
    Sof = 9.03    ' Rémunération horaire des Sous-Officiers
    Cap = 8#    ' Rémunération horaire des Caporaux
    Sap = 7.45    ' Rémunération horaire des Sapeurs

    ' Permet de n'agir que sur la zone "Exercices"
    If Intersect(Target, Range("D3:O40")) Is Nothing Or Target.Count > 1 Then raz 'Exit Sub
    ' En fonction du choix dans la liste déroulante (1;2;3; Excusé; Absent)
    Select Case Target.Value
    ' Calcul du montant en fonction de la durée de présence et du grade
        Case 1 To 3
            If Grade = "LTN" _
               Then Target.Value = Round(Target.Value * Off / 2, 2)
            If Grade = "ADC" Or Grade = "ADJ" Or Grade = "SCH" Or Grade = "SGT" _
               Then Target.Value = Round(Target.Value * Sof / 2, 2)
            If Grade = "CCH" Or Grade = "CPL" _
               Then Target.Value = Round(Target.Value * Cap / 2, 2)
            If Grade = "SAP" Or Grade = "1CL" _
               Then Target.Value = Round(Target.Value * Sap / 2, 2)
    ' En cas d'absence
        Case Else
        Stop
            Target.Value = CDbl(Target.Value)
    End Select
    raz
End Sub
Sub raz()
Application.EnableEvents = True
End Sub
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonjour à tous,

Apparement le remplacement de Target.value par Cells(target.row,target.column) ne donne pas une solution au problème... En revanche testes le code suivant:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Grade As String    ' Grade de l'agent
    Dim Off As Currency    ' Officiers
    Dim Sof As Currency    ' Sous/Officiers
    Dim Cap As Currency    'Caporaux
    Dim Sap As Currency    ' Sapeurs

    ' Initialisation des variables et constantes
    Grade = Range("A" & Target.Row).Value    ' Valeur en colonne A
    Off = 11.2    ' Rémunération horaire des Officiers
    Sof = 9.03    ' Rémunération horaire des Sous-Officiers
    Cap = 8#    ' Rémunération horaire des Caporaux
    Sap = 7.45    ' Rémunération horaire des Sapeurs


    ' Permet de n'agir que sur la zone "Exercices"
    If Intersect(Target, Range("D3:O40")) Is Nothing Or Target.Count > 1 Then Exit Sub

    ' En fonction du choix dans la liste déroulante (1;2;3; Excusé; Absent)
    Select Case Target.Value
    ' Calcul du montant en fonction de la durée de présence et du grade
        Case 1 To 3
            If Grade = "LTN" _
               Then Target.Value = Round(Target.Value * Off / 2, 2)
            If Grade = "ADC" Or Grade = "ADJ" Or Grade = "SCH" Or Grade = "SGT" _
               Then Target.Value = Round(Target.Value * Sof / 2, 2)
            If Grade = "CCH" Or Grade = "CPL" _
               Then Target.Value = Round(Target.Value * Cap / 2, 2)
            If Grade = "SAP" Or Grade = "1CL" _
               Then Target.Value = Round(Target.Value * Sap / 2, 2)
    ' En cas d'absence
        Case Else
            If (VarType(Target.Value)) = 8 Then GoTo 1
     End Select
1 End Sub
Cordialement
 
Re : Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Bonjour, hbenalia, Michel 🙂

Merci pour vos conseils 🙂🙂
Comme je le précisais au début, le code d'origine ne plante pas chez moi (Excel 2002 SP3).
J'ai ajouté "Application.EnableEvents" à False au début, et à true à la fin, et cela semble convenir à l'utilisateur.

La seule question restant en suspens étant pourquoi VBA convertit-il d'autorité la constante "SAP" de Currency en Double...
 
- 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
Microsoft 365 worksheet_change
Réponses
29
Affichages
490
Retour