Afficher plusieurs données dans un objet

Bonjour,

Je cherche à inscrire 6 données dans un objet : colonne L les données sont saisies manuellement en lien avec chaque ligne de mon tableau -> Donc source d'erreur possible

Colonne P un essai pour automatiser l'affiche, cela fonctionne mais il faut au départ paramétrer l'objet pour chaque ligne

Auriez-vous une solution moins fastidieuse, car souvent mon tableau comprend une centaine de ligne de commande et les données des cellules changent également à chaque commande

Je vous remercie d'avance

Bonjour,

j'ai une proposition qui ne va pas vous plaire : ne pas utiliser cette forme et mettre chaque chiffre dans une cellule, donc 9 cellules par objet (3 lignes et 3 colonnes) au lieu d'une. Et là on pourrait mettre une formule dans chaque cellule.

Mais ça passe par une grosse modification du tableau.

re,

on sait modifier chaque forme dans la colonne L avec le contenu dans la cellule, donc si on a par exemple "1;48;1|48|1;;1", VBA sait créer votre forme en L3

c'est même plus facile, je crois, on n'a qu'à modifier les références de textboxes 37-44

Bonjour à tous,

Je propose une autre approche en utilisant une seule forme
Pour le test faire un clic dans le tableau.

Wow, joli ça Jean-Paul !

re,

nice, une question, au lieu de mettre le "listobject" en static, pouvait-on aussi mettre le contenu du listobject comme array en static (en supposant que ce contenu ne change jamais pendant le processus) ou cela n'est pas recommandé ?

Bonjour à tous,

@Bart

au lieu de mettre le "listobject" en static, pouvait-on aussi mettre le contenu du listobject comme array en static

Je ne sais pas si j'ai tout bien compris, mais dans la mesure ou le listobject est en Static son contenu l'est aussi, L'initialiser dans une fonction me permet de ne changer son nom que dans un seul emplacement. La fonction getListObject me permet de récupérer le fameux ListObject où qu'il soit.

Par exemple pour ajouter une ligne dans un tableau de clients depuis un formulaire :

Public Sub TestAddRow()
    Dim itemRow As Excel.ListRow
    Set itemRow = Factory.InitTabDatas.ListRows.Add
    With itemRow
        .Range(.Parent.ListColumns("Nom").Index).Value = NomClient.Value
        .Range(.Parent.ListColumns("Prénom").Index).Value = PrenomClient.Value
        .Range(.Parent.ListColumns("Age").Index).Value = AgeClient.Value
        '...
        '...
    End With
End Sub

et pour récupérer une ligne j'utilise souvent un ID unique sur les tableaux.
Imaginons qu'une zone de liste déroulante paramétrée avec trois colonnes ID, Prénom, Nom dont la première est cachée et renvoyée par défaut.

Dans un module (TabsManagement) j'ai la fonction qui me permet de récupérer une ligne de tableau. Elle utilise aussi un listObject appelé depuis Factory :

'@Description "Retourne une ligne d'un tableau depuis la recherche d'une valeur dans une colonne"
Public Function GetRow(ByVal Table As Excel.ListObject, ByVal ColumnName As String, ByVal Value As Variant) As Excel.ListRow
    If TypeName(Value) = "String" Then Value = """" & Value & """" Else Value = Value * 1
    Dim Formula As String
    Formula = "iferror(match({value},{table}[{column}],0),0)"
    Formula = Replace(Formula, "{value}", Value)
    Formula = Replace(Formula, "{table}", Table.Name)
    Formula = Replace(Formula, "{column}", ColumnName)

    Dim Index As Long
    Index = Evaluate(Formula)
    If Index > 0 Then Set GetRow = Table.ListRows(Index)
End Function

Pour l'appel je lui fournis les paramètres voulus et puis ça roule...

Private Sub ValiderSaisie_Click()
    Dim itemRow As Excel.ListRow
    If Me.ComboBox1.ListIndex > -1 Then
        Set itemRow = TabsManagement.GetRow(Factory.InitTabDatas, "ID", CLng(Me.ComboBox1.Value))
        If Not itemRow Is Nothing Then
            With itemRow
                NomClient.Value = .Range(.Parent.ListColumns("Nom").Index).Value
                PrenomClient.Value = .Range(.Parent.ListColumns("Prénom").Index).Value
                AgeClient.Value = .Range(.Parent.ListColumns("Age").Index).Value
                '...
                '...
            End With
        Else
        'Todo "Make Something."
        End If
    Else
        'Todo "Make Something."
    End If
End Sub

Pour éviter de réinventer la roue à chaque fois il très judicieux de faire de petites fonctions, que l'on pourras réutiliser.

@Doux reveur : j'avais bien pensé à créer 9 cellules par ligne pour obtenir mon objet, et celà est toujours possible

@Jean-Paul : je ne vois pas de changement dans le fichier que tu as transmis hormis qu'il n'y a plus qu'un objet, je dois cliquer où ?

j'ai besoin que l'objet s'affiche sur toutes les lignes car ce fichier est envoyé tous les jours à mon fournisseur

Désolée, les macros c'est pas trop mon truc, je n'y comprends pas grand chose

Je viens de comprendre, mon système bloque la macro, c'est pour cela qu'elle ne s'exécute pas

Et vous pouvez enlever ce blocage ou pas ?

re, @Jean-Paul, je l'ai compris et le sauvegarde dans mes favorites.

Je pensais dans une autre question et avec une fonction personnalisée qui utilise le contenu d'un grand tableau structuré, de lire ce tableau comme static et puis, comme j'expecte que ce tableau reste en mémoire, que je ne dois plus lire ce contenu chaque fois. Bon, je n'ai pas un exemple pour le moment et comme ce n'a rien à voir avec la question originale, je le laisse comme çà.

Bonjour à tous,

@Emmanuelle,

je ne vois pas de changement dans le fichier que tu as transmis hormis qu'il n'y a plus qu'un objet, je dois cliquer où ?

Faire un clic n'importe où dans le tableau.

j'ai besoin que l'objet s'affiche sur toutes les lignes car ce fichier est envoyé tous les jours à mon fournisseur

Alors, ma solution n'est pas bonne car un seul objet s'affiche.
Avec un objet par ligne cela risque de devenir vite très ingérable, je pense, tout dépend du nombre de lignes que contiendra le tableau.

Sinon faut viré le tableau structuré et travailler sur plusieurs lignes comme dit plus haut dans le fil...

re,

on crée chaque fois un duplicate de votre objet, on le déplace vers cette colonne et on adapte les formules ? Je ne le sais pas, 3 objets par seconde et combien de lignes ?

@tous, Merci à tous, j'ai opté pour avoir trois lignes par commandes afin de créer la forme souhaitée, j'ai donc pu adapter mes formules avec des conditions si vide

@BsAlv -> Au début c'est ce que j'ai fait mais parfois j'ai 100 lignes donc c'est fastidieux

re,

bizarre, cette macro le faisait chez moi à une vitesse incroyable, je pense vos 100 lignes en <1sec.

Vous avez un fichier avec autant de lignes ?

@BsAlv : je l'ai fait à la main, sans macro car notre système informatique bloque les macros Excel, il les "juge" dangereuses...

re,

alors, rien à faire ..., à la prochaine

Rechercher des sujets similaires à "afficher donnees objet"