Enregistrer les données d'un formulaire dans un tableau

Bonjour,

Voici un fichier d'encodage de rapports d'inspection. J'ai créé un formulaire pour l'encodage. Ce formulaire fonctionne.

Cependant, si les données encodées viennent bien se mettre "au bon endroit", elles ne font pas partie du tableau créé pour les accueillir.

Cela me pose en problème car les tableaux croisés dynamiques et les schémas associés que je compte créer ne seront pas mis à jour automatiquement si mes données sont hors tableau.

Comment modifier mon code ?

Merci!

226bdd-01-macro.xlsm (61.40 Ko)

Bonjour,

Cela tient à ce que tu utilises un tableau excel et que tu n'en tiens pas compte... !

1) Un tableau Excel est nommé automatiquement par Excel, le nom (ici : Niveau1) figurant dans le gestionnaire correspond à la partie données du tableau, excluant les en-têtes (soit à ListObject.DataBodyRange, si on travaille avec l'objet spécifique Tableau en VBA [ce qui n'est pas nécessaire pour la plupart des opérations courantes]).

Ce nom est utilisable en VBA comme n'importe quel nom de plage en VBA. La notation (compacte) : [Niveau1] suffit à invoquer cet objet. Avec [Niveau1].Rows.Count on dispose à tout moment du nombre de lignes de données.

Si on fait :

With [Niveau1]
    lni = .Rows.Count + 1 'on a la ligne d'insertion sous le tableau
    .Cells(lni, 1) = ... 'on affecte la cellule A sur la ligne d'insertion
        'ou bien si l'on a pris soin de placer les données issues du formulaire dans un tableau (VBA) représentant la ligne
    .Cells(lni, 1).Resize(, 41).Value = Tbl 'on affecte directement la ligne en une fois

End With

Tout cela en adressage relatif à partir du tableau nommé, sans passer par la feuille, que l'on peut oublier dans le code...

Et la ligne insérée sous le tableau y est automatiquement intégrée. (Mais... voir 2))

2) Un petit hic au démarrage toutefois ! Un tableau est toujours créé avec une ligne de données vide. Bien que vide dans le tableau, par rapport à la feuille, cette ligne est considérée occupée. Et la méthode Range.End passe par dessus et n'est pas utilisable pour détecter une telle ligne vide de l'extérieur du tableau. Et tant que cette ligne est vide, si l'on ajoute des données sous le tableau, elles n'y seront pas intégrées...

Il y a 2 solutions : soit on teste dans le code une situation qui ne se produit qu'au démarrage, donc une seule fois... ?

Soit : on met un caractère quelconque dans la première colonne du tableau, dans cette première ligne vide.

Cela permettra à la ligne que l'on insèrera en dessous, la première, d'être intégrée au tableau.

Il suffira ensuite de supprimer la première ligne du tableau et tout sera dans l'ordre pour la suite...

Cordialement.

Bonjour,

Essaie ceci :

Private Sub Btnajout_Click()
Dim ws As Worksheet
Dim Table As ListObject
Dim rCell As Range

    Set ws = ActiveWorkbook.Worksheets("Niveau_etudes")
    Set Table = ws.ListObjects(1)
    With Table
        If .InsertRowRange Is Nothing Then
            Set rCell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
        Else
            Set rCell = .InsertRowRange.Cells(1)
        End If
    End With
    rCell.Value = Cboenvoi.Value
    rCell.Offset(0, 1).Value = Cboas
    rCell.Offset(0, 2).Value = Txtnumordre
    rCell.Offset(0, 3).Value = Txtdaterapport
    ' etc...
    '
    '
    rCell.Offset(0, 36).Value = Txtprof
    rCell.Offset(0, 39).Value = Txtpointattention
    rCell.Offset(0, 40).Value = Txtremarque

    MsgBox "vos données ont bien été enregistrées dans la base de données NE", vbOKOnly + vbInformation, "confirmation"

End Sub

Merci beaucoup!

Belle soirée.

Pierre

Rechercher des sujets similaires à "enregistrer donnees formulaire tableau"