IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de date dans userform


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2020
    Messages : 4
    Par défaut Problème de date dans userform
    Bonjour a tous

    Etant assez novice dans ce sujet , je me permet de demander de l'aide.

    En suivant les prescriptions de Pierre Fauconnier dans "Modélisation des liaisons entre userform et table de données Excel (tableau structuré)" ; j'essaye de l'adapter pour mon projet.Mon projet avance bien mais je bute sur le problème de format de date (inversion de jour et mois celons les dates). j'ai essayer avec format("tboDate","dd/mm/yyyy"), avec cDate mais rien ne marche. Je joint un fichier modifié de pierre pour que quelqu'un puisse m'aider.
    Merci d'avance ...
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gillou1961 Voir le message
    Bonjour,

    Dans le module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Sub UpdateTable()
      Dim r As ListRow
      Dim Counter As Long
      Dim ControlName As String
      Dim ColumnName As String
     
      If mIndex = 0 Then
        mTable.ListRows.Add
        mIndex = mTable.ListRows.Count
      End If
      Set r = mTable.ListRows(mIndex)
    '  For Counter = 1 To UBound(Map, 2)
        ' Debug.Print mUsf.Controls(Map(1, Counter)).Value
         r.Range(mTable.ListColumns(Map(2, 1)).Index).Value = mUsf.Controls(Map(1, 1)).Value
         r.Range(mTable.ListColumns(Map(2, 2)).Index).Value = mUsf.Controls(Map(1, 2)).Value
         r.Range(mTable.ListColumns(Map(2, 3)).Index).Value = Format(mUsf.Controls(Map(1, 3)).Value, "mm/dd/yyyy")
    '  Next
    End Sub

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    On ne peut pas modifier le module de classe pour l'adapter à un cas particulier, sinon ce n'est plus un module de classe => pas question de supprimer la boucle car alors le truc n'est plus générique => Si on a un autre userform à gérer, on ne pourra plus utiliser le TableUsfManager puisqu'il aura été singularisé.

    Idéalement(1), on devrait passer par des propriétés du userform plutôt que par les contrôles, mais c'est quasi impossible en VBA. J'avais eu l'idée de compléter la contribution par cela ou par une colonne complémentaire de la table de mappage pour rendre le DataUsfManager vraiment générique.

    Méthode de contournement "pour aller vite"... (ce n'est pas de loin la meilleure solution) => créer un textbox invisible qui recevra la date dans un format non ambigu, de manière à permettre à la classe DataUsfManager de fonctionner. Je vais appeler ce textbox tboHiddenDate. J'adapte alors ma table de mappage et le code de validation du userform pour passer la date au format yyyy/mm/dd à tboHiddenDate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub btnSave_Click()
      With mDataManager
        tboHiddenDate = Right(tboDate.Value, 4) & "/" & Mid(tboDate.Value, 4, 2) & "/" & Left(tboDate.Value, 2)
        .UpdateTable
        tboIndex = .Index
      End With
    End Sub

    (1) Je vais développer dans mon message suivant
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Pierre,

    Faire en sorte d'avoir une date au bon format via le module de classe me paraît très sensé. Pour moi c'est du générique.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Eric,

    Citation Envoyé par Eric KERGRESSE Voir le message
    Pierre,

    Faire en sorte d'avoir une date au bon format via le module de classe me paraît très sensé. Pour moi c'est du générique.
    Je suis entièrement d'accord avec le principe que tu énonces. C'est sur le code que tu as proposé que je réagis.

    Tu as adapté la procédure UpdateTable du TableUsfManager pour qu'elle transfère les données en trois lignes (donc trois contrôles vers trois colonnes) dont la troisième doit être une date. Si après, un objet TableUsfManager doit transférer des données dans une table de 10 colonnes, ça va foirer. Et en plus, tu imposes que la troisième colonne soit une date.

    On n'est plus du tout dans du générique, là




    En fait, après cette contribution, je comptais développer le sujet pour pouvoir transmettre des dates ou des valeurs numériques sans ambiguïté, mais je n'ai pas pris le temps de le faire. Je vais pallier cela aujourd'hui ou demain
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    OK,

    Dans ce cas, une solution consisterait à typer le contrôle à partir du tag.

    Pour illustrer mon propos, cela m'est arrivé d'utiliser une table de paramétrage pour formater mes données (hors tableau structuré....) lorsque les tables étaient monstrueuses :
    Pour vérifier la présence et la concordance des champs et des contrôles.
    Pour formater le résultat via la propriété tag.

    Dans ce vidage on voit les valeurs possibles des informations et le formatage du tag. Pour la mise à jour des données, le champ tag est ensuite splité.
    Pièce jointe 586429
    Dernière modification par Invité ; 11/12/2020 à 16h00.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Voici une solution avec un complément d'info dans la table de mappage.

    Nom : 2020-12-11_155504.png
Affichages : 110
Taille : 4,3 Ko

    Il faut alors adapter la fonction GetMap1 pour qu'elle prenne en compte la quatrième colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Function getMap1(UsfName As String)
      Dim t
      ReDim Map(1 To 3, 1 To 1)
      Dim Counter As Long
      Dim Index As Long
     
      t = Range("t_MapUsf").Value
      For Counter = 1 To UBound(t)
        If t(Counter, 1) = UsfName Then
          If IsEmpty(Map(1, 1)) Then
            Index = 1
          Else
            Index = UBound(Map, 2) + 1
            ReDim Preserve Map(1 To 3, 1 To Index)
          End If
          Map(1, Index) = t(Counter, 2)
          Map(2, Index) = t(Counter, 3)
          Map(3, Index) = t(Counter, 4)
        End If
      Next
      getMap1 = Map
    End Function

    Dans le DataUsfManager, il faut adapter la procédure UpdateTable pour tenir compte du type de la donnée manipulée. Une des façons serait d'utiliser un Select Case sur le type de données. On modifie ainsi le TableUsfManager, mais on le laisse générique. Attention qu'ici, le code pour les valeurs numériques et date est minimaliste et tient compte d'une saisie des données dans le userform adaptée aux paramètres régionaux de l'ordi. C'est normalement de la responsabilité du userform de vérifier la conformité d'une donnée saisie (une date est bien une date, une valeur numérique utilise le bon séparateur décimal) avant d'utiliser la mise à jour du TableUsfManager.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub UpdateTable()
      Dim r As ListRow
      Dim Counter As Long
      Dim ControlName As String
      Dim ColumnName As String
      Dim strDate As String
     
      If mIndex = 0 Then
        mTable.ListRows.Add
        mIndex = mTable.ListRows.Count
      End If
      Set r = mTable.ListRows(mIndex)
      For Counter = 1 To UBound(Map, 2)
        Select Case Map(3, Counter)
          Case "Date"
            r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value = Format(mUsf.Controls(Map(1, Counter)).Value, "mm/dd/yyyy")
          Case Else
            r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value = mUsf.Controls(Map(1, Counter)).Value
        End Select
      Next
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2020
    Messages : 4
    Par défaut Problème de date dans userform
    Merci pierre . tout fonctionne comme je le voulais.

Discussions similaires

  1. [CR10] Problème de date dans l'en-tête de groupe
    Par bernie.noel dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/08/2005, 00h48
  2. problème champ date dans base oracle
    Par ludovik dans le forum Oracle
    Réponses: 6
    Dernier message: 25/07/2005, 15h48
  3. Problème de date dans fonction utlisateur
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2005, 16h25
  4. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  5. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo