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 Sub

Voici le fichier :

10budget4.xlsm (41.63 Ko)

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 Sub

Bonjour 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 Sub

et :

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 Sub

Le fichier :

11joseph-v01.xlsm (44.19 Ko)

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 Sub

Bonsoir 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

6joseph-v02.xlsm (56.88 Ko)

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

Rechercher des sujets similaires à "erreur execution"