Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…