Userform et tableau

Bonjour à tous,

Dans mon fichier, je veux faciliter la saisie grâce à un UserForm. Le problème c'est que les éléments renseignés se placent en dessous de mon tableau...

Alors que dans mon code je lui est clairement dit de prendre la dernière cellule vide ...

Dans mon fichier joint, je veux que ma ligne 13 soit en ligne 8...

Merci pour votre aide.

Bonjour Rag02700,

Ton fichier ne comporte ni Userform ni données ni code, petite erreur de fichier ?

Cordialement,

Oups...

Voila j'ai fait la modif

24besoins-atn-v2.xlsm (35.39 Ko)

Bonsoir,

Pour commencer une tableau Excel doit rester dimensionné aux données qu'il contient : ne pas l'étendre à l'avance il s'étendra tout seul !

A partir de là la ligne d'insertion est fournie par [NomTableau].Rows.Count + 1

(On n'utilise pas End(xlUp) avec un tableau Excel...)

Et le tableau dispense de passer par la feuille (on peut l'oublier) !

Pour tenir compte d'un démarrage tableau vide (qui aura alors la 1re ligne vide), si la ligne d'insertion est 2, alors on test If [NomTableau].Cells(1, 1) = "" Then on ramène la ligne d'insertion à 1 dans ce cas.

(Ou bien si le tableau vide est une situation qui ne doit plus se produire après la première fois, on ignore et quand la ligne 2 est servie on supprime la 1 vide, et c'est réglé pour la suite.)

Cordialement.

Hello,

J'essaye de te suivre mais j'ai du mal ...

1) Quand j'utilise

 [NomTableau].Rows.Count + 1

dans ma variable

derligne

, mes données saisies dans mon UserForm se copient en ligne 2... et non dans la première ligne de mon tableau soit la 8 ...

2) Il faut que la saisie de mon userform se colle au démarrage dans la première ligne du tableau (en dessous des en têtes) et ensuite quand je veux refaire une saisie il insère ma saisie en dessous de la ligne que je viens de créer par rapport à la colonne J ...

Private Sub CommandButton1_Click()

Dim ctrl As Control
Dim Colonne As Integer
Dim derligne As Integer

'Trouve la derniere ligne du tableau
'derligne = Sheets("BDD").Range("I10000").End(xlUp).Row + 1

derligne = Range("Base[[#Headers],[Candidats présentés]]").Rows.Count + 1

'balaye les controles un par un
For Each ctrl In UserForm1.Controls

'la valeur de "Colonne" = tag du controle
Colonne = Val(ctrl.Tag)

If Colonne > 0 Then Sheets("BDD").Cells(derligne, Colonne) = ctrl

Next

End Sub

Bonjour,

Quand tu utilises un tableau dans une feuille de calcul Excel, je te conseille d'utiliser une variable objet "ListObject" afin de ne travailler que sur cet objet par la suite sans te préoccuper de la feuille. Un petit exemple :

Sub Test()

    Dim Base As ListObject

    Set Base = Worksheets("BDD").ListObjects("Base")

    MsgBox Base.DataBodyRange.Address(0, 0) 'adresse de la plage utilisée par le tableau pour stocker les données
    MsgBox Base.DataBodyRange.Cells(1, 1).Address(0, 0) 'adresse de la première cellule du tableau (hors entête) A8 pour toi
    MsgBox Base.HeaderRowRange.Address(0, 0) 'adresse des entêtes
    MsgBox Base.DataBodyRange.Rows.Count

    'donc, pour entrer une valeur dans la cellule vide sous le tableau (elle sera, une fois la valeur entrée, intégrée au tableau)
    With Base.DataBodyRange
        .Cells(.Rows.Count + 1, 1).Value = "Test"
    End With
    'etc...

End Sub

Hello,

Mais du coup comment j'insère ma variable CTRL ??

En faisant comme ça ?

       With Base.DataBodyRange
        .Cells(.Rows.Count + 1, colonne).Value = ctrl
    End With        

Merci.

Bonjour, Salut à tous !

Je vois que nous sommes pleinement d'accord sur le fond avec Theze ! La petite différence est que je te propose juste de faire l'économie de la définition de l'objet tableau Excel-plage de données dans une variable...

Reprenons, la première chose est de supprimer les lignes en trop dans ton tableau Base, au départ : la ligne d'en-tête et une seule ligne de données, vide.

Tu as nommé ton tableau Base, Excel a introduit ce nom Base automatiquement dans le gestionnaire de noms, tu peux l'y retrouver en allant voir, comme les noms de tous tes autres tableaux Excel, et ce n'est pas toi qui les y a mis...

Et Excel lui a donné comme définition la plage de données de ton tableau.

C'est à dire : ListObjects("Base").DataBodyRange représente exactement la même chose que Range("Base") ou en notation compacte [Base], et que donc tu en disposes déjà sans avoir à le redéfinir.

J'écris donc ainsi ta procédure d'affectation :

Private Sub CommandButton1_Click()
    Dim ctrl As Control, Col%, dLn%
    With [Base]
        dLn = .Rows.Count + 1
        If dLn = 2 Then dLn = IIf(.Cells(1, 1) <> "", 2, 1)
        For Each ctrl In Me.Controls
            Col = Val(ctrl.Tag)
            If Col > 0 Then .Cells(dLn, Col) = ctrl.Value
        Next ctrl
    End With
End Sub

On réfère à l'objet Base (plage de données), on définit la première ligne sous le tableau (comptée à partir de la première ligne du tableau), si on obtient 2, on teste la 1re cellule de la 1re ligne (cellule (1, 1) du tableau de données, si 1re ligne servie Ok pour 2, si 1re ligne vide on ajuste la der ligne à 1 pour ne pas la laisser vide.

Le reste sans changement par rapport à ton code initial, sauf qu'on adresse la valeur à la cellule (dLn, Col) du tableau sans s'être jamais préoccupé de la feuille. Et la ligne ajoutée sera automatiquement incorporée au tableau par Excel.

Cordialement.

Hello MFerrand,

Le fait d'utiliser une variable ListObject facilite l'écriture du code grâce à l'Intellisense

Salut Theze !

Chaque fois que je peux me dispenser d'écrire, je n'hésite pas à le faire ! Si Excel me fournit un nom dans le classeur qui réfère à la plage que je dois servir, soit ListObject.DataBodyRange, l'utilisation de ce nom me suffit !

Et quand je n'ai pas de Tableau Excel, donc de nom placé automatiquement par Excel, j'en crée un (dynamique), qui remplira le même usage.

Ce qui me permet d'être toujours en adressage relatif par rapport à la plage de données ciblée, et d'oublier la feuille. Le tout avec un minimum de code...

Merci Messieurs le fichier est opérationnel.

J'ai encore appris des choses

Juste pour la forme,

ça serait cool si je pouvais verrouiller les colonnes à la fin de mon tableau (colonne R à U), j'ai essayé de lancer mon Userform mais ça fonctionne pas bien du coup...

Avez-vous une petite idée ??

Merci.

Rechercher des sujets similaires à "userform tableau"