Forums XLPages

Tous les messages (Guy)

« 1 ... 40 41 42 43 44 45 46 47 »
Re: envoyer les infos d'un userform vers un tableau
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: 820 ]

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
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: function mDFXLcalShow
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 02h39
Bonsoir,

Je travaille avec Windows XP
Office 2007

Voici un petit classeur exemple qui fonctionne tout à fait bien sur mon poste.

Si ce n'est pas ce que tu cherches à faire, donne plus de détails et on verra.

Cordialement,

Guy

Pièce jointe:
xlsm mDF_XLCalendar dans un formulaire.xlsm   [ Taille: 76.52 Ko - Téléchargements: 515 ]

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
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
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
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
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: Import de fichier
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 : 31-08-2009 23h35
Deux question

As-tu Microsoft Access?
Es-tu, ne serait-ce qu'un peu familier avec SQL?

J'ai regardé ton exemple et je crois que c'est un boulot pour des requêtes SQL seulement il faut d'abord établir les critères de sélection.  C'est à dire traduire l'image mentale que tu as des différents champs en code.  Pour ça il faudrait que tu expliques plus en détails comment tu  choisis telle ou telle valeur dans les données brutes. 

Exemple : Y a-t-il une différence entre  926002B et 926002 (le fait qu'il y ait une lettre en suffixe est-il indicateur de quelque chose?)

             Sur quelle base indiques-tu que LOGICIEL KELIO OPTIMA 400P, RESEAU (CLASSE D'OPTION) et CLE PROTECTION USB puissent se
             retrouver dans la même section du formulaire?

Le schéma contenu dans ton classeur Test et question 2008-08-28.xls est fondé sur des critères de sélection qui sont des images mentales, l'ennui c'est que le système nerveux central du codeur n'est pas branché sur le tien.  Lors explique très précisément, avec les mots qui te conviennent le processus de sélection que ton cortex utilise. Après on fera un petit bout de code fondé sur ces explications.

Maxime : «Think first, code later.»

Voilà,

Guy



Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
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 : 31-08-2009 22h23
Bonjour,

Je ne saurais trop te conseiller quelques lectures

ftp://ftp-developpez.com/heureuxoli/ ... /word/vba-all/vba-all.pdf

http://excel.developpez.com/cours/

etc.

Aussi j'ai modifié le formulaire pour que la saisie de date se fasse avec le mdf_xlcalendar donc prend le temps de lire sur le sujet et de télécharger le complément :

Lecture : http://www.mdf-xlpages.com/modules/smartfaq/faq.php?faqid=53

Téléchargement : http://www.mdf-xlpages.com/modules/TD ... efile.php?cid=2&lid=1

J'ai aussi peaufiné quelque peu le code, ajouté des commentaires et déplacé le bouton de lancement du formulaire en Feuil2.

Tu pourras constater que le formulaire de saisie ne s'en laisse pas passer puisque j'ai aussi ajouté une validation pour les champ Date et Montant.

Voilà pour aujourd'hui, bonne chance.

Cordialement,

Guy

Pièce jointe:
zip livre de compte2_Mod2.zip   [ Taille: 53.35 Ko - Téléchargements: 1180 ]

Hors Ligne
Rapport   Haut 

Re: envoyer les infos d'un userform vers un tableau
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 : 31-08-2009 14h33
Petite erreur notée ce matin.

Module modEnregistrer procédure Enregistrer() le commentaire
    '       3 - PlageBase.Columns(NoColonne).Range("A1") pointe vers la cellule supérieure gauche de la plage BaseDeDonnées.
est faux (honte sur moi)
il aurait dû être ceci plutôt
    '       3 - PlageBase.Columns(NoColonne).Range("A1") pointe vers la cellule supérieure de la colonne NoColonne de la plage BaseDeDonnées.

Aussi pour ce qui est de la validation des données je te proposerai quelques trucs si la chose t'intéresse.

Cordialement,

Guy


Hors Ligne
Rapport   Haut 

« 1 ... 40 41 42 43 44 45 46 47 »