XL 2016 Affichage des données sur feuille

Jean Pierre REYNAUD

XLDnaute Junior
Bonjour,

J'ai créé un classeur pour suivre mon budget familial. Jusqu'à présent ce fichier ne comportait pas d'UserForm de saisie. Les données étaient inscrites mensuellement, au vu de mon relevé bancaire, sur les feuilles de saisie mensuelles (Saisie_Janvier, Saisie_Février, etc.). Ces feuilles de saisie mensuelle comportaient des listes déroulantes dans lesquelles je sélectionnais la nature de l’opération et le mode de paiement. Le montant des débits et/ou des crédits étaient servi directement. Ces informations sont transmises et reprises automatiquement dans les feuilles mensuelles (Janvier, Février, etc.) qui répartissent les données par catégories et par nature de recettes et de dépenses.

Tout cela fonctionnait parfaitement jusqu'au moment ou j'ai décidé de remplacer les sélections sur listes déroulantes par un formulaire de saisie.

J'ai donc créé un Userform et entré les codes correspondants (du moins ceux qui me paraissaient nécessaires et exacts) : Codes de l'Userform et ajouté un module (module1) pour l'inscription des données.

Dans cet UserForm, je sélectionne le mois concerné (la feuille de saisie choisie s'ouvre automatiquement) la nature de l'opération, si c'est une dépense ou une recette, et le montant.

Tout semble être correct et je n'ai aucun message d'erreur. Le seul problème, c'est que lorsque je valide les informations ne s'inscrivent pas dans la feuille de saisie mensuelle sélectionnée. Tout reste vierge.

Je ne sais pas ou est l'erreur. Est-ce le code ajouté dans le module ? J'ai tourné le problème dans tous les sens mais quelque chose m'échappe.

Quelqu'un aurait-il une idée, voire une solution.

D'avance merci.

Ci-joint le fichier en cause étant précisé que le bouton pour ouvrir l'UserForm a été placé sur la page Saisie_Janvier mais permet d'accéder à n'importe quelle page de saisie sélectionnée dans le Combobox Mois

Bramoset
 

Pièces jointes

  • Test_Budget_Personnel_v29_03_2018.xlsm
    685.3 KB · Affichages: 41

laurent950

XLDnaute Accro
j'ai des questions : beaucoup de questions certes mais bon il y a des incohérences pour corriger
se module sert a quoi ?

Pour moi cela sert à rien !
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'TRANSFORMER LE POINT PAR UNE VIRGULE
If KeyAscii = 46 Then KeyAscii = 44
'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
If InStr("1234567890,", Chr(KeyAscii)) = 0 Or (InStr(TextBox1.Value, ",") <> 0 And Chr(KeyAscii) = ",") _
Or (TextBox1.SelStart = 0 And Chr(KeyAscii) = ",") Then KeyAscii = 0: Beep
End Sub



et cette boucle sert a quoi ?

Pour moi C'est mal interprété !
si je peux avoir le détail de cette boucle merci
For i = ligne To derlig
If i = 4 Then
Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next


la protection et déprotéction de la feuille a qu'elle moment l'activé ou la desactiver ?

aussi : c'est de la ligne 4 à 128 soit : 125 lignes a remplire (vrais ou faux) ?
Me.SpinButton1.Max = ligne

dans se module :
a quoi cela sert de faire cette action avec cette fonction ?
il y a aucune feuille de mentionné donc cela n'écrira jamais rien
rempliusf (ligne) il manque la variable feuille soit combobox3.value

Private Sub SpinButton1_Change() 'page
ligne = Me.SpinButton1.Value
Me.Label6.Caption = "Enregistrement N° " & ligne - 3
rempliusf (ligne)
End Sub

cette fonction est en faite une procédure
Function rempliusf(ligne)
UF_Ecritures.ComboBox1.Value = Cells(ligne, 1).Value ' Opérations
UF_Ecritures.ComboBox2.Value = Cells(ligne, 2).Value ' Modes
UF_Ecritures.TextBox1.Value = 0 ' Montant
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense
If Cells(ligne, 3).Value > 0 Then
UF_Ecritures.TextBox1.Value = Cells(ligne, 3).Value
UF_Ecritures.OptionButton1.Value = True
End If
If Cells(ligne, 4).Value > 0 Then
UF_Ecritures.TextBox1.Value = Cells(ligne, 4).Value
UF_Ecritures.OptionButton2.Value = True
End If
End Function

donc faux car une fonction doit renvoyé une information

il faut écrire Sub pour procédure

sub rempliusf(ligne)
UF_Ecritures.ComboBox1.Value = Cells(ligne, 1).Value ' Opérations
UF_Ecritures.ComboBox2.Value = Cells(ligne, 2).Value ' Modes
UF_Ecritures.TextBox1.Value = 0 ' Montant
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense
If Cells(ligne, 3).Value > 0 Then
UF_Ecritures.TextBox1.Value = Cells(ligne, 3).Value
UF_Ecritures.OptionButton1.Value = True
End If
If Cells(ligne, 4).Value > 0 Then
UF_Ecritures.TextBox1.Value = Cells(ligne, 4).Value
UF_Ecritures.OptionButton2.Value = True
End If
End sub

et corrigé cette procédure qui est fausse

correction
Function rempliusf(ligne, NomFeuileactive As String)
' NomFeuileactive qui correspond à combobox3.value ramené dans la procédure.
' typé NomFeuileactive comme suit dim NomFeuileactive as string
' typé ligne ici inutil car vous l'avez typé en public lisible partout dans tous les modules
Dim Fcible As Worksheet
Set Fcible = Worksheets(NomFeuileactive)
UF_Ecritures.ComboBox1.Value = Fcible.Cells(ligne, 1).Value ' Opérations
UF_Ecritures.ComboBox2.Value = Fcible.Cells(ligne, 2).Value ' Modes
' ici pourquoi 0 pour lemontant
UF_Ecritures.TextBox1.Value = 0 ' Montant
' ici pourquoi les deux a false pour la même choses !
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense
UF_Ecritures.OptionButton1.Value = False ' Bouton choix Dépense

' Ici c'est forcément la derniere ligne pour les Totaux
' Dépense
' Vrais ou faux
If Fcible.Cells(ligne, 3).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 3).Value
UF_Ecritures.OptionButton1.Value = True
End If
' Ici c'est forcément la derniere ligne pour les Totaux
' Recettes
' Vrais ou faux
If Fcible.Cells(ligne, 4).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 4).Value
UF_Ecritures.OptionButton2.Value = True
End If

