Erreur d'exécution
Bonjour le forum,
J'ai une erreur dans le code ci-dessous pour laquelle je n'arrive pas à voir la raison.
J'ai sûrement oublié ou mal déclaré quelque chose.....
Dès que je change une valeur en colonne C, j'obtiens le message d'erreur suivant : La Méthode 'Range' de l'objet '_Worksheet' a échoué.
Si quelqu'un pouvait se pencher sur la question...
Private Sub RetourDecompte_Click()
Sheets("Décompte").Select
End Sub
Private Sub VoirDetail_Click()
Sheets("Budget1").Select
Sheets("Budget1").Range("A2").Select
End Sub
Private Sub VoirSynthese_Click()
Sheets("Budget2").Select
Sheets("Budget2").Range("A2").Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LRD As Long, LRC As Long
With Worksheets("Budget4")
LRD = Sheets("Budget4").Range("A65536").End(xlUp).Row
LRC = Sheets("Budget4").Range("F65536").End(xlUp).Row
If LRD >= LRC Then
If .Cells(LRD + 2, "H") - .Cells(LRD + 2, "C") >= 0 Then 'Crédit
.Range("G" & LRD + 5) = "Le budget présente un crédit de : "
.Range("F" & LRD + 5) = .Cells(LRD + 2, "H") - .Cells(LRD + 2, "C")
.Range("F" & LRD + 5).NumberFormat = "#,##0.00"
Else 'Débit
.Range("B" & LRD + 5) = "Le budget présente un débit de : "
.Range("C" & LRD + 5) = Abs(.Cells(LRD + 2, "H") - .Cells(LRD + 2, "C"))
.Range("C" & LRD + 5).NumberFormat = "#,##0.00"
End If
Else
If .Cells(LRC + 2, "H") - .Cells(LRC + 2, "C") >= 0 Then 'Crédit
.Range("G" & LRC + 5) = "Le budget présente un crédit de : "
.Range("F" & LRC + 5) = .Cells(LRC + 2, "H") - .Cells(LRC + 2, "C")
.Range("F" & LRC + 5).NumberFormat = "#,##0.00"
Else 'Débit
.Range("B" & LRC + 5) = "Le budget présente un débit de : "
.Range("C" & LRC + 5) = Abs(.Cells(LRC + 2, "H") - .Cells(LRC + 2, "C"))
.Range("C" & LRC + 5).NumberFormat = "#,##0.00"
End If
End If
End With
End SubVoici le fichier :
En vous remerciant pour votre aide
Cordialement
Joseph
Bonjour Joseph, bonjour le forum,
Ton code tourne en boucle puisque si tu changes une valeur en colonne C, le code modifie en colonne H ce qui relance la procédure Worksheet_Change... Mais comme je ne sais pas ce que tu veux de ta macro j'ai du mal à te proposer une solution.
Pour éviter ce genre de désagrément, je l'imite l'action de la procédure à la colonne C (par exemple) avec :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then Call Calcul
End SubBonjour TauThème, le forum,
Merci de ton aide.
En fait ce que j'essaye de faire c'est :
si il y a modification de C8 à C & LRD(LastRowDébit) dans l'exemple joint : C14
et/ou modification de F8 à F & LRC(LastRowCrédits) dans l'exemple joint : F20,
le programme inscrive soit en B26 "Le budget prévisionnel présente un débit de :" avec le total H22-C22 en C26 (toujours dans l'exemple)
soit en G26 "Le budget prévisionnel présente un crédit de :" avec le total H22-C22 en H26
Voilà, en espérant ne pas être trop confus dans mes explications...
Merci Joseph
Bonjour Joseph, bonjour le forum,
Je ne sais pas si ça va te convenir, mais je te propose d'afficher le résultat non plus en dessous du tableau mais au dessus.
j'ai modifié deux codes :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 9 Then Exit Sub
Select Case Target.Column
Case 3, 6
Module1.Calcul
End Select
End Subet :
Sub Calcul()
Dim CAL As Double
With Worksheets("Budget4")
.Unprotect ("ElPasoTx67110")
.Range("A6:J6").ClearContents
CAL = CDbl(.Range("PREV2").Value - .Range("PREV1").Value)
If CAL >= 0 Then 'Crédit
.Range("G6").Value = "Le budget présente un crédit de : "
.Range("H6").Value = CAL
.Range("H6").NumberFormat = "#,##0.00"
Else 'Débit
.Range("B6") = "Le budget présente un débit de : "
.Range("C6").Value = Abs(CAL)
.Range("C6").NumberFormat = "#,##0.00"
End If
.Protect Password:="ElPasoTx67110"
End With
End SubLe fichier :
Bonjour ThauThème, le forum,
Pas mal du tout.
En tout cas bien mieux que ce que j'essaye de faire avec If notIntersect is nothing...
Il faudrait en fait pourvoir modifier dans ce cas précis de C9 à C15 ET de H9 à H21.
Sachant que selon les rubriques présentes dans Budget4 il peut très bien qu'il faille calculer de C9 à C20 Et de H9 à H12, etc......
tout dépendant du nombre de rubriques en colonnes A et F.
C'est pour cela que je m'acharne avec mes LRD et LRC.
Dernière question, PREV1 et PREV2 ils viennent d'où ??
En tout cas mille (au moins) fois merci pour ton aide et le temps que tu me consacres.
Cordialement
Joseph
Bonsoir Joseph, bonsoir le forum,
Ben oui, suis-je bête ! J'ai oublié de te prévenir que j'avais nommé la cellule C22 : PREV1 et la cellule H22 : PREV2.
Du coup plus besoin d'utiliser tes LRD et LRC le code va fonctionner quel que soit le nombre de lignes puisqu'il fait référence à des plages nommées qui vont se décaler à l'ajout de nouvelles ligne...
Bonsoir ThauThème, le forum,
Et s'il n'y a par exemple que 7 rubriques en débit et en crédit, la somme se trouvera sur la ligne 17.
ca ne va pas poser un problème d'avoir nommé les cellules C22 et H22 ?
Joseph
Bonsoir Joseph, bonsoir le forum,
Si ta avais testé tu aurais vu que non. Le code ne fait plus référence à l'adresse de la cellule mais à un nom PREV1 ou PREV2, quelle que soit sa position.
Bonsoir ThauThème, le forum,
Bon, moi perso je m'y remets demain.
Je vais dormir sur mon problème, et peut-être que demain matin tout sera plus clair dans mon esprit.
En tout cas, merci pour tout, et à demain j'espère.
Bien cordialement
Joseph
Bonne nuit Joseph, à demain...
Bonsoir ThauThème,
J'avais testé (bon juste en supprimant des lignes)
Je pense tout simplement que c'est parce que je n'arrive pas à me le représenter.
Tout comme je ne vois pas dans ton code où il faut modifier pour pouvoir également changer les prévisions dans la colonne H des crédits...
Merci mille fois
A demain
Joseph
Bonsoir Joseph, bonsoir le forum,
Le code commenté pourra peut-être t'aider :
Sub Calcul()
Dim CAL As Double 'déclare la variable CAL (CALcul)
With Worksheets("Budget4") 'prend en compte l'onglet "Budget4"
.Unprotect ("ElPasoTx67110") 'déprotège l'onglet
.Range("A6:J6").ClearContents 'efface la plage A6:J6
CAL = CDbl(.Range("PREV2").Value - .Range("PREV1").Value) 'définit le calcul CAL
If CAL >= 0 Then 'condition : si CAL est supérieur ou égal à zéro (Crédit)
.Range("G6").Value = "Le budget présente un crédit de : " 'écrit en G6
.Range("H6").Value = CAL 'place le calcul CAL en H6
.Range("H6").NumberFormat = "#,##0.00" 'formate H6
Else 'sinon (Débit)
.Range("B6") = "Le budget présente un débit de : " 'écrit en B6
.Range("C6").Value = Abs(CAL) 'place en C6 la valeur abolue de CAL
.Range("C6").NumberFormat = "#,##0.00" 'formate C6
End If 'fin de la condition
.Protect Password:="ElPasoTx67110" 'protège l'onglet
End With 'fin de la prose en compte de l'onglet "Budget4"
End SubBonsoir ThauThème, le forum,
Merci pour l'explication de texte. Je suis toujours preneur.
Seulement, cette partie là je l'avais compris.
C'est cette histoire de PREV1 et de PREV2 que je n'arrive pas à assimiler.
Quant au fait que les cellules de la colonne H sont protégées, ça vient de moi.
Lors du remplissage de Budget4 à partir de Budget3, je n'ai pas déprotégé les cellules.
Voilà voilà.
Mais je pense que demain cela devrait aller mieux, parce que là, je suis dessus depuis hier après-midi et il n'y a plus rien qui rentre dans mon (petit) cerveau.
A demain et comme disait l'ours de mon enfance : Bonne nuit les petits!!!
Bonsoir le forum, ThauThème,
Juste un petit mot pour dire que je m'y suis remis aujourd'hui, en plaçant Budget4 dans l'application réelle.
Je n'avais pas trop le temps, aussi je n'ai pas trop avancé, mais je développerait tout cela demain et reviendrais vers vous à ce moment.
Merci encore
Joseph
Bonjour le forum,
J'ai enfin réussi à intégrer Budget4 dans l'application réelle.
Tout fonctionne correctement : copie des valeurs des colonnes de Budget3 vers Budget4, création des formules dans Budget4, mais (il parait qu'il y en a toujours un), si je veux protéger la feuille Budget4 dans le module 1, VBA plante.
J'ai préparé un fichier joint ci-dessous qui reprend la partie de la programmation qui rempli la feuille Budget4 à partir de la feuille Budget3. Il suffit d'exécuter CB1 puis de valider.
Dans la feuille Budget4 j'avais essayé de remplacer la sélection des colonnes par un If Not Intersect Is Nothing pour essayer de réduire les zones modifiables de la Feuille Budget4 aux cellules concernées (dans l'exemple C8 à C14 et H8 à H20) au lieu de la colonne C entière et de la colonne H entière; mais rien n'y fait.
Bon, dans l'absolu ce n'est pas la mort (heureusement), mais j'aurai de loin préféré pouvoir quand même protéger Budget4.
Me voilà donc un fois de plus en train de vous demander votre aide et un peu de votre temps.
Merci à tous et bonne après-midi
Joseph
Bonsoir le forum,
Je reviens sur ce post, parce que :
1) Il m'a suffit de déprotéger la feuille juste avant de modifier en colonne C et/ou en colonne H
2) Je n'avais pas mis "résolu", et ce n'est pas bien çà !!!
A bientôt
Joseph