Récupérer des données saisies d'un formulaire VBA

Bonjour,

J'ai une petite question, j'ai actuellement une Bdd de suivi de membres.

J'ai fait une erreur de débutant, j'ai laissé un filtre sur la base de données.

Lorsque j'ai enregistré de nouveaux membres via mon formulaire de saisie VBA, cela a ajouté les noms apparemment, puisque les numéros d'adhérents suivent, cependant aucune données visibles dans la base de données.

En défiltrant, rien non plus.

Question: est-il possible de récupérer ces saisies ?

Merci de votre aide,

Plus d'infos en messages privés.

Bonjour,

Personnellement, je n'accepte pas les messages en privé car sinon, on ne joue pas le jeu d'entraide du forum mais par contre, tu peux faire une copie de ton fichier et l'anonymiser pour le poster afin qu'on puisse réaliser des tests et trouver d'où peut venir le problème !

J'ai fait une erreur de débutant, j'ai laissé un filtre sur la base de données.

Lorsque j'ai enregistré de nouveaux membres via mon formulaire de saisie VBA, cela a ajouté les noms apparemment, puisque les numéros d'adhérents suivent, cependant aucune données visibles dans la base de données.

En défiltrant, rien non plus.

Question: est-il possible de récupérer ces saisies ?

Bonjour,

Je suis surpris ... si en défiltrant tu ne trouves rien, c'est qu'il n'y a rien !! mais regarde quand même vers les lignes de type 1.000.000 pour voir s'ils ne sont pas tout en bas au fin fond de l'onglet.

Et puis je ne vois pas en quoi le fait de filtrer perturbe ... mets nous a minima ton code. On pourrait comprendre.

Mais la meilleure des solutions sans dévoiler les noms, c'est de copier ton fichier, recommencer ta manip avec des noms bidon et nous la donner comme os à ronger...là je rejoins Theze.

Bonjour,

Effectivement le problème n'avait rien à voir avec le filtre. il provenant de cette ligne :

dlg = Range("Tableau5")(Range("Tableau5").Rows.Count, 2).End(xlUp).Row + 1

Bien qu'elle ne produise pas d'erreur de compilation cette ligne est un non sens :

Elle conduit à écrire toujours sur la ligne 2 quel que soit le nombre d'enregistrements déjà présents !

Donc chaque enregistrement écrase le précédent...

Il fallait écrire :

dlg = .Range("A" & .Rows.Count).End(xlUp)(2).Row

Cordialement.

Ok merci de votre retour, pourtant cela fonctionnait correctement auparavant

Je vais corriger l'erreur.

Je suppose qu'il n'est possible de récupérer les enregistrements de 193 à 207?

Cordialement,

B.Fée

ou alors ..

Range("Tableau5")(Range("Tableau5").Rows.Count, 2).Row + 1

car Range("Tableau5")(Range("Tableau5").Rows.Count, 2) désigne la cellule de la dernière ligne et de la seconde colonne du tableau

donc logiquement encore :

Range("Tableau5")(Range("Tableau5").Rows.Count, 1).Offset(1, 0).Row

Ok bien compris.

Je vais re- saisir ce qui a été perdu étant donné qu'il n'y a pas d'autres solutions.

Merci en tout cas pour votre aide,

[quote=Steelson post_id=796836 time=1568713652 user_id=30943]

Range("Tableau5")(Range("Tableau5").Rows.Count, 2).Row + 1

Bonjour Stelson,

Je ne sais pas d’où tu sors ça mais sans vouloir t'offenser, je ne ne vois pas l'intérêt de produire du code avec un syntaxe incompréhensible dans un forum destiné à des débutants. Ils ont déjà la plupart du temps bien du mal à utiliser la syntaxe normale...De plus toutes ces syntaxe en offset et en auto-conversion sont en plus chronophage en terme d'optimisation...

C'est pourquoi je préfère dans la limite de mes faibles connaissances produire dans mes codes des syntaxes dans une forme aussi canonique que possible ou largement éprouvées par l'usage...

Bon après ça, si vraiment on doit y gagner quelque chose, il peut m'arriver d'utiliser quelques tournures capillo-tractées, mais dans le cas présent je ne vois pas vraiment l’intérêt.

Bon enfin... Je dis ça j'ai rien dit ! Chacun fait comme il aime. Hein ! Mébon, c'est ce que je pense...