End Function

ici cette condition sert a rien
For i = ligne To derlig
' car i sera forcément égale à 4 pour i (toujours) c'est une boucle
If i = 4 Then

Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next
 
Dernière édition:

Jean Pierre REYNAUD

XLDnaute Junior
A Lone-Wolf,
J'ai fait les rectifications que tu proposes. Voilà le résultat :
Pour le mois de Janvier, c'est OK. Les données s'affichent correctement si avant de saisir, je déprotége la feuille sinon j'ai un message d'erreur (feuille protégée). Avant je pouvais saisir sans avoir à déprotéger ma feuille. As-tu une idée ?

Quoi qu'il en soit, après saisie sur la feuille déprotégée, qu'il s'agisse d'une dépense ou d'un recette enregistrée, un zéro "0" apparaît systématiquement dans la colonne "Débits", immédiatement sur la ligne en-dessous de la dernière ligne enregistrée. Ce qui fait que lorsque j'enregsitre une nouvelle donnée, celle-ci est inscrite deux lignes en dessous de la précédente, la précédente n'étant plus vide.
Exemple :
LDD (Recettes en provenance du) Prélèvement 45,25 378,10
0 378,10
PEL (Recettes en provenance du) Chèque 45,25 332,85
Pour Février (et les autres mois), si je mets la ligne de totaux comme tu le proposes les enregistrements son OK mais j'ai le même problème qu'en Janvier : un zéro "0" apparaît systématiquement dans la colonne "Débits", immédiatement sur la ligne en-dessous de la dernière ligne enregistrée.

J'ai pourtant décoché "Afficher un zéro" , dans les Options : Options avancées > Options d'affichage de la feuille de calcul.

Il doit y avoir une autre raison à l'affichage de ce "0"

Qu'en penses-tu ?

Jean Pierre
 

Lone-wolf

XLDnaute Barbatruc
Dans les images que je t'ai montrés, où tu vois des zéros dans les colonnes mentionnées?? o_O
As-tu déprotégé les cellules pour l'écriture avant de protégé la feuille??? :rolleyes:
Pour la dernière question, il faut aller foullier dans les macros pour voir d'où viens l'erreur.
 

Jean Pierre REYNAUD

XLDnaute Junior
Je réponds, autant que je le peux, à tes questions car les modifs ont été introduites semble-t-il par Laurent 950 et je ne les ai pas comprises ni validées.

Le Module Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) sert, j'ai cru comprendre, à transformer le point "." en virgule "," lorsque je saisi avec le clavier numérique. Mais je n'en suis pas certain.

Quant à la boucle que tu cites,
For i = ligne To derlig
If i = 4 Then
Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next
je ne sais pas à quoi elle sert.

Pour la protection, en principe, elle est activée en permanence, une fois pour toute. Je déprotège ma feuille ou mes feuilles que si vraiment je dois faire une manip (changement de format, par exemple) sur une feuille (Voir macro "déprotéger toutes les feuilles"). Jusqu'à présent, mes feuilles ont toujours été toutes protégées et cela ne m'empêchait de saisir les infos sur les feuilles de saisie. J'ai eu toutefois un problème lorsque j’utilisais ma macro "Déprotéger toutes les feuilles" (cf. bouton dans la feuille "Données"). Il a fallu que que la modifie et que je provoque l'ouverture de toutes les feuille. Sinon, toutes les feuilles étaient déprotégées sauf la feuille "Saisie-Janvier"

Ce sont en effet les lignes 4 à 128 soit : 125 lignes qui pourraient être remplis. Quant à "Me.SpinButton1.Max = ligne", je ne sais pas ce que cela veut dire.

Pour la fonction
Private Sub SpinButton1_Change() 'page
ligne = Me.SpinButton1.Value
Me.Label6.Caption = "Enregistrement N° " & ligne - 3
rempliusf (ligne)
End Sub
là aussi je ne sais pas à quoi elle correspond.

Dois-je remplacer la fonction "Function rempliusf(ligne)" par la procédure que tu proposes ?

Dois-je intégrer ce que tu proposes, à savoir :
' Ici c'est forcément la derniere ligne pour les Totaux
' Dépense
' Vrais ou faux
If Fcible.Cells(ligne, 3).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 3).Value
UF_Ecritures.OptionButton1.Value = True
End If
' Ici c'est forcément la derniere ligne pour les Totaux
' Recettes
' Vrais ou faux
If Fcible.Cells(ligne, 4).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 4).Value
UF_Ecritures.OptionButton2.Value = True
End If
End Function
et où l'intégrer exactement ? Dans quel le code ?

Enfin, faut-il supprimer :

ici cette condition sert a rien
For i = ligne To derlig
' car i sera forcément égale à 4 pour i (toujours) c'est une boucle
If i = 4 Then
Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next
qui semble ne servir à rien.

Merci pour ton analyse.

J'attends tes propositions car tout ce qui pourra corriger les erreurs ou supprimer les codes inutiles me paraît de bonne augure.

A +
Jean Pierre
 

Jean Pierre REYNAUD

XLDnaute Junior
Dans les images que je tu m'as montré, en effet, il n'y a pas de zéros dans les colonnes mentionnées?? o_O Pourtant ce zéro s'inscrit sur mes feuilles de saisie.
As-tu déprotégé les cellules pour l'écriture avant de protégé la feuille??? :rolleyes: : Si les cellules sont verrouillées ou déverrouillées, j'ai le même message d'erreur si la feuille est protéger. Cela ne fonctionne que si je déprotège ma feuille de saisie.
A+
Jean Pierre
 

