XL 2010 Suivi Budget Worksheet_Change Tableau Structuré

cp4

XLDnaute Barbatruc
Bonjour,
Je voudrais effectuer un suivi de budget en VBA et j'avoue que je ne maîtrise pas assez le Target (il me déroute).
Je m'explique: soit un tableau vide au départ, la première première somme saisie en crédit se retrouvera en solde (solde de départ).
Pour les lignes suivantes, le solde sera le solde de ligne du dessus + ou - suivant la colonne considérée (crédit ou débit).
Précision le débit sera saisi sans le signe (-) moins.

En vous remerciant par avance.
Bonne journée.
 

Pièces jointes

  • Suivi Budget.xlsm
    10.5 KB · Affichages: 21
E

eugene92

Guest
Bonjour,
Vous souhaitez créer un tableur de budget en VBA, s'il s'agit d'un projet d'auto formation aux macros, c'est une bonne idée. S'il s'agit seulement de faire un tableau simple et pratique de ses recettes et dépenses, le langage VBA n'est pas absolument indispensable, les fonctions classiques d'Excel sont bien suffisantes...
Bon courage,
Cordialement.
 

cp4

XLDnaute Barbatruc
Bonjour,
Vous souhaitez créer un tableur de budget en VBA, s'il s'agit d'un projet d'auto formation aux macros, c'est une bonne idée. S'il s'agit seulement de faire un tableau simple et pratique de ses recettes et dépenses, le langage VBA n'est pas absolument indispensable, les fonctions classiques d'Excel sont bien suffisantes...
Bon courage,
Cordialement.
Bonjour Eugene92 ;),
Merci pour ton retour. Personnellement, à chaque fois que j'ouvre une discussion c'est soit pour apprendre, soit je bloque pour aider quelqu'un.
Présentement, Je voudrai apprendre à "dompter" o_O un peu ce foutu Target (j'ai consulté l'aide: Il représente les cellules de la feuille). Ce n'est pas encore clair dans ma petite tête, pour son utilisation.

Merci. Bonne journée.
 
E

eugene92

Guest
Juste pour rire un peu ! Ça marche chez moi, pas sûr que ça marche chez vous...
 

Pièces jointes

  • test forum xls.xls
    38 KB · Affichages: 10
Dernière modification par un modérateur:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @cp4,

J'ai du mal à comprendre la question.
Selon moi, la formule suivante en D5 suffit largement : =SOMME(B5;-C5;D4)

Le premier solde est en général un report : celui du mois précédent et il figure souvent sur la première ligne avec neutralisation de la saisie pour cette première ligne. Certains le mettent carrément hors du tableau de saisie dans une cellule au dessus du tableau.
 

cp4

XLDnaute Barbatruc
Bonjour @cp4,

J'ai du mal à comprendre la question.
Selon moi, la formule suivante en D5 suffit largement :
=SOMME(B5;-C5;D4)
Bonjour Mapomme ;),

Merci de t'intéresser à mon post.
En fait, je voudrais qu'à chaque fois que je rajoute une ligne le solde se mette à jour dans un premier temps en utilisant l'évènement "Worksheet_Change".
Une fois que j'aurai bien compris le code, j'envisage de l'adapter pour utiliser les propriétés et/ou méthodes des tableaux structurés.
Mon fichier exemple n'a qu'une finalité, essayer d'apprendre un peu plus.

Encore merci.
 

cp4

XLDnaute Barbatruc
Je pense avoir trouvé. Merci de corriger mes erreurs.
VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim dl As Long, Ligne As Long
   dl = Range("Tableau1").ListObject.ListRows.Count
   Ligne = IIf(dl = 1, 5, Range("a" & Rows.Count).End(xlUp).Row)

   If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
      '      On Error Resume Next
      Application.EnableEvents = False
      If IsNumeric(Target) = True Then
         If Target.Column = 2 And Ligne = 5 Then
            Target.Offset(, 1) = ""
            Target.Offset(, 2) = Target
         ElseIf Target.Column = 2 Then
            Target.Offset(, 2) = Target.Offset(-1, 2) + Target
         ElseIf Target.Column = 3 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(, 1) = Target.Offset(-1, 1) - Target
         End If
      End If
   End If
   Application.EnableEvents = True
End Sub
 

dysorthographie

XLDnaute Accro
Bonsoir,
Juste une précision, le target ne représente pas une cellule mais une plage de cellules.

Un plage de cellules commence à une cellule, deux, trois,etc...

Si par exemple j'écris
Code:
Range("A1:A10")=10
alors le target de l'évènement change aura la plage "A1:A10"
Cette notion est très importante car ça genaire des erreurs si on ne prévoit pas une boucle sur le traget!
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @cp4 , @dysorthographie , le Forum

J'ai testé ton dernier code sur ton classeur... Déjà il faudrai gérer la première ligne de saisie, sinon BOUM :

1589645153979.png


Il va essayé d'additionner "Solde" de la ligne précédente...

Proposition de correction : (Comme tu avais fait au début pour Culumn2)

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim dl As Long, Ligne As Long
   dl = Range("Tableau1").ListObject.ListRows.Count
   Ligne = IIf(dl = 1, 5, Range("a" & Rows.Count).End(xlUp).Row)

   If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
      '      On Error Resume Next
      Application.EnableEvents = False
      If IsNumeric(Target) = True Then
         If Target.Column = 2 And Ligne = 5 Then
            Target.Offset(, 1) = ""
            Target.Offset(, 2) = Target
         ElseIf Target.Column = 2 Then
            Target.Offset(, 2) = Target.Offset(-1, 2) + Target
         ElseIf Target.Column = 3 And Target.Row <> 5 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(0, 1) = Target.Offset(-1, 1) - Target
         ElseIf Target.Column = 3 And Target.Row = 5 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(0, 1) = Target.Offset(0, -1) - Target

         End If
      End If
   End If
   Application.EnableEvents = True
