Comment se positionner sur la dernière ligne non vide d'un tableau ?

image

Bonjour, j’ai créé un formulaire de saisie dans lequel je rentre plusieurs causes et temps d’arrêts. Toutes les causes d’arrêts se positionnent dans la même colonne(J) avec leurs temps associés dans la colonne de droite(K).

Lorsque je remplis le formulaire, je souhaiterais que le curseur se positionne sur la dernière ligne non vide du tableau par rapport à la colonne J, (sur la photo, en A69). Or actuellement le curseur se positionne sur la dernière ligne non vide par rapport à la colonne A ce qui fait chevaucher les données les unes par rapport aux autres( en A66).

Mon code actuel est le suivant :

Private Sub btnajout_Click()
Sheets("BDD").Activate
Range("A1").Select
Selection.End(xlDown).Select 'On se positionne sur la dernière ligne non vide'
Selection.Offset(1, 0).Select 'On se décalle d'une ligne vers le bas'
ActiveCell.Offset(0, 0) = txtdate
ActiveCell.Offset(0, 1) = cbox
ActiveCell.Offset(0, 2) = cboy
ActiveCell.Offset(0, 3) = txtc
ActiveCell.Offset(0, 4) = txto
ActiveCell.Offset(0, 5) = txtpc
ActiveCell.Offset(0, 6) = txtpnf
ActiveCell.Offset(0, 7) = cboco
ActiveCell.Offset(0, 8) = cbovc
ActiveCell.Offset(0, 9) = cbocauses
ActiveCell.Offset(0, 10) = txttempsarret
ActiveCell.Offset(1, 9) = cbocauses2
ActiveCell.Offset(1, 10) = txttempsarret2
ActiveCell.Offset(2, 9) = cbocauses3
ActiveCell.Offset(2, 10) = txttempsarret3
ActiveCell.Offset(3, 9) = cbocauses4
ActiveCell.Offset(3, 10) = txttempsarret4
ActiveCell.Offset(4, 9) = cbocauses5
ActiveCell.Offset(4, 10) = txttempsarret5
ActiveCell.Offset(0, 11) = txt
MsgBox "Votre demande a bien été prise en compte !"

ActiveWorkbook.Save
End Sub

Merci d’avance de votre aide.

Bonsoir,

Essayer ce code :

Private Sub btnajout_Click()
    Dim ligne As Range

    With Sheets("BDD")
        .Activate
        Set ligne = .UsedRange.Find("*", SearchDirection:=xlPrevious).EntireRow.Offset(1)
    End With
    ligne.Cells(0, "A") = txtdate
    ligne.Cells(0, "B") = cbox
    '.....................

Bonjour à tous,

Ca ne concerne pas directement le problème mais pourquoi ne pas créer 8 colonnes supplémentaires ? C'est pas très pratique d'avoir des bases en P horizontal avec des valeurs écrasées par les suivantes.

Cdlt,

Le code part de range A1. Select, donc le end.xldown part de là, non? Si on part de range J1 et qu'on ajoute un offset pour revenir sur la colonne A, çà devrait coller

Range("J1").Select
Selection.End(xlDown).Select 'On se positionne sur la dernière ligne non vide'
Selection.Offset(1, -9).Select 'On se décalle d'une ligne vers le bas' et on raméne dans la colonne A
ActiveCell.Offset(0, 0) = txtdate

on peut faire aussi

Selection.Offset(1, -9).value = txtdate

image image

Bonsoir à tous, les deux codes marchent merci !!!!!! J'ai besoin que toutes les données soient dans la même colonne pour pouvoir effectuer différentes analyses par la suite. J'ai juste un petit problème, l'opérateur peut choisir jusqu'à 5 causes/observations et leurs temps d'arrêts associés. Cependant lorsque les données sont ajoutées dans la base de donnée, le programme saute 5 lignes comme l'opérateur peut ajouter jusqu'à 5 causes. Dans le cas ou l'opérateur rentre simplement une/deux/trois/quatre causes d'arrêts, est-il possible qu'il s'adapte et ne saute pas ces lignes car j'ai peur que le fichier devienne trop lourd avec le temps.

Voici le code utilisé actuellement :

Sheets("BDD").Activate
Range("J1").Select
Selection.End(xlDown).Select 'On se positionne sur la dernière ligne non vide'
Selection.Offset(1, -9).Select 'On se décalle d'une ligne vers le bas' et on raméne dans la colonne A'
ActiveCell.Offset(0, 0) = txtdate
ActiveCell.Offset(0, 1) = cboposte
ActiveCell.Offset(0, 2) = cbooperateur
ActiveCell.Offset(0, 3) = txtclient
ActiveCell.Offset(0, 4) = txtof
ActiveCell.Offset(0, 5) = txtpiecesconf
ActiveCell.Offset(0, 6) = txtpiecesnonconf
ActiveCell.Offset(0, 7) = cbochangementoutils
ActiveCell.Offset(0, 8) = cbovitessechaine
ActiveCell.Offset(0, 9) = cbocauses
ActiveCell.Offset(0, 10) = txttempsarret
ActiveCell.Offset(1, 9) = cbocauses2
ActiveCell.Offset(1, 10) = txttempsarret2
ActiveCell.Offset(2, 9) = cbocauses3
ActiveCell.Offset(2, 10) = txttempsarret3
ActiveCell.Offset(3, 9) = cbocauses4
ActiveCell.Offset(3, 10) = txttempsarret4
ActiveCell.Offset(4, 9) = cbocauses5
ActiveCell.Offset(4, 10) = txttempsarret5
ActiveCell.Offset(0, 11) = txtcommentaire
MsgBox "Votre demande a bien été prise en compte !"

Merci d'avance de votre aide

Deux questions:

tous les champs sont dans le même userform ?

la ligne commentaires est globale ou rattachée à une et seule cause

Une première piste : compter le nombre de cbo complétées au moment de la validation et créer le nombre de lignes correspondant.

Perso, j'aurais aussi répété la date dans la colonne A, plus facile ensuite pour utiliser des tcd

Bonsoir, oui tous les champs sont dans le même userform. La ligne commentaire est globale.

Une première piste :compter le nombre de cbo complétées au moment de la validation et créer le nombre de lignes correspondant. C'est une très bonne idée mais ne sachant pas comment faire je suis passée par une autre méthode plus simple et qui marche très bien.

Merci beaucoup pour votre aide.

Au cas ou, il y a une autre solution avec une boucle for each

For each textbox <>""

le code existant

Next textbox

A bientôt

Rechercher des sujets similaires à "comment positionner derniere ligne vide tableau"