laurent950

XLDnaute Accro
Il y a une autres méthodes :

Le Module Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) sert, j'ai cru comprendre, à transformer le point "." en virgule "," lorsque je saisi avec le clavier numérique. Mais
je n'en suis pas certain = Ok cela fonctionne gardé



A faire les test


Quant à la boucle que tu cites,
For i = ligne To derlig
If i = 4 Then
Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next
je ne sais pas à quoi elle sert. = J’ai fait la correction j’ai compris c’est des sommes


J’ai intégré = pas d’accent pour les fonction ou les Sub

Déprotéger s’écrit Deproteger = Corrigé

Pour la protection, en principe, elle est activée en permanence, une fois pour toute. Je déprotège ma feuille ou mes feuilles que si vraiment je dois faire une manip (changement de format, par exemple) sur une feuille (Voir macro "déprotéger toutes les feuilles"). Jusqu'à présent, mes feuilles ont toujours été toutes protégées et cela ne m'empêchait de saisir les infos sur les feuilles de saisie. J'ai eu toutefois un problème lorsque j’utilisais ma macro "Déprotéger toutes les feuilles" (cf. bouton dans la feuille "Données"). Il a fallu que que la modifie et que je provoque l'ouverture de toutes les feuille. Sinon, toutes les feuilles étaient déprotégées sauf la feuille "Saisie-Janvier"



Ce sont en effet les lignes 4 à 128 soit : 125 lignes qui pourraient être remplis. Quant à "Me.SpinButton1.Max = ligne", je ne sais pas ce que cela veut dire.

SpinButton1

C’est le curseur de deplacelement fléches droite et gauche de déplacement dans le formulaire

Donc bien 125


J’ai corrigé cela (mais pour moi ca sert a rien)



Dois-je intégrer ce que tu proposes, à savoir :
' Ici c'est forcément la derniere ligne pour les Totaux
' Dépense
' Vrais ou faux
If Fcible.Cells(ligne, 3).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 3).Value
UF_Ecritures.OptionButton1.Value = True
End If
' Ici c'est forcément la derniere ligne pour les Totaux
' Recettes
' Vrais ou faux
If Fcible.Cells(ligne, 4).Value > 0 Then
UF_Ecritures.TextBox1.Value = Fcible.Cells(ligne, 4).Value
UF_Ecritures.OptionButton2.Value = True
End If
End Function
et où l'intégrer exactement ? Dans quel le code ?


Enfin, faut-il supprimer : Non en faite c’est une boucle qui refait les calcul de la colonne solde = E

ici cette condition sert a rien
For i = ligne To derlig
' car i sera forcément égale à 4 pour i (toujours) c'est une boucle
If i = 4 Then
Fcible.Cells(i, 5).Value = Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
Else
Fcible.Cells(i, 5).Value = Fcible.Cells(i - 1, 5).Value + Fcible.Cells(i, 4).Value - Fcible.Cells(i, 3).Value
End If
Next
qui semble ne servir à rien = Si a refaire les calculs colonne solde E sur les 125 lignes

Ps : Merci pour vos explication aussi

Laurent
 
Dernière édition:

laurent950

XLDnaute Accro
Correction du curseur

Private Sub ComboBox3_Change() 'mois
' Rajout
Application.EnableEvents = False

Sheets(ComboBox3.Value).Select
ligne = Sheets(ComboBox3.Value).Range("A" & Rows.Count).End(xlUp).Row

' Rajout
Me.SpinButton1.Min = 1

Me.SpinButton1.Max = ligne - 4
Me.SpinButton1.Value = ligne - 4

' Rajout
Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Test_Budget_Personnel_v29_03_2018.xlsm
    680.2 KB · Affichages: 19

Discussions similaires

Réponses
5
Affichages
258

Statistiques des forums

Discussions
311 711
Messages
2 081 799
Membres
101 818
dernier inscrit
tiftouf5757