UserForm, Tableau structuré VBA - Fil rouge

J'ai déjà un petit souci avec:

.List = rng.Value

... ça me donne un affichage incohérent Seule la deuxième colonne (Date) affiche des dates, la première me renvoie un N° iD non formaté; A la rigueur je pourait m'en accomoder mais la 3ème (les heures) me renvoie 0,4166...

Le suppose que je dois passer par un Array ? pour formater TOUSSA comme je veux ?

Essayons...

ça me donne un affichage incohérent

Oui. J'ai déjà eu ce problème. Pour reformater, pas d'autre solution que d'utiliser un tableau dynamique intermédiaire..

Oui j'avais bien senti la chose...

Bon je pense que pour le tableau structuré j'ai fait le tour de la question (sur ce projet) Maintenant il faut que je passe aux finitions.

Et c'est pas forcément le plus simple !

Je ne clos pas le sujet : J'y joindrai surement le projet quand il sera achevé.

En tout cas... Merci !

CONCEPTION :

Dans ce projet le tableau structuré est défini comme suit :

Option Explicit
Dim rng As Range, TData As ListObject

Private Sub InitVar()
   Set TData = Range("TData").ListObject
   Set rng = TData.DataBodyRange
'...

Implicitement le tableau ne dépassera pas quelques milliers de lignes

Le tableau est conçu comme suit :

Colonne A : iD (Clé primaire integer 1 à n)

Colonne B : Dates

Colonne B : Heures

Les données seront triées en permanence sur les colonne B et C

Le UserForm unique travaillera en permanence sur une plage de données de DateDebut à DateFin

J'envisage de nourrir mon USF (et le ListBox de recherche lbData ) avec un Array (Arr) borné par ces dates.

Comme le usf comportera des boutons de navigation il parcourra donc cet Array et comme le USF sera en Lecture / Ecriture

Une fonction de conversion se chargera de manière transparente de ré adresser les Ajout / Modif / Suppr vers la ligne correspondante de rng puis de rafraichir l'Array.

Deuxième hypothèse : Nourrir le ListBox de recherche avec rng mais bormer la navigation aux index de de DateDebut à DateFin.

Avant de me lancer dans cette construction... : Et vous comment feriez vous ? Envisageriez vous une autre voie ?

A+

Bonjour,

Passer par un "Array" intermédiaire me parait une meilleure solution que l'hypothèse 2.

Personnellement, pour ce type de problème, j'utiliserai plutôt une collection de type Dictionnaire (Scripting.Dictionary) avec pour clés, les clés primaires correspondant à la fourchette de dates et pour items, un Array d'une dimension contenant les colonnes B et C formatées correctement.

Le chargement de la ListBox s'effectue alors via une double transposition de la propriété .Items de cette collection (si on suppose qu'elle est nommée dico_dates) :

Me.LbData.List = Application.transpose(Application.transpose(dico_dates.Items)) si au moins 2 lignes

Me.LbData.Column = Application.transpose(Application.transpose(dico_dates.Items)) si une seule ligne

Oui j'y ai pensé aussi... Mais comme je ne suis pas trop à l'aise avec les Dictionnary et que le tableau sera vraiment très petit...

Bon, ben je vais peut-être en profiter pour réviser le Dictionnary !

A+

je vais peut-être en profiter pour réviser le Dictionnary !

Du coup, je me permets de te soumettre le récapitulatif que j'ai créé sur ce sujet :

L'objet Dictionary (créé par l'instruction CreateObject("Scripting.Dictionary")) est une collection d'éléments associée à une clé unique. Cette clé est en général une chaîne ou un entier.

Si par exemple, "dico1" est un objet Dictionary,

Les méthodes (actions) possibles sont :

dic01.Add Ajoute une nouvelle paire clé/élément à l'objet

dico1.Exists Renvoie une valeur de type Boolean qui indique si une clé spécifiée existe dans l’objet .

dico1.Items Renvoie un tableau de tous les éléments de l'objet .

dico1.Keys Renvoie un tableau de toutes les clés de l'objet .

dico1.Remove Supprime la paire clé/élément spécifiée de l’objet .

dico1.RemoveAll Supprime toutes les paires clé/élément de l’objet .

Les propriétés possibles sont :

dico1.Count Renvoie le nombre de paires clé/élément dans l'objet .

dico1.Item Définit ou renvoie la valeur d’un élément de l'objet par son indice : dico1.item(i) ou dico1(i)

dico1.Key Définit ou renvoie la valeur d’un élément de l'objet par sa clé : dico1.key(clé) ou dico1(clé)

NB: A noter que si clé1 n'existe pas, l'instruction dico1(clé1) = élément1 est équivalente à l'instruction dico1.Add clé1, élément1

Bonjour,

Résultat des courses :

J'y ai passé 2 boite de Doliprane, mébon... Je vous propose 2 versions presque identiques d'un petit agenda perpétuel "pour noter des RV"

L'un basé sur l'année scolaire et l'autre sur une année normale.

Avis et commentaires, signalement de bugs bienvenus...

58calrvs-v1.xlsm (113.12 Ko)
51calrv-v1.xlsm (79.73 Ko)

Une autre petite démo sans autre objectif que de simplifier au maximum la compréhension du codage pour

Ajouter un enregistrement dans un tableau structuré (qu'elle soit vide ou qu'elle comporte déjà des enregistrements.)

A+

Bonjour,

@galopin01,

Ma vision de la chose !?

Cdlt.

Option Explicit

Dim TData As ListObject, n As Long

Private Sub UserForm_Initialize()
    Set TData = Range("TData").ListObject
    n = TData.ListRows.Count + 1
    Me.Caption = "Enr. N? : " & n
