Re: envoyer les infos d'un userform vers un tableau
#11
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 01-09-2009 20h54
Bonjour,

Certainement, ne te gêne pas pour demander.  Je suis en relâche au boulot alors j'essaie de garder la main (ou le clavier, selon)

Pour ce qui est de l'erreur signalée «regarde s'il te plait tes derniere modif, quand je click sur date cela me renvoi dans les code peut tu regarder s'il te plait.» Y a-t-il un message affiché quand cela se produit? As-tu bien installé le mdf_xlcalendar?  Quand tu cliques dans Outils/Références y a-t-il une référence avec un préfixe MANQUANT?

En attendant plus de détails cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#12
Accro XLPages

Inscription: 25/11/2008

Messages: 174

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 03-09-2009 20h45
guy sa fait deux jour que je buche sur les lien pour nommer une plage dynamique,et j'avoue encore ne pas avoir trouvé comment on passe les infos de l'userform au tableau.je m'y remet demain.mais comme promis je vais t'expliquer mon projet.
voila mon projet et tout simplement un tableau pour faire mes compte,avec un userform pour inscrire les débits dans le livre de compte,et un autre userform pour inscrire les crédits et un autre dont l'idée serai pour integrer les crédit et divers prélèvement mensuel(maison:voiture:asurance....ect) dans le livre de compte a date fixe et avec une durée définie.dans la feuille1 (accueil)je voulais faire aparaitre les boutons d'accés au userform plus le solde du compte et pour finir et la il faudra peut etre modifier le format de la date car je voudrai pouvoir éditer un relever de livre de compte pour une période défini entre deux date.
voila ce projet te parait il faisable et pourrai s'il te plait m'aider a le réaliser.
en te remerciant et dans l'attente de te lire.
Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#13
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 03-09-2009 22h19
Bonjour Claude,

Effectivement la chose est un tant soit peu compliqué mais pas tant que ça.

Nous voulons lier différents contrôles d'un formulaire à une plage d'une feuille de calcul (de préférence nommée).

Dans le formulaire en question il peut y avoir toutes sorte de contrôles : des images, des boutons, des combobox, des zones de texte, des labels, etc.

Pour distinguer les contrôles dont nous voulons extraire l'information qui sera stockée dans la plage nous utiliserons la propriété Tag des contrôles. Par convention  nous affectons à la propriété Tag des contrôles choisis une chaîne de caractère qui porte le nom exact du champ de la plage nommée.

Dans l'exemple livre de compte2_Mod2.xls les noms des champs de la plage nommée "BaseDeDonnées" sont :

Date | Type de paiement | Catégorie | Divers | Crédit | Débit

Si tu examines les Tags des contrôles dans le formulaire frmExemple1 tu pourras établir la liste suivante:

                 Contrôle            |Type de contrôle        |Tag
  txtDate            |TextBox          |Date
  txtMontant         |TextBox          |Débit
  cboTypeDePaiement  |ComboBox         |Type de paiement
  cboCategorie       |ComboBox         |Catégorie
  cmdEnregistrer     |CommandButton    |
vide

Dans la plage "BaseDeDonnées" les champs sont :

|Date | Type de paiement | Catégorie | Divers | Crédit | Débit|

À noter que les contrôles de type TextBox et les contrôles de type ComboBox possèdent tous deux une propriété Text.

Nous avons donc inclus dans le contrôle lui-même le nom de la cible dans la plage.
Tu auras noté aussi que les propriétés Tag portent exactement le nom des colonnes de la plage "BaseDeDonnées" dont les noms de champs sont en feuil2 C6-H6.

Il est important que ces chaînes (des Tags et de la ligne d'en-tête de la plage) soit rigoureusement identiques : accents, majuscules et espaces compris.

Nous disposons donc d'un moyen simple de lier

txtDate.Text            -> "BaseDeDonnées": Date
txtMontant.Text         -> "BaseDeDonnées": Débit
cboTypeDePaiement.Text  -> "BaseDeDonnées": Type de paiement
cboCategorie.Text       -> "BaseDeDonnées": Catégorie

Dans le formulaire frmExemple1 la procédure UserForm_Initialize() nous sert à inscrire les contrôles dont nous voulons extraire la propriété Text dans une collection nommée ColControle et déclarée dans frmExemple1 :

Private Sub UserForm_Initialize()
 
  Set ColControle = New Collection


  ColControle.Add Me.txtDate
  ColControle.Add Me.cboCategorie
  ColControle.Add Me.cboTypeDePaiement
  ColControle.Add Me.txtMontant

End Sub


À noter que la collection ne porte que les contrôles dont nous avons besoin et pas cmdEnregistrer.

C'est la référence à cette collection que nous passons ensuite à la fonction :
Enregistrer(ColControle As Collection) du module modEnregistrer.

Cette fonction parcourt tous les éléments de la collection envoyée en paramètre et assigne à la bonne cellule de la bonne colonne le contenu de la propriété Text de l'élément (qui est soit un TextBox, soit un ComboBox).

  For Each Controle In ColControle


Il nous importe peu, pas du tout même, de savoir si c'est l'un ou l'autre type de contrôle (TextBox ou ComboBox) puisque les deux types ont une propriété Text.

Or pour connaître «la bonne colonne» où déposer l'information on effectue une recherche dans l'en-tête de la plage "BaseDeDonnées" pour extraire le numéro de colonne correspondant au Tag du contrôle avec la ligne d'instruction suivante :

NoColonne = WorksheetFunction.Match(Controle.Tag, PlageBase.Rows(1), 0)

Ou PlageBase porte une référence à la plage nommée "BaseDeDonnées" avec l'instruction :

Set PlageBase = Range(Names("BaseDeDonnées").RefersTo)

Donc, à partir de la propriété Tag correctement inscrite nous obtenons le no. de colonne où doit être déposé le .Text du contrôle.

Set CelluleAjout = PlageBase.Columns(NoColonne).Range("A1").End(xlDown).Offset(1, 0)

  CelluleAjout = Controle.Text

C.Q.F.D

J'espère que cela éclaire un peu ta lanterne. Reste, évidemment à expliquer plus en détails le moyen de former une plage nommée dynamique à plusieurs colonne comme "BaseDeDonnées".  Ce sera pour une prochaine, en attendant tu peux t'amuser à modifier les Tags des contrôles et voir où sont déposés les données et si des erreurs se produisent. Par exemple change le Tag de txtMontant de Débit en Crédit et note que la donnée txtMontant.Text se retrouve dans la colonne Crédit.

Simple, non?

Guy


Edité par Guy le 04/09/2009 17:36:55

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#14
Accro XLPages

Inscription: 25/11/2008

Messages: 174

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 04-09-2009 15h44
bonjour guy
et merci pour toute la patience dont tu fait preuve a mon égard et dont je te suis tres reconnaissant.
je commence enfin a comprendre le cheminement de ton code.
dans la feuille2 pour identifier la plage "base de données"a tu juste mis les cellules en surbrillance et nommées ou a tu procédé autrement.
pense tu le projet que je t'ai décris réalisable ou pas.
encore merci pour tout
Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#15
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 04-09-2009 17h35
Bonjour Claude,

Tout d'abord va faire un tour sur la page
Nommer une Plage Dynamiquesur ce site.

On y explique comment construire une plage dynamique à une colonne.
L'exemple donne pour la plage nommée «Gamme» la formule 
=DECALER($C$19;;;NBVAL($C:$C)-1;1)

La plage «BaseDeDonnées» du classeur livre de compte2_Mod2.xls porte la formule
=DECALER(Feuil2!$C$6:$H$6;;;NBVAL(Feuil2!$C:$C))
Dans ce cas il y a plus d'une cellule dans la variable Réf (voir Nommer une Plage Dynamique) soit la plage Feuil2!$C6:$H6 qui est la plage en-tête de «BaseDeDonnée». Le dernier paramètre est posé au nombre de cellule portant une valeur dans la colonne C. Il est donc important de ne rien inscrire dans la colonne C autre que les valeurs importées du formulaire.

Par exemple tu peux créer une plage dynamique ailleurs dans  la feuille 2. Comment?

Ouvre le formulaire de définition des Noms (Menu Insertion/Nom/Définir... )
  1. Dans la zone de texte Noms dans le classeur : inscrit le nouveau nom que tu désires.
  2. Clique sur le bouton Ajouter
  3. Dans la zone de texte Fait référence à : inscrit =DECALER(Feuil2!$L$6:$Z$6;;;NBVAL(Feuil2!$L:$L))
  4. Cette nouvelle plage dynamique aura en en-tête la plage Feuil2!$L$6:$Z$6 et s'étendra automatiquement suivant le nombre de valeurs de la colonne L.
  5. Tu remarqueras une petite différence entre la formule à une colonne donnée en exemple et celle-ci.  Le paramètre Largeur est vide.  En effet la largeur de la plage est donnée implicitement par la valeur de paramètre Réf.
  6. Tu pourras évidemment choisir la plage d'en-tête que tu voudras. Je n'ai choisi que pour l'exemple.

Ceci étant, comment peut-on obtenir dans le code une référence à la plage dynamique «BaseDeDonnée»?
Revenons au code de la procédure Enregistrer du module modEnregistrer
(je n'ai pas utilisé l'affichage class="xoopsCode", il ne supporte pas iso-8859-1 et ses caractères accentués, je suis très pointilleux là-dessus )

Sub Enregistrer(ColControle As Collection)

  Dim PlageBase       As Range    ' La plage qui représente la base de données.
  ...
                                 
  ' Affecte la variable PlageBase à la plage BaseDeDonnées.
  Set PlageBase = Range(Names("BaseDeDonnées").RefersTo)
 
  ...
 
End Sub

Names("BaseDeDonnées").RefersTo retourne la formule de la plage «BaseDeDonnée»
C'est cette formule, dynamique va sans dire, qui est affectée à la plage PlageBase.

Pour ce qui est de ta question sur «...et un autre userform pour inscrire les crédits et un autre dont l'idée serai pour integrer les crédit et divers prélèvement mensuel...» je crois que tu peux commencer à voir comment tu pourras y arriver en te basant sur l'exemple fournit dans livre de compte2_Mod2.xls.

Cordialement,

Guy




Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#16
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 04-09-2009 20h34
Re bonjour Claude

Voilà qui est plus présentable. Code de la fonction Enregistrer, voir commentaire souligné.
     Sub  Enregistrer(ColControle  As  Collection)

   Dim  PlageBase        As  Range     ' La plage qui représente la base de données.
   Dim  CelluleAjout     As  Range     ' Cellule où se fera l'ajout de données.
   Dim  NoColonne        As Long       ' Entier du numéro de colonne idoine.
   Dim  Controle         As  Control   ' Attention, le typage de la variable oblige à ne charger que des objets de type
                                   ' Control dans la collection, sinon une erreur (Paff-Boum!) se produira.
                                  
   ' Affecte la variable PlageBase à la plage BaseDeDonnées.
   Set  PlageBase = Range(Names("BaseDeDonnées").RefersTo)  ' Mettre un point d'arrêt ICI pour voir
  
   For Each  Controle In ColControle
  
     ' On trouve le no. de colonne approprié avec la fonction EQUIV(), MATCH en Anglais.
     ' Si le nom de champ de la base ne correspond pas Badaboum-Crac!
     ' On corrigera sous peu, une chose à la fois.
     NoColonne = WorksheetFunction.Match(Controle.Tag, PlageBase.Rows(1), 0)
    
     ' Puis on ajoute la donnée en fin de colonne dans la cellule CelluleAjout
     ' Note :
     '       1 - PlageBase pointe vers la plage BaseDeDonnées.
     '       2 - PlageBase.Columns(NoColonne) pointe vers la colonne NoColonne de la plage BaseDeDonnées.
     '       3 - PlageBase.Columns(NoColonne).Range("A1") pointe vers la cellule supérieure de la colonne NoColonne de la plage BaseDeDonnées.
     '       4 - PlageBase.Columns(NoColonne).Range("A1").End(xlDown) pointe vers la dernière cellule non vide de la colonne
     '           NoColonne.
     '       5 - PlageBase.Columns(NoColonne).Range("A1").End(xlDown).Offset(1, 0) pointe vers la cellule (vide on le souhaite)
     '           suivant immédiatement la dernière cellule non vide de la colonne NoColonne.
     '       6 - C'est là que seront ajoutées les données du formulaire.
     Set  CelluleAjout = PlageBase.Columns(NoColonne).Range("A1").End(xlDown).Offset(1, 0)
    
     ' Ouf! Nous y sommes presque...
     CelluleAjout = Controle.Text
      
   Next
  
   ' Ne reste plus qu'a passer l'aspirateur.
   With  frmExemple1
    
     .txtDate.Text = vbNullString
     .txtMontant = vbNullString
     .cboCategorie.ListIndex = 0
     .cboTypeDePaiement.ListIndex = 0
    
   End With
  
 End Sub
Guy


Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#17
Accro XLPages

Inscription: 25/11/2008

Messages: 174

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 06-09-2009 11h41
Bonjour Guy
depuis hier j'ai essayer de recréer un nouveau tableau a partir du code que tu ma créer,mais il ne marche pas pourrai tu regarder s'il te plait la ou j'ai fait une erreur et me dire ou c'est.car ensuite je vais essayer de créer l'userform2 "crédit".
merci pour tout et bon dimanche
Pièce jointe:
xlsm compte1.xlsm   [ Taille: 30.66 Ko - Téléchargements: 834 ]
Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#18
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 06-09-2009 13h32
Oh là là,

Bon, reprenons lentement. 

Tu as copié du code à partir de l'exemple envoyé la semaine dernière, parfait.
Seulement il semble que ton presse-papier présente quelques idiosyncrasies, je m'explique.

Tu as nommé la zone de texte de la date TextDate, or dans le code on trouve une procédure événementielle nommée txtDate_Enter(). Pas de chance que ça fonctionne sauf si tu renomme la zone de texte en txtDate ou bien la procédure en TextDate_Enter().

De la même manière et avec le même presse-papier tu as nommé le bouton d'enregistrement CommandButton1. Tu ne l'as pas nommé en fait puisque c'est un nom de contrôle par défaut. Or il eut fallu qu'il s'appelât cmdEnregistrer comme dans le classeur exemple, autrement soit Badaboum soit rien du tout, selon.

Itou aucun module modEnregistrer n'est présent dans ton code: tu as écrit Enregistrer.
L'appel modEnregistrer.Enregistrer ColControle ne risque pas d'avoir grand effet sinon de provoquer, là encore, une erreur à l'exécution.

Aussi aucune référence à mDF_XLCalendar n'est présente ce qui entraînera une erreur d'exécution quand tu auras fini de nettoyer le copier-coller approximatif auquel tu t'es livré.


Dans le code la formule
  NoColonne = WorksheetFunction.Match(Controle.Tag, PlageBase.Row(1), 0)
n'a aucun sens. Elle aurait dû (si ton presse-papier fonctionnait comme il faut) s'écrire
  NoColonne = WorksheetFunction.Match(Controle.Tag, PlageBase.Rows(1), 0)

Et re-belote : dans le code de la procédure Enregistrer du module modEnregistrer (correctement renommé!) que peut bien vouloir dire le truc suivant :
 With UserForm1
 
   txtDate.Text = vbNullString
   txtmontant = vbNullString
   cboCATEGORIES.ListIndex = 0
   cbotypedepaiment.ListIndex = 0
   End With
      End Sub
 
Rien, sinon encore des erreurs en cascades. Le code original se lisait comme suit :


 With frmExemple1
   
    .txtDate.Text = vbNullString
    .txtMontant = vbNullString
    .cboCategorie.ListIndex = 0
    .cboTypeDePaiement.ListIndex = 0
   
   
  End With
 
Le point devant les différents noms de contrôles n'est pas là pour faire plaisir à Grévisse ou à Druon; il est impérativement prescrit pour que le bon contrôle soit référencé! Sans parler des noms de contrôles qui ne correspondent pas pantoute (Québécisme abstrait et conceptuel : qui représente le néant qui se trouve à l'intérieur du vide lui-même et réciproquement.)

À noter ausssssi que ton presse-papier s'en est donné à coeur joie une fois de plus.

La plage nommée du classeur tableaudedonnée se retrouve nommée tableaudedonnées (chercher l'erreur) dans le code et elle est tout sauf dynamique, lors messire BadaBoum! encore.

Note : «From a developer's point of view, copy/paste is just a nightmare waiting to happen.» et dans ton cas ça n'a guère mis longtemps.

Je laisse à ta patience et à ta détermination le soin de semoncer vertement le presse-papier de ton poste et de revenir quand il aura compris.

«Labor omnia vincit improbus»
Un travail acharné vient à bout de tout

Guy

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
#19
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 06-09-2009 16h10
Bon!

Essaie donc ce fichier des fois.

Prends le temps de lire les commentaires ajoutés dans le code de frmEnregistrer et modEnregistrer.
Que de toutes petites modifications nécessaires pour passer d'Excel 2003 à Excel 2007.

Guy



Pièce jointe:
xlsm compte1_Corrigé.xlsm   [ Taille: 33.50 Ko - Téléchargements: 815 ]

Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes