Cette Worksheet_Change fonctionne sous 2003, et plante sous 2010

Victor21

XLDnaute Barbatruc
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 :mad:
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

  • test2011 xld.xls
    70.5 KB · Affichages: 93
Dernière édition:
C

Compte Supprimé 979

Guest
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+
 

mth

XLDnaute Barbatruc
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:

repcheks

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

Victor21

XLDnaute Barbatruc
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é:p

Merci, Bruno, et au plaisir de te croiser à nouveau.
:)
 
C

Compte Supprimé 979

Guest
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+
 

Victor21

XLDnaute Barbatruc
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 :p
 
C

Compte Supprimé 979

Guest
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+
 

hbenalia

XLDnaute Occasionnel
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:

Victor21

XLDnaute Barbatruc
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 :)
 

MJ13

XLDnaute Barbatruc
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
 

hbenalia

XLDnaute Occasionnel
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
 

Victor21

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

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 443
Membres
103 211
dernier inscrit
pierrecharbs