> Tous les forums > Forum Bureautique
 Problème de nom de celluleSujet résolu
Ajouter un message à la discussion
Pages : [1] 2 ... Fin
Page 1 sur 2 [Fin]
vedene
  Posté le 01/02/2014 @ 16:21 
Aller en bas de la page 
Petit astucien

Bonjour,

Je viens de me rendre compte d'un soucis dans mon tableau Excel 2007

Je réalise un suivi bancaire.

pour ce faire, à chaque écriture, j'insère une ligne au dessus de la N°5

En G5, j'ai mon solde qui se calcul.

Jusque là c'est parfait.

Mais ce solde je dois le rapatrier sur une autre cellule A1

Le problème c'est qu'après l'insertion de ligne, A1 ne varie pas.

J'ai essayé de nommer ma cellule $G$5, "Solde", mais après insertion le nom fait référence à la cellule $G$6 ce qui fait que mon solde est ignoré

Avez-vous une solution ?

Merci d'avance

Publicité
ferrand
 Posté le 01/02/2014 à 17:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

pour ce faire, à chaque écriture, j'insère une ligne au dessus de la N°5

En G5, j'ai mon solde qui se calcul.

Il se calcule comment ? Si tu insères une ligne en 5, la nouvelle ligne 5 ne contiendra pas de formule ! S'il y avait des formules, elles se retrouvent en ligne 6.

Mais ce solde je dois le rapatrier sur une autre cellule A1

Là, je ne comprends pas ce que tu veux dire (ou faire) !

J'ai essayé de nommer ma cellule $G$5, "Solde", mais après insertion le nom fait référence à la cellule $G$6

Ça, bien sûr !

Il faudrait préciser mieux ce que tu veux faire et comment.

vedene
 Posté le 01/02/2014 à 17:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonsoir ferrand

C'est sûr, j'ai été brouillon.

Mais pendant le petit laps de temps que j'ai eu avant ton massage, j'ai fait ceci que j'ai placé dans un VBA de "commandbutton" qui permet de réaliser la ligne d'écriture insérée

Et cela fonctionne très bien.

Je vais donc marquer comme résolu à moins qu'il y d'avoir plus simple

Bonne soirée et bon match

Cordialement

ferrand
 Posté le 01/02/2014 à 17:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Re,

Ta macro enregistrée est à épurer (comme tout code enregistré), elle n'est pas complète dans ton post, je ne vois donc pas tout ce qu'elle fait ! Car elle devrait faire autrement et d'autres choses, selon tes quelques indications.

Et je ne vois pas la raison de copier G5 en valeur en A2 ?

Par ailleurs, si ton sujet précédent concernait le même classeur, j'espère que tu as adapté la solution qui avait l'air de te convenir, car dans le contexte que j'entrevois elle aurait des effets pervers !

Bref, si tu veux une aide adaptée, il faut fournir tous les éléments qui permettent une réponse applicable dans le cadre de ton projet, et le cas échéant un modèle de ta feuille qui permette de répondre en tenant compte du contexte.

vedene
 Posté le 02/02/2014 à 10:12 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour ferrand,

Voici pour des explications plus complètes :

1) Userform appelé

Commandbutton5 est le libellé "EFFACER LA PREMIÈRE LIGNE DU TABLEAU"

Code associé =

Private Sub CommandButton5_Click()
Dim OuiNon As Integer
OuiNon = MsgBox("Voulez-vous vraiment effacer la ligne ?", vbYesNo, "ATTENTION S.V.P.")
If OuiNon = vbYes Then
Rows(5).Delete

Range("G5").Select
Selection.Copy
Range("A2").Select (ensuite, sur une feuille "MENU", il ne me reste qu'a mettre dans une cellule =Nomdelafeuille;A2)
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False
Range("C3").Select

Exit Sub
End If

End Sub


La partie verte est aussi ajoutée dans le code du commandbutton "VALIDER" Cela répond-t-il à ton message ?

C'est dans cet userform que je voulais ajouter avec le même ou un autre bouton pour effacer une ligne au choix en fonction du numéro

Ce que nous avons vu dans un post précédent

Bonne journée

Cordialement



Modifié par vedene le 02/02/2014 10:36
ferrand
 Posté le 02/02/2014 à 12:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Même si je recoupe avec tes sujets précédents ayant trait au même projet, je n'aurais qu'une information partielle...

Si tu veuw éviter des propositions qui risquent d'aller à l'encontre de tel ou tel élément de ton projet, le mieux serait que tu mettes un exemplaire de ton classeur (expurgé de données personnelles), ce qui permettrait des réponses efficaces bien en situation...

Il faudrait que tu ajoutes aussi des indications sur ce que tu fais manuellement (qui peut ne pas être toujours évident). J'ai le sentiment que tes macros sont sous-utilisées et ne font pas tout ce qu'elles devraient ou pourraient faire.

De plus, une macro enregistrée, si elle présente un intérêt (pour les débutants, mais pas seulement !) nécessite toujours d'être réécrite pour une utilisation efficace. Elle produit un code qui décrit ce que tu fais à la main (ce dont VBA peut fort bien se passer et qui multiplie les tâches à accomplir) d'où un code bourré de Select, Activate, Selection et de redéfinition de propriétés ou paramètres qui (ne changeant pas) n'ont nullement besoin de l'être. Le premier travail face à du code enregistré est de supprimer toutes les manoeuvres de sélection pour rendre le code plus compact et plus rapide, il n'est justifié de sélectionner que dans de rares cas (par exemple donner la main à l'utilisateur à un endroit précis de son classeur) qui ne sont pas forcément dans les parties enregistrée... Si j'épure ton code des macros que je vois, il est plus rationnel de le faire sur l'ensemble pour conserver un équilibre et garantir les fonctionnalités.

Bon dimanche

vedene
 Posté le 03/02/2014 à 15:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour ferrand,

Ok, je vais préparer un fichier expurgé pour mieux comprendre.

Cordialement

vedene
 Posté le 03/02/2014 à 16:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonsoir ferrand

Voici le fichier demandé ICI

Il y a le temps de me répondre, mais cela sera mieux pour voir ce que je veux faire.

Cordialement

ferrand
 Posté le 04/02/2014 à 09:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Je vois ça plus en détail selon mes disponibilités des prochains jours... Je retrouve certains de tes sujets antérieurs. Par contre, as-tu abandonné la numérotation des lignes en A à partir de la ligne 5 ?

J'aurais quelques suggestions à te faire pour alléger ton code et t'y retrouver plus facilement mais j'attends d'avoir fait le tour...

A+

NB- Est-ce que ton contrôle Calendrier affiche normalement les jours chez toi (car chez moi, les jours ne sont pas visibles, comme je l'avais noté lors de ton sujet le concernant...) ?

Publicité
vedene
 Posté le 04/02/2014 à 10:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour ferrand,

Pour le calendrier, il est clair chez moi et fonctionne bien.

Pour les lignes, avec le zoom , le numéro des lignes Excel se voit bien et remettre une colonne numéro de ligne,

c'est peut être un doublon. A moins qu'en utilisation je masque la numérotation excel. A voir ultérieurement

Pour les post différent, je pensais qu'il valait mieux travailler par étape plutot que de demander la lune d'un coup

Merci pour l'attention que tu prêtes à mes questions.

Cordialement

ferrand
 Posté le 05/02/2014 à 08:40 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Je commence à te livrer mes suggestions. Je n'aurai pas le temps de le faire en une seule fois. Tu feras la synthèse à la fin...

1) Commençons par ce qui était le présent sujet, la formule en A2 :

Je pense après examen qu'une formule est plus simple comme méthode, d'autant que la formule elle-même est simple :

=DECALER(G4;1;)

En effet, la cellule G5 étant mouvante, il convient de s'appuyer sur une cellule stable pour aller pêcher le contenu de G5...

2) Formule en G5 (colonne G jusqu'à la ligne précédant le solde) :

Je suggèrerais de la faire partir de G4 (explication plus loin) et de la modifier légèrement :

=SI(C4<>"";G5-E4+F4;"")

Le résultat est le même mais cela t'évite une double condition.

3) Option numérotation en colonne A :

Je te propose une numérotation des opérations mais dans l'ordre chronologique d'inscription, numérotation qui sera donc croissante de bas en haut.

=NBVAL($C4:$C$18)

Cette formule est à mettre en A4 (et jusqu'à A17, soit ligne qui précède la ligne de solde initial dans le modèle "Banque 1"). La ligne de départ est en référence relative et correspond donc à ligne où se trouve la formule pour chaque ligne. Lorsqu'on insère une ligne en ligne 5, Excel ajustera automatiquement la formule qui deviendra en A4 : =NBVAL($C4:$C$19) et de même sur les autres lignes. Si on supprime toutes les lignes d'opération pour ramener la feuille à l'état initial avant démarrage de saisies, la ligne de solde initial se retrouvera ligne 5 et la formule en A4 sera devenue :
=NBVAL($C4:$C$5) [qui renverra 0 puisqu'il n'y a pas encore d'opération, les cellules C4 et C5 étant vides].

4) Masquer la ligne 4 :

La masquer évite une ligne vide (n'affichant rien) en début de la partie opérations des tableaux des feuilles 'Banque' et permet en même temps de la protéger contre toute fausse manoeuvre.

Les modifications opérées par inadvertance pourraient se répercuter sur les lignes insérées. En effet, lorsqu'une ligne est insérée en ligne 5, les cellules de la ligne insérée prennent automatiquement le format des cellules de la ligne qui précède, soit la ligne 4. Ce qui évite d'avoir à les redéfinir au moment de l'insertion.

Je complèterai ma suggestion en proposant que les formules recopiées sur la ligne insérée le soient à partir de la ligne 4 (et non de la ligne 6 qui suit). Au démarrage, lors de l'insertion de la 1re ligne opération, il n'y a pas de ligne suivante avec formule, alors que la ligne 4 rend le fonctionnement possible dès le départ.

Voilà pour un premier lot.

ferrand
 Posté le 05/02/2014 à 13:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je reprends pour quelques minutes...

5) Ouvrir sur le 'Menu' :

Puisque tu as fait une feuille 'MENU', je pense que c'est pour l'utiliser. Je suggère donc d'ouvrir le classeur sur cette feuille. Fort simple:

Private Sub Workbook_Open()
Worksheets("MENU").Activate
End Sub

Macro évènementielle dans le module classeur (ThisWorkbook). Elle pourra être étoffée si d'autres opérations s'avèrent utiles à l'ouverture.

6) Une seule macro affectée aux boutons du 'Menu' :

Tu as utilisé dans tes feuilles 2 types de contrôles boutons différents. Les boutons qui ouvrent Userform1 sont des contrôles ActiveX (Microsoft Forms). Les autres boutons : ceux du menu pour se rendre sur les feuilles 'Banque' et les boutons 'Retour' (vers feuilles 'Menu') sont des contrôles dits de formulaire, qui font partie d'Excel. Ces 2 types de contrôle fontionnent différemment.

Je te propose donc de remplacer les 4 macros affectée à chacun des boutons 'Banque 1 à 4' du menu par une seule. En renommant les boutons du nom de la feuille vers laquelle ils dirigent, soit 'Banque 1', 'Banque 2', 'Banque 3', 'Banque 4', on peut utiliser une propriété de l'application (Caller) qui, dans ce cas renvoie le nom du bouton ayant appelé la macro.

Sub Banque_x(Optional x As Integer)
Dim bq$
bq = Application.Caller
Worksheets(bq).Activate
End Sub

Je n'ai pas repris ici la sélection de C3 ! Mais la cellule C3 sera sélectionnée tout de même à l'affichage de la feuille (par un autre moyen).

L'argument optionnel (non utilisé) a juste pour rôle d'empêcher la macro de s'afficher dans la liste des macros que l'on peut lancer manuellement (car lancée en dehors des boutons du menu produirait une erreur d'exécution).

J'ai revu dans la foulée la macro 'Retour' :

Sub Retour()
Worksheets("MENU").Activate
End Sub

Amplement suffisant.

7) 'Maintenance' du nom de feuille (?) :

La présence d'une macro évènementielle (évènement sélection) dans chaque feuille 'Banque' m'a interrogée. S'agit-il d'une simple sécurité (toute relative d'ailleurs) ou d'un confort permettant le renommage automatique de la feuille en changeant la valeur de C1 ?

[NB- Si les noms de ces feuilles sont appelés à devoir être modifiés, signale-le moi car j'aurai alors d'autres éléments à ajuster...]

Si ces commandes doivent être maintenues, d'un point de vue technique il me semble préférable de déplacer cela au niveau classeur sur les évènements d'activation (en doublant éventuellement avec la désactivation).

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Select Case Sh.Name
Case "Libellés", "MENU"
Case Else
Sh.Name = Sh.Range("C1").Value
Sh.Range("C3").Select
End Select
End Sub

Cette macro fait la même chose que les 4 signalées. Et elle assure la sélection de C3 !

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Select Case Sh.Name
Case "Libellés", "MENU"
Case Else
Sh.Name = Sh.Range("C1").Value
End Select
End Sub

Manoeuvre doublée au niveau désactivation.

A suivre...



Modifié par ferrand le 05/02/2014 13:26
vedene
 Posté le 05/02/2014 à 13:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour ferrand,

C'est impressionnant, chapeau bas.

Je viens de lire tes deux messages et de suite, j'ai mis en place

5) Ouvrir sur le 'Menu' :

Puisque tu as fait une feuille 'MENU', je pense que c'est pour l'utiliser. Je suggère donc d'ouvrir le classeur sur cette feuille. Fort simple:

Private Sub Workbook_Open()
Worksheets("MENU").Activate
End Sub

Macro évènementielle dans le module classeur (ThisWorkbook). Elle pourra être étoffée si d'autres opérations s'avèrent utiles à l'ouverture.

C'est parfait et plus simple que de toujours penser à retourner au menu.

Pour le reste, j'ai mis en place les propositions, c'est parfait ainsi.

Par contre pour le point suivant :

7) 'Maintenance' du nom de feuille (?) :