End Sub

Bonne soirée
@+Thierry
 

cp4

XLDnaute Barbatruc
Bonjour @cp4 , @dysorthographie , le Forum

J'ai testé ton dernier code sur ton classeur... Déjà il faudrai gérer la première ligne de saisie, sinon BOUM :

Regarde la pièce jointe 1067364

Il va essayé d'additionner "Solde" de la ligne précédente...

Proposition de correction : (Comme tu avais fait au début pour Culumn2)

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim dl As Long, Ligne As Long
   dl = Range("Tableau1").ListObject.ListRows.Count
   Ligne = IIf(dl = 1, 5, Range("a" & Rows.Count).End(xlUp).Row)

   If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
      '      On Error Resume Next
      Application.EnableEvents = False
      If IsNumeric(Target) = True Then
         If Target.Column = 2 And Ligne = 5 Then
            Target.Offset(, 1) = ""
            Target.Offset(, 2) = Target
         ElseIf Target.Column = 2 Then
            Target.Offset(, 2) = Target.Offset(-1, 2) + Target
         ElseIf Target.Column = 3 And Target.Row <> 5 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(0, 1) = Target.Offset(-1, 1) - Target
         ElseIf Target.Column = 3 And Target.Row = 5 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(0, 1) = Target.Offset(0, -1) - Target

         End If
      End If
   End If
   Application.EnableEvents = True
End Sub

Bonne soirée
@+Thierry
Merci beaucoup Thierry, très gentil de ta part. Mais il y a quelque chose qui m'échappe.
Au départ, lorsque le tableau est vide, on ne peut insérer qu'un crédit et donc je l'ai géré avec ce bout de code
VB:
If Target.Column = 2 And Ligne = 5 Then
            Target.Offset(, 1) = ""
            Target.Offset(, 2) = Target
Tu penses que ce n'est pas suffisant? Je n'ai pas encore testé ta modification. Je reviendrai aux nouvelles.
Cependant, une question comment pourrait-on modifier cette ligne de code en utilisant les propriétés d'un tableau structuré. J'ai une idée mais j'ai des doutes.
Code:
 If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
Encore merci.

edit: tu as raison mon code plante si on saisie un débit sur la première ligne. Le tien ne plante pas. Mais je voudrais justement empêcher la saisie d'un débit en première ligne. Il faut absolument un crédit pour avoir un solde de départ représentant le budget.
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
VB:
If Target.Column = 2 And Ligne = 5 Then
Target.Offset(, 1) = ""
Target.Offset(, 2) = Target
Tu penses que ce n'est pas suffisant?

C'est suffisant pour Column = 2, mais le bug venait de ElseIf Target.Column = 3...

Pour :
Cependant, une question comment pourrait-on modifier cette ligne de code en utilisant les propriétés d'un tableau structuré. J'ai une idée mais j'ai des doutes. Code:
If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then

Ben actuellement celà fonctionne est c'est bien une Table Tableau1...
Maintenant tu pourrais être plus précis, car on peut saisir n'importe où entre B5:C1000 et l'évenement se déclenche

VB:
   If Not Intersect(Target, Union(Range("B5:B" & Range("A1000").End(xlUp).Row), Range("C5:C" & Range("A1000").End(xlUp).Row))) Is Nothing Then

Bien évidemment si A contient toujours une date...

Ceci dit, pour les Objets Tables , il doit sûrement (je pense) y avoir une méthode spécifique, mais je ne l'ai jamais utilisée...

@+Thierry
 

cp4

XLDnaute Barbatruc
Merci, j'ai trouvé la solution
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim dl As Long, Ligne As Long
   dl = Range("Tableau1").ListObject.ListRows.Count
   Ligne = IIf(dl = 1, 5, Range("a" & Rows.Count).End(xlUp).Row)
   'Stop
   If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
      '      On Error Resume Next
      Application.EnableEvents = False
      If IsNumeric(Target) = True Then
         If Target.Column = 2 And Ligne = 5 Then
            Target.Offset(, 1) = ""
            Target.Offset(, 2) = Target
         ElseIf Target.Column = 2 Then
            Target.Offset(, 2) = Target.Offset(-1, 2) + Target
         ElseIf Target.Column = 3 And Target.Row <> 5 Then
            If Target < 0 Then Target = Target * -1
            Target.Offset(0, 1) = Target.Offset(-1, 1) - Target
         ElseIf Target.Column = 3 And Target.Row = 5 Then
            If IsNumeric(Target) = True Then Target = ""
            MsgBox "Seul un crédit est autorisé sur la première ligne!", vbCritical, "SOLDE DE DEPART"
            Target.Offset(, -1).Select
         End If
      End If
   End If
   Application.EnableEvents = True
End Sub
Merci. Bonne soirée.
 

cp4

XLDnaute Barbatruc
J'ai encore trouvé ce que je voulais
Code:
'   If Not Intersect(Target, Union(Range("B5:B1000"), Range("C5:C1000"))) Is Nothing Then
   If Not Intersect(Target, Union(Range("tableau1" & "[crédit]"), Range("tableau1" & "[débit]"))) Is Nothing Then
Voilà pour le partage. Bon week-end.
 

Discussions similaires

Réponses
45
Affichages
3 K
Réponses
0
Affichages
1 K

Statistiques des forums

Discussions
312 194
Messages
2 086 071
Membres
103 110
dernier inscrit
Privé