dernière ligne vide d'un tableau erronée en VBA

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir
Ce fichier (vidé exprès ) ne donne plus la dernière ligne en 2 mais 3 ??? lors de la "validation" de saisie de l'usf
J'ai fait un test via le module c'est bien 2 avec forcément la même instruction ... de base
C'est un fichier de reprise , peut être le tableau a t-il été mal construit .. ??
pour tester :
clik en col A > USF : juste mettre un nom + un truc > Validation
Résultat : insertion en ligne 3 ??? Pourquoi ?? comme dab .. un truc simple doit m'échapper !!
Merci à vous !!
 

Pièces jointes

  • derlig_tab.xlsm
    132.4 KB · Affichages: 30

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @herve62, @piga25,

J'avais, pour usage personnel, écrit une fonction DerLigne(...) qui retourne le numéro absolue de ligne de la dernière cellule non vide d'une colonne entière.
Cette fonction doit fonctionner qu'on soit en présence ou non d'une structure tableau. Que la colonne soit filtrée ou non, le résultat n'en est pas affecté. Elle est indépendante des noms des en-têtes et du nom du tableau. Je vous la livre brute de décoffrage.
Dans le fichier joint, on peut comparer le résultat avec une structure tableau en utilisant soit End(xlup) soit la fonction DerLigne(...). Idem dans feuil2 mais avec une simple plage. Sur Feuil2 la plage est en outre filtrée.

VB:
Function DerLigne(xrg As Range)
'considère la première cellule du range xrg
'considère toute la colonne de la feuille correspondante à cette cellule
'recherche la dernière cellule non vide cette colonne
'retourne le numéro de ligne de cette dernière cellule non vide
'si la colonne est entirement vide, alors 0 est renvoyé
'doit fonctionner avec ou sans une structure de type tableau
'doit fonctionner avec ou sans filtrage
Dim der1 As Long, der2 As Long, x
  On Error Resume Next
  x = 9E+99: der1 = Application.WorksheetFunction.Match(x, xrg(1, 1).EntireColumn, 1)
  x = String(255, Chr(255)): der2 = Application.WorksheetFunction.Match(x, xrg(1, 1).EntireColumn, 1)
  If der2 > der1 Then DerLigne = der2 Else DerLigne = der1
  On Error GoTo 0
End Function
 

Pièces jointes

  • mapomme- derlig- v1a.xlsm
    37.8 KB · Affichages: 23
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour tous
@piga25 : oui mais ensuite il faut remodifier les variables , car si tu a remarqué dans mon code Dlg est utilisé et donc si par ex = 4 les données suivantes écraseront les anciennes !
@Efgé : je pige pas ta syntaxe ?
Mapomme c'est la solution qui fonctionne ; Je connaissais d'autres fonctions au cas ou : formules , MFC , mais pas celle-ci ; j'ai déjà mis ton fichier super bien expliqué dans mon grenier !
 

Efgé

XLDnaute Barbatruc
Bonjour
La ligne de code te donne la ligne de la dernière cellule remplie de la colonne.
La première foi que tu l'utilise, le tableau est vide, donc tu trouves la deuxième lignes.
Ensuite tu continus à trouver la ligne deux car c'est la dernière remplie du tableau.
Dans le code il faut vérifier avant d'écrire, si la cellule en A2 est remplie.
Si elle est vide tu écrits en A2, sinon tu utilise :
LstRw = Range("Diffusion[Nom du chien]")(Range("Diffusion[Nom du chien]").Count).Row +1

En espérant que mes explications soient compréhensibles.
Cordialement
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re
Oui , Ok je pensais que c'était une instruction générale permettant de donner systématiquement le der Lig lorsque c'était un tableau
comme l'exemple de MaPomme !
Sinon en même temps , je viens de remarquer que juste pour cette LIGNE 2 > si l'on fait "supprimer" : ne "delete" pas l'image ???
 

Efgé

XLDnaute Barbatruc
Re
je pensais que c'était une instruction générale permettant de donner systématiquement le derLig lorsque c'était un tableau
C'est ça. Mais ton tableau commence sans lignes de données , donc il faut faire un vérification du type
If A2 = "" j'écrit en A2
Else j'écrit en A & LstRw +1

je viens de remarquer que juste pour cette LIGNE 2 > si l'on fait "supprimer" : ne "delete" pas l'image ???
Là je laisse d'autres prendre le sujet ;)

Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour trouver le nombre de ligne d'un tableau dont fait partie une cellule Cel, c'est Cel.ListObject.ListRows.Count.
Mais on n'en a pas besoin pour obtenir un Range représentant une nouvelle ligne ajoutée: C'est LOt.ListRows.Add.Range, si Private LOt As ListObjet en tête et dans l'UserForm_Initialize: Set LOt = Sheets("Liste diffusion").ListObjects(1)
 

Discussions similaires

Statistiques des forums

Discussions
314 079
Messages
2 105 480
Membres
109 378
dernier inscrit
saddasdsad