A+

Bonjour,

Comme dit Galopin, cette ligne de code n'a pas vraiment de sens car quand on utilise ce type d'instruction :

Range("Tableau5")(Index).Propriété voulue

en fait, on fait référence à la cellule ordinale donc, si par exemple le tableau contient 5 colonnes, cette instruction :

Range("Tableau5")(7).Value

va retourner la valeur de la cellule colonne 2 ligne 2 donc 7éme cellule en partant du haut vers le bas et de la gauche vers la droite un peu comme dans cet exemple avec des tableaux :

Sub Test()

    Dim Tbl1(1 To 2)
    Dim Tbl2(1 To 2) As String
    Dim Tbl3(1 To 2) As String

    Tbl2(1) = "Valeur 1"
    Tbl2(2) = "Valeur 2"

    Tbl3(1) = "Valeur 3"
    Tbl3(2) = "Valeur 4"

    Tbl1(1) = Tbl2
    Tbl1(2) = Tbl3

    MsgBox Tbl1(1)(1) '---> Valeur 1
    MsgBox Tbl1(2)(2) '---> Valeur 4

End Sub

Ce qu'on utilise assez souvent avec la fonction Split() !

Donc, pour avoir le numéro de la ligne libre sous le tableau, utiliser simplement :

dlg = Range("Tableau5").Rows.Count + 1

Comme c'est un tableau structuré (ListObject) je pense qu'il estg préférable d'utiliser les outils dédiés comme par exemple ce groupe d'instructions :

Dim Lig As ListRow

Set Lig = ActiveSheet.ListObjects("Tableau5").ListRows.Add

Lig.Range(1).Value = "Valeurt en colonne 1"
Lig.Range(2).Value = "Valeurt en colonne 2"
Lig.Range(3).Value = "Valeurt en colonne 3"

Avec ceci, pas besoin de chercher la dernière ligne du tableau incrémentée de 1 pour ajouter le nouvel enregistrement !

Bonjour Stelson,

Je ne sais pas d’où tu sors ça mais sans vouloir t'offenser, je ne ne vois pas l'intérêt de produire du code avec un syntaxe incompréhensible dans un forum destiné à des débutants.

Mon but est d'EXPLIQUER et non donner juste une solution ... expliquer ce que voulait dire l'expression que notre ami bonnefee59 avait utilisée (même s'il était débutant, quoique, il doit pouvoir comprendre un code qu'il utilise, je ne dis pas forcément le produire), expliquer ici que Range("Tableau5")(Range("Tableau5").Rows.Count, 2) signifie la dernière ligne deuxième colonne et donc à partir de là on aurait pu déduire la ligne de la feuille à utiliser. Je pense qu'en premier lieu un forum doit servir à monter en compétence et autonomie, et c'est bien ce que j'ai humblement réussi ici depuis que je me suis inscrit.

L'emploi de .Range("A" & .Rows.Count) est simple mais n'est pas optimal non plus car le tableau pourrait se situer ailleurs que sur la colonne A. C'est aussi une "faute" que je fais souvent.

La vraie réponse est celle de Theze qui ajoute une ligne au tableau structuré via ActiveSheet.ListObjects("Tableau5").ListRows.Add.

Bonjour Theze,

Je suis bien d'accord mais comme la plupart des utilisateurs lambda notre ami utilise les tableaux structurés comme instrument de décoration, sans jamais en utiliser les instruments en VBA. C'est pourquoi j'en suis resté au traditionnel :

dlg = .Range("A" & .Rows.Count).End(xlUp)(2).Row

Mais on est bien d'accord qu'on ne peux que conseiller à tous ceux qui on ont la capacité et le courage de se pencher sur l'utilisation des tableaux structurés en VBA. En particulier pour les USerForm.

A+

En particulier pour les USerForm.

je suis très réservé à ce sujet, les userform sont pour moi une survivance du passé (je me souviens de VB3 !!) qui n'a pas évolué avec les fonctions excel ... d'où une grande difficulté à les mettre en forme, une grande difficulté à les décoder notamment quand il s'agit de dates ou de nombres. C'est un autre débat. Et c'est juste un avis personnel. A chaque fois que je peux je dédie un onglet à la saisie.
Rechercher des sujets similaires à "recuperer donnees saisies formulaire vba"