End Sub

Private Sub CommandButton1_Click()
Dim lr As ListRow, arr(3)

    arr(0) = n
    arr(1) = TextBox1
    arr(2) = TextBox2
    arr(3) = TextBox3

    Set lr = TData.ListRows.Add
    lr.Range.Value = arr
    n = n + 1

    ResetCtrl

End Sub
Private Sub ResetCtrl()
    TextBox1 = ""
    TextBox2 = ""
    TextBox3 = ""
End Sub

lr.Range.Value = arr

A mon avis, plutôt : "lr.DatabodyRange.Value = arr" car le .Range intègre les entêtes du tableau.

Re,

Bonjour Thev,

lr= listrow

Cdlt.

Bonjour,

J'ai mis ça dans ma besace : Il faut que je digère un peu ça pour une utilisation ultérieure dans un UserForm plus complet (type CRUD)

A+

Bonjour,

6 mois... La digestion a été un peu longue, mais je pense avoir pas trop mal maturé cette problématique.

Je donne ici une démo de base de donnée (Tableau structuré) gérée par un formulaire de type CRUD.

Le UserForm est "clef en main" YAPUKA supprimer l'enregistrement existant et personnaliser un peu en rajoutant quelques colonnes. En théorie, un débutant un tant soit peu averti doit pouvoir adapter ça à ses propres besoins en moins d'une heure...

Malgré toute le soin apporté, il peut subsister quelques coquilles. Je soumet ça à votre pugnacité !

Le code est ouvert et la seule feuille protégée est sans mot de passe.

Sans observation de votre part je le proposerai dans la section des téléchargements...

A+

Bonjour Galopin,

salut à tous,

sans la page d’accueil tout fonctionne bien...

Oui, bien sur.

Je n'ai rajouté cette feuille que pour montrer que le système ne nécessite pas une "BD visible" après le reste c'est de l'enrobage.

Si on part du principe que la BD est invisible, il faut bien une page avec les boutons et ça marche très bien aussi.

Il reste que pour la mise au point la visibilité des 2 est indispensable.

Après faut-il ou pas inhiber les croix de fermeture c'est secondaire...

Il me reste maintenant à implémenter un calendrier embarqué. J'ai trop pesté contre le problème des dates de naissance pour me contenter de cette saisie JJMMAAAA... mais la finalisation est délicate !

Merci d'avoir testé.

Il me reste maintenant à implémenter un calendrier embarqué. J'ai trop pesté contre le problème des dates de naissance pour me contenter de cette saisie JJMMAAAA... mais la finalisation est délicate !

perso j'aime beaucoup le calendrier de leakim, à voir

ps/ modifier avec Label

Je donne ici la version corrigée pour ceux qui passeraient par là.

Il s'agit de la version avec page d'accueil étant bien précisé que celle ci n'est pas indispensable. Elle n'est présente que pour montrer qu'on n'a pas besoin de voir la BD pour la nourrir...

On peut même la masquer sans problème. Toutefois ceux qui aime bien avoir la BD sous les yeux peuvent très bien supprimer la page d'accueil et ça marchera tout aussi bien.

En définitive pour personnaliser la BD YAPUKA rajouter des champs en tant que de besoin et modifier les macros ReadRecord et WriteRecord pour intégrer vos nouveaux champs. Et ça devrait marcher comme sur des roulettes...

Juste un petit avertissement supplémentaire concernant la saisie des dates via le calendrier. La validation se fait sur les boutons jours donc même si vous ne changez que l'année vous devez confirmer le jour pour valider...

Concernant le champ adresse email : J'attire votre attention sur le fait qu'il est fait usage d'une routine de vérification des adresses email. Pour que ça fonctionne vous devez cocher dans Vba > Référence : "Microsoft VBScript Regular Expression 5.5"

A défaut d'activer cette bibliothèque vous auriez un message d'erreur.

Dernière précision un certain nombre de champs obligatoires sont affublés d'une astérisque rouge. Pour rendre d'autres champs obligatoire il suffit d'entrer dans les propriétés du contrôle le Tag "fill" et inversement pour supprimer l'obligation, supprimez le Tag...

Remerciement à tous ceux qui ont participé à cette aventure et particulièrement à XCellus qui à activement participé à la version définitive.

Une remerciement particulier également à Philippe Tulliez dont je me suis largement inspiré du code de son CRUD et à tous les anonymes dont j'ai pu récupérer des bribes de code...

A+

Bonjour,

Le UserForm est désormais disponible dans las section des Utilitaires en version sans menu d'accueil.

J'y ai intégré une version en late binding du code de vérification des adresses internet. Mais l'ancienne y reste disponible.

Ce fil reste à votre disposition pour toutes les discussions autour de ce sujet.

Niveau VBA requis (utilisation des Array

) et plus si modification du calendrier...

Les versions 3.1et 3.2 sont fournies avec un calendrier "orienté Dates de naissance" (à partir de 1939) tandis que la version 3.3 est fourni avec un calendrier orienté "dates actuelles" : La fourchette de saisie est identique (1930/2030) mais la date par défaut est celle du jour de saisie... ce qui est nettement plus commode pour les prises de RV ou la plupart des opérations de type planning, gestion au quotidien.

A+

Bonjour,

Super outil pour la gestion de base de données

En revanche j'ai un souci quand j'essaye d'ouvrir sur le USERFORM contenu dans "Microsoft Excell Objets/WSA (Accueil)"

j'ai un message d'erreur (Voir doc ci-joint)

Peux-tu m'aider

Merci

Rechercher des sujets similaires à "userform tableau structure vba fil rouge"