La présence d'une macro évènementielle (évènement sélection) dans chaque feuille 'Banque' m'a interrogée. S'agit-il d'une simple sécurité (toute relative d'ailleurs) ou d'un confort permettant le renommage automatique de la feuille en changeant la valeur de C1 ?

[NB- Si les noms de ces feuilles sont appelés à devoir être modifiés, signale-le moi car j'aurai alors d'autres éléments à ajuster...]

Si ces commandes doivent être maintenues, d'un point de vue technique il me semble préférable de déplacer cela au niveau classeur sur les évènements d'activation (en doublant éventuellement avec la désactivation).

Effectivement les noms des banques dans les cellules C1 respectives peuvent bien sûr changer.

Il est bon que l'onglet en prenne nom.

Ce qui est plus embêtant, c'est que si les noms de banques apparaissent dans les macros, il me semble, que là ,il faut une intervention de l'utilisateur (moi)

Je n'ai pas trop compris le point 6 ou tu remplace les 4 macros par :

Sub Banque_x(Optional x As Integer)
Dim bq$
bq = Application.Caller
Worksheets(bq).Activate
End Sub

Je ne sais pas où le placer et que faut'il faire de mes "boutons de la feuille "MENU"

Je vais profiter des cordes d'eaux qui tombent à l'extérieur pour me plonger totalement dans mon fichier.

A bientôt pour la suite.

Cordialement



Modifié par vedene le 05/02/2014 15:04
ferrand
 Posté le 05/02/2014 à 22:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

Je te retourne un fichier modèle modifié à la fin, tu pourras donc vérifier chaque point.

Les macros ordinaires (qui ne présentent aucune nécessité spéciale d'emplacement) vont dans un module standard, au cas particulier Module1... Elles sont ainsi accessibles sans formalité car ces modules sont publics. Ce qui n'est pas le cas des modules de feuilles ou de Useforms, qui sont privés. Les procédures qui y sont contenues ne sont accessibles qu'à l'intérieur du module (tu as pu remarquer que lorsque tu cliques sur un objet pour définir une procédure d'évènement le concernant dans un de ces modules, VBA ajoute d'office le mot clé Private devant Sub, mais même si Private n'est pas explicitement mentionné les procédures sont par défaut privées. Si tu veux écrire une macro dans un de ces modules et qu'elle puisse être accessible de l'extérieur, il faut la définir comme publique [Public Sub...] et dans ce cas pour y accéder il faut l'appeler par NomModule.NomProcédure (alors que le Nom de la procédure suffit à appeler une procédure située dans un module standard).

Faudra donc que je revoie tout ce qui concerne l'appel des feuilles... Un point à préciser, est-ce que les noms des feuilles de saisie des opérations conservent un élément commun et le gardent lors de changements de noms (comme 'Banque' ici par exemple) ou bien sont totalement libres sans élément prédéfini ?

Pour les boutons du Menu, tu les laisses tels quel. Pour tester, il te faut simplement changer leurs noms et mettre 'Banque 1' à 'Banque 4' pour chaque bouton. Pour changer le nom d'un de ces boutons, tu le sélectionnes par un clic droit (pour ne pas lancer la macro affectée), le nom (Button ou Bouton suivi d'un numéro) apparaît dans la zone d'adresse (à gauche de la barre de formule) : tu le modifies à cet endroit et tu valides par Entrée (si le nom ne veut pas changer du premier coup, tu recommences, ça finit par aboutir). Tu mets la macro 'Banque_x' dans Module1, puis clic droit sur chaque bouton > Affecter une macro (et tu l'affectes à chaque bouton).

Demain je suis en principe totalement indisponible... je poursuivrais donc vendredi.

A+



Modifié par ferrand le 05/02/2014 22:21
vedene
 Posté le 05/02/2014 à 22:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonsoir ferrand,

Je te retourne un fichier modèle modifié à la fin, tu pourras donc vérifier chaque point.

Où ?

Chaque feuille portera le nom d'une banque tel que "Crédit lyonnais" puis l'autre pourra être "BNP Parisbas" ainsi de suite.

Mais si il faut un terme commun on pourrait en trouver un : exemple "Compte" suivi du nom de la banque

Si cela doit t'arranger pour l'aide précieuse que tu m'apportes.

Bonne soirée

Cordialement

ferrand
 Posté le 05/02/2014 à 23:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

J'en étais presque à la fin d'une réponse détaillée à tes dernières questions et mon message s'est subitement volatilisé !!!

Ctrl+Z ne l'a pas ramené ! Et je n'ai pas le temps de le réécrire. Ça attendra donc demain (ou plus vraisemblablement vendredi).

ferrand
 Posté le 07/02/2014 à 11:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je reprends les points déjà vus et je poursuis.

Pas de modification pour les propositions 1 à 4. La 5 et les suivantes vont être impactée par la question de l'identification des feuilles de comptes. En effet le dispositif que tu avais mis en place peut fort bien fonctionner tant qu'il s'agit de traiter la feuille active mais il faut un critère d'identification sûr de l'une ou l'autre des 4 feuilles concernées te laissant la possibilité de modifier le nom à tout moment...

Plutôt que de conserver un élément fixe dans le nom, qui serait contraignant (et qui ne permettrait de toute façon pas de suivre chaque feuille à travers ses changements de nom, ou de les identifier par le fait qu'il ne s'agit pas de feuille autre que celles de comptes (ce qui laisse aussi entière l'identification absolue de chacune), Je pense qu'une désignation fixe de chacune de ces 4 feuilles offre une solution plus fiable d'identification.

Je propose donc de désigner ces feuilles par : Compt_1, Compt_2, Compt_3, Compt_4, mention inscrite dans une cellule prédéfinie de la feuille (non affectée par des manipulations ou calculs), en l'occurence: B3 (avec couleur de police identique à la couleur de fond). [NB- j'ai pour ma part en bidouillant passé le fond de ta colonne B en vert clair (fond de la feuille) et repris l'encadrement sous forme de bordures, mais le principe s'applique quels que soient les choix de mise en forme.] Je reprends donc les propositions 5 à 7 en intégrant cet aspect :

5) Ouvrir sur le 'Menu' : macro initiale à compléter par une vérification des feuilles de comptes :

Private Sub Workbook_Open()
Dim i%, n%, bq$
For i = 1 To Worksheets.Count
With Worksheets(i)
If .Range("B3").Value Like "Compt_#" Then
n = CInt(Right(.Range("B3").Value, 1))
bq = .Range("C1").Value
MajVérif_LibMenu n, bq
End If
End With
Next i
Worksheets("MENU").Activate
End Sub

La macro identifie les feuilles à l'ouverture par le contenu de B3. S'il s'agit d'une feuille de compte, elle s'assure qu'elle est répertoriée sur la feuille Libellés et qu'un bouton lui correspond sur la feuille Menu, en lançant une macro (MajVérif_LibMenu) avec comme arguments le numéro 1 à 4 (extrait de B3) et le nom de feuille figurant en C1.

Sub MajVérif_LibMenu(n As Integer, bq As String)
Worksheets("Libellés").Cells(1, n).Value = bq
Worksheets("MENU").Buttons("Compt_" & n).Caption = bq
End Sub

Cette macro inscrit le nom de la feuille en ligne 1 de la feuille Libellés, colonne 1 à 4 (accueillant chacune les libellés de la feuille Compt_1 à 4), et l'inscrit en libellé du bouton de menu correspondant (boutons renommés Compt_1 à Compt_4).

6) Une seule macro affectée aux boutons du 'Menu' : à modifier aussi en conséquence.

Les boutons sont renommés Compt_1 à Compt_4 et chacun correspond à la feuille portant la même mention en B3... La macro suivante est affectée à ces 4 boutons :

Sub Banque_x(Optional x As Integer)
Dim bq$, n%
n = CInt(Right(Application.Caller, 1))
bq = Worksheets("Libellés").Cells(1, n).Value
Worksheets(bq).Activate
End Sub

La modification par rapport à la version précédente vient de ce qu'on extrait du nom du bouton le numéro identifiant la feuille, dont on récupère le nom sur la ligne 1 de la feuille Libellés (le numéro correspondant à la colonne). On active donc la feuille correspondant au bouton cliqué.

7) 'Maintenance' du nom de feuille : en remplacement de tes macros sur l'évènement SelectionChange de chaque feuille de compte, on place macro au niveau classeur et sur l'évènement Activation de feuille (on double avec l'évènement désactivation de feuille, ce qui garantit que le nom de la feuille restera en correspondance avec le contenu de C1). Version précédente modifiée pour tenir compte de l'identification des feuilles.

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Range("B3").Value Like "Compt_#" Then
Sh.Name = Sh.Range("C1").Value
Sh.Range("C3").Select
End If
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If Sh.Range("B3").Value Like "Compt_#" Then _
Sh.Name = Sh.Range("C1").Value
End Sub

Voilà pour les rectifs de ce qui avait déjà été abordé.

Publicité
ferrand
 Posté le 07/02/2014 à 12:27 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

8) Changement de nom de feuille : Cette question intervient dès lors que l'on peut modifier le nom de l'une ou l'autre des feuilles de comptes. Pour modifier, l'utilisateur intervient exclusivement en changeant le nom dans la cellule C1. Une macro fait le reste (au niveau classeur, ce qui permet une seule macro au lieu de 4) pour actualiser immédiatement le changement en interceptant l'évènement Change.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim n%, bq$
If Target.Row = 1 And Target.Column = 3 Then
If Sh.Range("B3").Value Like "Compt_#" Then
bq = Sh.Range("C1").Value
n = CInt(Right(Sh.Range("B3").Value, 1))
Sh.Name = bq
MajVérif_LibMenu n, bq
End If
End If
End Sub

Si le changement concerne C1 et s'il s'agit d'une feuille de compte (identifiée en B3), la feuille est renommée, et la feuille Libellés de même que le libellé du bouton de menu sont mis à jour (par la macro MajVérif_LibMenu).

9) Noms des plages de libellés : On était passé un peu vite là-dessus, mais il apparaît que ces contenus subiront aussi des variations et qu'il est donc souhaitable de les nommer selon des références dyamiques (s'adaptant aux changements). Par ailleurs, le nom de feuille n'ayant pas à figurer en libellé comptable, les libellés commencent ligne 2.

Un nom dynamique se donne au moyen d'une formule utilisant la fonction DECALER : =DECALER(réfPremièreCellulePlageEnLigne2;;;NbValeursdansColonne-1;1), soit pour la première colonne correspondant à la feuille Compt_1 :

=DECALER(Libellés!$A$2;;;NBVAL(Libellés!$A:$A)-1;1)

Même chose pour les autres, à partir des références B2, C2, D2. Par souci d'homogénéité avec les identifications de feuilles et les noms de boutons, je propose de dénommer les plages : Compte1 à Compte4 (petite différence pour éviter des erreurs éventuelles).

NB- La définition dynamique des plages implique qu'aucune ligne ne soit laissée vide dans la liste des libellés.

10) Lancement d'une inscription comptable : elle se fait au moyen du bouton 'Insérer une ligne comptable' de chaque feuille de compte, qui ouvre le formulaire Userform1.

Petit préalable : conserver les noms par défaut des contrôles dans les Userforms ne pose pas vraiment de problèmes tant qu'il y en a un ou deux mais lorsqu'ils se multiplient il devient difficile d'identifier d'emblée la fonction de chaque contrôle qu'on utilise. J'ai donc renommé les contrôles de façon à m'y retrouver...

Comme pour l'activation des feuilles à partir du menu, l'utilisation du bouton d'insertion va lancer la même macro qui ouvrira Userform1 :

Ces boutons étant des contrôles activeXla macro exécutée au clic se trouve dans le module de la feuille concernée :

Private Sub CommandButton1_Click()
Dim n%
n = CInt(Right(Me.Range("B3").Value, 1))
InserLigneCompt n
End Sub

On aura donc la même macro sur chacune des 4 feuilles : elle identifie la feuille (à partir de B3) et lance la macro d'ouverture du Userform avec en argument l'identifiant numérique de la feuille.

Sub InserLigneCompt(n As Integer)
Dim bq$, lbq$
bq = Worksheets("Libellés").Cells(1, n).Value
lbq = "Compte" & n
With UserForm1
.tbBanque.Value = bq
.cbxLib.RowSource = lbq
.Show
End With
End Sub

Cette dernière macro récupère le nom de la feuille et le nom de la plage de libellés en fonction de l'identifiant de feuille qui lui est fourni, elle afecte le nom au TextBox chargé de le recueillir (renommé : tbBanque) et la plage comme source de la liste du ComboBox (renommé : cbxLib), puis affiche Userform1.

A suivre...



Modifié par ferrand le 07/02/2014 12:28
ferrand
 Posté le 07/02/2014 à 14:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Userform1 étant maintenant affiché, je vais passer en revue les différentes commandes qu'il contient...

Je note en remarque générale que tu as utilisé plus ou moins indifféremment des TextBox ou des Label pour des mentions destinées à demeurer fixe (ou qui ne doivent pas être modifiées directement par l'utilisateur). Pour le TextBox accueillant le nom de la feuille (de la Banque), affecter au changement le retour à l'inscription initiale est original ! Ça fonctionne bien sûr, mais tu peux supprimer cette commande et régler la propriété Locked du TextBox sur True pour obtenir le même résultat plus simplement. Même chose pour tous les TextBox ou l'utilisateur n'a pas à saisir directement.

De même, tu utilises un Label à des fins de mise en forme, là où d'habitude on se sert d'un contrôle Frame. Je n'y touche pas, cela n'a pas d'incidence sur la programmation, mais note que tu peux regrouper tes contrôles dans des Frame...

On va essayer de suivre un ordre logique en commençant par la saisie d'une ligne comptable dans le Userform. J'ai renommé ainsi les contrôles afférents :

tbDate : le TextBox accueillant la date, et sa propriété Locked définie sur True (car tu sélectionnes la date au moyen d'un calendrier) ;

cbCal : le bouton d'affichage du calendrier ;

opbD et opbC : les cases d'option pour Débit et Crédit ;

tbMt : le TextBox accueillant le montant ;

cbxLib : le ComboBox affecté au choix du libellé de l'opération.

A noter pour ce dernier contrôle que tu peux taper un libellé ne figurant pas dans la liste. On pourrait également concevoir que lorsque tu tapes un libellé ne figurant pas dans la liste, ce dernier puisse être ajouté automatiquement à la liste. J'ai laissé cette question de côté mais on pourra y revenir si tu souhaites un tel dispositif...

Sur cet ensemble un seul point appelle suggestion de ma part (et petite rectification), concernant l'insertion de la date, avant de passer à l'inscription sur la feuille.

11) Insertion date opération : elle se fait par action sur le bouton cbCal qui affiche Userform2.

L'ouverture de Userform2 initialise le calendrier à la date du jour :

Private Sub UserForm_Initialize()
Calendar1.Value = Date
End Sub

et la validation, après choix d'une date (ou conservation de celle du jour) masque Userform2

Private Sub CommandButton1_Click()
UserForm2.Hide
End Sub

L'ensemble de l'opération est donc géré par la programmation du bouton cbCal de Userform1. Pour récupérer la date choisie et l'afficher dans tbDate, il faut prélever la valeur de Calendar1 après masquage de Userform2 (et non avant), d'où petite rectif. sur la programmation du bouton :

Private Sub cbCal_Click()
UserForm2.Show
tbDate.Value = UserForm2.Calendar1.Value
Unload UserForm2
End Sub

12) Inscription de l'opération sur la feuille : elle se fait par le bouton Valider (que j'ai renommé : cbValider).

Tu as pris soin de tester la saisie d'une date avant l'inscription sur la feuille. Parfait ! Mais pour être complet, il convient de vérifier aussi que les autres éléments de l'inscription ont été saisis ou sélectionnés : un montant, que la valeur de l'une des 2 cases d'option (Débit ou Crédit) soit à True, qu'un libellé ait été sélectionné.

On teste si un libellé a été sélectionné par la valeur de la propriété ListIndex. En l'absence de sélection dans la liste, celle-ci est égale à -1. Si dans ce cas, la valeur est celle que tu as affectée par défaut, un libellé doit être choisi ou saisi (dans le cas d'un libellé ne figurant pas dans la liste, on pourra facilement compléter ce test par une action éventuelle d'inscription d'un nouveau libellé dans la liste...) S'il y a lieu, on redonne le focus au contrôle sur lequel doit s'effectuer la saisie...

Les vérifications étant faites, il ne reste plus qu'à réaliser l'inscription : insérer une ligne en ligne 5 sur la feuille, y recopier les formules de la ligne 4, affecter les valeurs afférentes à l'opération (date, libellé, montant en débit ou crédit).

Private Sub cbValider_Click()
If tbDate.Value = "" Then
MsgBox "SELECTIONNER UNE DATE", vbCritical, "ERREUR"
Exit Sub
End If
If tbMt.Value = "" Then
MsgBox "INSCRIRE UN MONTANT", vbCritical, "ERREUR"
tbMt.SetFocus
Exit Sub
End If
If Not opbD.Value And Not opbC.Value Then
MsgBox "SELECTIONNER DEBIT OU CREDIT", vbCritical, "ERREUR"
Exit Sub
End If
If cbxLib.ListIndex = -1 Then
If cbxLib.Value = "Choisissez un Libellé" Then
MsgBox "CHOISIR UN LIBELLE", vbCritical, "ERREUR"
cbxLib.SetFocus
Exit Sub
End If
End If
With ActiveSheet
.Rows(5).Insert
.Range("A4:G4").Copy .Range("A5")
.Range("C5").Value = tbDate.Value
.Range("D5").Value = cbxLib.Value
If opbD.Value Then
.Range("E5").Value = tbMt.Value
Else
.Range("F5").Value = tbMt.Value
End If
End With
End Sub

Je profite de cette occasion pour une explication relative au copier-coller dont on voit souvent la programmation issue d'une macro enregistrée. Lorsqu'on enregistre une telle opération, l'enregistreur reproduit les manipulations opérées à la souris, soit :

Range(xx).Select
Selection.Copy
Range(yy).Select
ActiveSheet.Paste

Tout cela est à remplacer par : Range(xx).Copy Range(yy), plus simple et surtout plus rapide !

Sans oublier le : Application.CutCopyMode = False, inutile sauf exception (cette commande vide le presse-papier et ne présente une utilité que pour empêcher, à la fermeture d'un fichier, l'affichage d'un message demandant si l'on veut vider le presse-papier ou conserver son contenu).

ferrand
 Posté le 07/02/2014 à 15:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Sur la lancée, on continue avec les autres fonctions que tu as dévolues à Userform1, donc les commandes lancées à partir des boutons :

- 'Insérer une nouvelle ligne d'écriture' (renommé : cbNouvSaisie, qui réinitialise le formulaire pour enchaîner plusieurs saisies d'opérations) ;

- 'Changer de Banque ?' (renommé : cbChanger, qui te permet de réinitialiser le formulaire et changer de feuille sans avoir à fermer Userform1) ;

- 'Effacer une ligne de compte' (renommé : cbSupprimLigne, pour effacer une opération).

Le bouton 'Quitter' (renommé : cbQuitter) n'appelle pas de suggestion ou proposition particulière.

13) Insérer une nouvelle opération : dans la même feuille.

Pour cela il convient simplement de réinitialiser les contrôles de saisie du formulaire. Mais la même opération devra être faite aussi lors d'un changement de banque (de feuille), il est donc judicieux de mettre les instructions de réinitialisation des contrôles dans une seule macro, utilisable par les deux boutons concernés.

On met donc la macro suivante en tête du module de code de Userform1 :

Sub RéinitSaisie()
tbDate.Value = ""
tbMt.Value = ""
cbxLib.Value = "Choisissez un Libellé"
opbD.Value = False
opbC.Value = False
End Sub

Et la macro attachée au bouton devient :

Private Sub cbNouvSaisie_Click()
RéinitSaisie
End Sub

14) Changer de banque : le choix de la nouvelle banque (feuille) va se faire dans Userform3.

Le bouton va donc réinitialiser (comme précédemment) et lancer Userform3 :

Private Sub cbChanger_Click()
RéinitSaisie
UserForm3.Show
End Sub

Userform3 affiche 4 TextBox contenant les noms de banque (renommés :tbB1 à tbB4) et en regard 4 boutons (renommés : cbB1 à cbB4) pour opérer le choix.

Comme on l'a vu précédemment, les noms de banque (correspondant aux noms de feuilles de comptes) sont susceptibles de changements. Il convient donc d'initialiser Userform3 avec les noms en vigueur. La macro Userform_Initialize va l'opérer à l'ouverture du Userform :

Private Sub UserForm_Initialize()
Dim i%, bq$
For i = 1 To 4
bq = Worksheets("Libellés").Cells(1, i).Value
Me.Controls("tbB" & i).Value = bq
Next i
End Sub

On effectue le prélèvement des noms sur la feuille Libellés pour les affecter aux TextBox correspondants.

Une macro (à placer en tête du module de code de Userform3), lancée avec le numéro du TextBox choisi (donc de la feuille à activer) va procéder à l'activation et à la réinitialisation de Userform1 concernant l'indication de la banque et la liste de libellés :

Sub NouvCompt(n As Integer)
Dim bq$, lbq$
bq = Me.Controls("tbB" & n).Value
lbq = "Compte" & n
Worksheets(bq).Activate
With UserForm1
.tbBanque.Value = bq
.cbxLib.RowSource = lbq
End With
Unload UserForm3
End Sub

Cette macro est lancée par action sur l'un ou l'autre des boutons :

Private Sub cbB1_Click()
NouvCompt 1
End Sub

[Pour cbB2, NouvCompt est lancé avec 2, pour cbB3 avec 3 et pour cbB4 avec 4.]

15) Effacer une ligne : Il s'agit d'effacer une ligne de la feuille active en indiquant son numéro, ce qui est fait dans Userform4.

La macro attachée au bouton de Userform1 lance Userform4, récupère le numéro. Sachant que les opérations sont numérotées dans l'ordre de saisie, le numéro le plus élevé figure en ligne 5, ligne de la dernière opération saisie (et également en ligne 4). Si le numéro est compris entre 1 et ce maximum, ce numéro est converti en numéro de ligne de la feuille pour la supprimer, dans le cas contraire un message informe l'utilisateur que le numéro choisi n'est pas valide.

Private Sub cbSupprimLigne_Click()
Dim n%, m%
UserForm4.Show
If UserForm4.tbNum.Value = "" Then Exit Sub
n = CInt(UserForm4.tbNum.Value)
m = ActiveSheet.Range("A4").Value
If n > 0 And n <= m Then
If MsgBox("Voulez-vous vraiment effacer la ligne " & n & " ?", vbYesNo, _
"ATTENTION S.V.P.") = vbYes Then
n = m - n + 5
ActiveSheet.Rows(n).Delete
End If
Else
MsgBox "Numéro de ligne non valide.", vbCritical, "ERREUR"
End If
Unload UserForm4
End Sub

Mais cette macro présuppose que la valeur renvoyée par Userform4 est un nombre entier (convertible en type Integer). Il faut donc s'en assurer lors de la validation de la saisie dans Userform4 pour ne pas déclencher une erreur d'exécution. Dans le cas où rien n'a été saisi, cela correspond à une annulation (récupérée dans la macro ci-dessus qui interrompt la procédure). Il reste donc à éliminer au niveau de Userform4 toute saisie autre qu'un nombre entier.

Userform4 comporte un TextBox (renommé : tbNum, pour la saisie du numéro) et un bouton 'Valider' (renommé : cbValidSuppr) pour valider la ligne à supprimer [qui masque Userform4]. Il n'y a pas de bouton Annuler mais comme on l'a vu, valider un saisie nulle ou absente revient à annuler...

Pour assurer que la saisie sera un nombre entier on utilise un gestionnaire d'erreur au changement de valeur du TextBox : si la valeur n'est pas convertible en entier, on efface le contenu...

Private Sub tbNum_Change()
On Error GoTo erreursaisie
tbNum.Value = CInt(tbNum.Value)
Exit Sub
erreursaisie:
tbNum.Value = ""
End Sub

ferrand
 Posté le 07/02/2014 à 15:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Je te renvoie le fichier modifié : http://cjoint.com/?DBhps1Aujv9

J'avais aussi fait quelques modifs de mise en forme pour que la bi-coloration des lignes ne touche que la partie utilisée : les ligne 4 et celle du solde intial encadrent la partie mobile et Excel ajuste automatiquement la MFC. J'ai utilisé des bordures pour border la zone, mais maintenu C3:G3 colorée car bordure était là moins visible avec les volets. La colonne B est maintenue en séparateur, avec couleur du fond (mais qui n'apparaît pas à cause des séparations de volets). Mais à toi de voir à l'usage la mise en forme qui t'agrée le mieux...

Pour la formule en colonne A, pas souhaitable d'étendre la plage jusqu'à la ligne 1048576 ! Mettre la fin de plage calculée sur la ligne de solde initial en référence absolue (qu'Excel ajustera au fil des insertions ou suppressions).

Le fichier te permettra de lire les macros dans leur forme 'originale', c'est à dire avec des indentations destinées à en faciliter la lecture (qui ne peuvent être conservées lors de copie sur le forum).

Sur le fichier retourné, j'ai dû aussi modifier l'affichage du calendrier, pour pouvoir voir les dates ! Cela tenait chez moi au fait que la police d'affichage est en taille 1,5 qui la rendait invisible et que j'ai donc porté en taille 8. Il faut cliquer sur la propriété "Personnalisé..." du calendrier pour afficher les réglages de mise en forme. Comme tu dis que chez toi tout s'affiche de façon visible, je ne sais ce que produira cette modification, mais tu peux réajuster les réglages en question.

Je ne suis pas sûr d'avoir tout testé, aussi si erreurs d'exécution signale-les moi...

ferrand
 Posté le 08/02/2014 à 09:39 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

J'ai noté quelques petits problèmes... Je reviens...

ferrand
 Posté le 08/02/2014 à 10:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Premier problème : la formule en colonne G.

L'insertion modifie la formule en G4 : G5 devient G6 du fait de l'insertion et la copie se fait avec une formule fausse. (La copie de la cellule suivante éviterait ce problème mais ne permet pas un démarrage sans opération et ne règlerait pas le problème similaire à la suppression).

La suppression d'une ligne fait perdre la référence de cette ligne à la ligne qui précède, laquelle renvoie alors en G la valeur d'erreur #REF! (qui se répercute sur toutes les lignes précédentes.

La solution pour rendre la formule insensible aux insertions-suppressions est de l'appuyer sur les bornes fixes, donc en G4 sur les 4 feuilles de comptes :

=SI(C4<>"";$G$19-SOMME(E4:$E$19)+SOMME(F4:$F$19);"")

[La ligne $19 correspond à celle du solde initial, variable selon les feuilles.]

Reste le problème de date : inversion mois-jour liée au format américain.



Modifié par ferrand le 08/02/2014 10:25
ferrand
 Posté le 08/02/2014 à 10:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Problème de date :

Je pense avoir trouvé un moyen plus simple que ceux que j'utilisais jusqu'ici (du moins dans ta configuration) pour éviter l'erreur d'inscription de date.

Dans la macro Private Sub cbValider_Click() de Userform1, remplacer la ligne :

.Range("C5").Value = tbDate.Value

par : .Range("C5").FormulaLocal = tbDate.Value

ferrand
 Posté le 08/02/2014 à 10:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Pour l'occasion petit complément :

Dans cbValider_Click() de Userform1, insérer :

...
If cbxLib.ListIndex = -1 Then

If cbxLib.Value = "Choisissez un Libellé" Then
MsgBox "CHOISIR UN LIBELLE", vbCritical, "ERREUR"
cbxLib.SetFocus
Exit Sub
Else
If MsgBox("Voulez-vous ajouter le libellé '" & cbxLib.Value & "' à la liste ?", _
vbYesNo, "Nouveau libellé") = vbYes Then
With cbxLib
Range(.RowSource).Cells(1, 1).Offset(.ListCount, 0).Value = .Value
.RowSource = ThisWorkbook.Names(.RowSource)
End With

End If
End If
End If
...

En cas de nouveau libellé, il est demandé à l'utilisateur s'il veut le rajouter à la liste ; si oui, le libellé est rajouté à la fin.

Mis à jour : http://cjoint.com/?DBilbqqdiYl



Modifié par ferrand le 08/02/2014 11:01
vedene
 Posté le 08/02/2014 à 11:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour ferrand

C'est, à première vue parfait (de Chez Parfait)

Comme quoi quand on a des gens comme vous !!!!!

C'est exactement ce que je cherchais à faire.

Nous allons passer à l'utilisation journalière pour tester TOUTES ces possibilités.

J'ai même un peu de gène maintenant à dire que j'ai fait quelque chose là dedans.

En tous les cas un grand merci à toi. et bas

Si je trouvais quelque chose, je le ferais savoir.

Ou si je fais évoluer cette version. (archivage, modification de ligne ou bien suivant le libellé, faire apparaître la somme liée (si crédit par exemple))

Mais pour l'instant ce n'est une priorité.

Sujet clos pour l'instant c'est l'heure d'aller manger le gratin d'agneau provençal



Modifié par vedene le 08/02/2014 11:52
Publicité
Pages : [1] 2 ... Fin
Page 1 sur 2 [Fin]

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
probleme format de cellule pour les nombres
Probleme de chiffre dans cellule
probleme avec une cellule où il y a #DIV/0!
petit problème de couleur de cellule
Probleme dans cellule texte - urgent
problème de couleur de cellule avec openoffice
problème avec SUMIF (somme si) & cellule variable
Autoriser/forcer le débordement à l'affichage d'une cellule
copier ligne si cellule vide
export cellule vers image
Plus de sujets relatifs à Problème de nom de cellule
 > Tous les forums > Forum Bureautique