XL 2010 Petite colle sur cherche dernière ligne vide contenant des formules

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Je devais utiliser pour une boucle un For de 1 ou 2 jusqu'à la dernière ligne de données
Ce que je n'avais pas vu au début c'est qu'il y avait une formule dans la colonne de test donc le End(xlup) ne fonctionne pas
Il y a qq années j'avais rencontré ce Pb et j'avais pu trouver un remède via une Fonction
Mais là encore je comprends pas , avec le fichier d'origine (DL Formule) cela ne va pas , voir Sub testDL
J'en ai donc créé un autre (der ligne) avec qq lignes copier/coller du 1er et là ça fonctionne !
Je vois pas ???
 

Pièces jointes

  • Der_ligne.xlsm
    23.4 KB · Affichages: 16
  • DL_formules.xlsm
    452.3 KB · Affichages: 11

chris

XLDnaute Barbatruc
RE

Cela ne sert à rien d'avoir des lignes vides avec seulement des formules car dans un tableau structuré elles se dupliquent automatiquement sur toute nouvelle ligne, de même que les formats, MFC et validation incluses
 

Dudu2

XLDnaute Barbatruc
Bonjour @herve62, @chris,
Je souscris aux remarques de @chris sur les tableaux structurés. Même si la syntaxe d'utilisation dans les formules ou en VBA n'est pas très intuitive.

Je reviens sur ta signature
L'expérience est un amas de conneries , plus on en fait plus ......
Je suppose que tu laisses entendre qu'on devient con. Certes, mais si on sait en tirer les leçons, plus on en a fait moins on en fera, ce qui ne corrige évidemment pas celles qu'on a faites mais laisse un peu d'espoir 🥸.
 

Dudu2

XLDnaute Barbatruc
Hé bé ! Ça c'est un réponse amicale.
1626870877138.gif

Je t'en ferais bien une idoine, mais c'est pas mon style.
1626870978394.gif
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Hervé, Dudu2,

allons, allons, ne vous fâchez pas ! je pense qu'il s'agit juste d'un petit malentendu, et je vous propose à tous les deux de lire ce livre passionnant et très instructif : « Le principe de Peter » ; en résumé : « dans une hiérarchie, toute personne a tendance à s'élever jusqu'à son niveau d'incompétence ! » 😜 😂 🤣 alors peut-être que « niveau d'incompétence = un amas de conneries » ? :rolleyes:

soan
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'utilise volontiers selon ce que je veux faire, Set Rng = PlageÀPartirDe(Cel), ColUti(Cel) ou PlgUti(Cel) quand je ne peux pas récupérer de Cel.ListObject.DataBodyRange
VB:
Function PlageÀPartirDe(ByVal CelDéb As Range) As Range
Rem. ——— Plage utilisée à partir de CelDéb.
   Dim NbrLig As Long, NBrCol As Long
   With CelDéb.Worksheet.UsedRange:
      NbrLig = .Row + .Rows.Count - CelDéb.Row
      NBrCol = .Column + .Columns.Count - CelDéb.Column
      If NbrLig <= 0 Or NBrCol <= 0 Then Exit Function
      End With
   Set PlageÀPartirDe = CelDéb.Resize(NbrLig, NBrCol)
   End Function
Function ColUti(ByVal PlageDép As Range, Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. ——— Plage renseignée de plus qu'une chaîne vide à partir de PlageDép et ce seulement dans ses colonnes dans la UsedRange.
   Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn), LMin, CMin)
   End Function
Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing, _
   Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. ——— Plage renseignée de plus qu'une chaîne vide à partir de PlageDép dans PlageExam assumé UsedRange si non précisé.
   Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
   On Error GoTo RienTrouvé
   If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
   LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
   CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
   On Error GoTo 0
   NbL = LMax - PlageDép.Row + 1: If NbL < LMin Then NbL = LMin
   NbC = CMax - PlageDép.Column + 1: If NbC < CMin Then NbC = CMin
   If NbL < 1 Or NbC < 1 Then GoTo CEstToutVide
   Set PlgUti = PlageDép.Resize(NbL, NbC)
   Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
   End Function
Ça évite aussi, pour une boucle, d'avoir à chercher la dernière ligne de la plage, puisqu'on à ensuite Rng.Rows.Count ou même UBoud(TDon, 1) si on a fait, comme je le conseille toujours TDon = Rng.Value
 

Dranreb

XLDnaute Barbatruc
Dans le DL_formules.xlsm :
VB:
Sub TestDranreb()
   PressePapier = "PlageÀPartirDe([A2]).Address = " & PlageÀPartirDe([A2]).Address _
      & vbLf & "ColUti([A2]).Address = " & ColUti([A2]).Address _
      & vbLf & "PlgUti([A2]).Address = " & PlgUti([A2]).Address
   MsgBox PressePapier, vbInformation, "TestDranreb"
   End Sub
Copie et affiche :
PlageÀPartirDe([A2]).Address = $A$2:$E$29836
ColUti([A2]).Address = $A$2:$A$100
PlgUti([A2]).Address = $A$2:$E$100
Avec les 2 derniers, les formules renvoyant un texte vide sont ignorées.

(PressePapier est une property de mon classeur de macro dont j'ai mis le projet en référence pour m'éviter de taper ici ce que ça affichait)
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
alors peut-être que « niveau d'incompétence = un amas de conneries » ?
Bon stop , je vais lever le doute et puis ce n'est pas moi qui est allé fouiné dans ma signature , pourquoi ?? ce n'était en aucun cas dans le sujet !! , dans les séminaires de grosses entreprises niveau mondial ou j'étais ( ERICSON) j'ai eu cette remarque d'un cadre : L'expérience est un amas de conneries , plus on en fait plus .... et ben tout simple..... plus on a d'expérience et donc reconnu de la hiéarchie , ça ne vient pas du tout de moi mais cela m'avait marqué à l'époque (1992)
merci Bernard mais c'est trop compliqué , enfin trop lourd à greffer dans du code simple moi je suis dépassé

Sinon Personne n'a répondu à mon Pb puisque j'ai une fonction qui marche dans un fichier et pas dans l'autre et je cherche POURQUOI ???? relisez bien mon post d'ouverture du sujet !
 

Dranreb

XLDnaute Barbatruc
Il ne faut pas exagérer, ces Function ne sont pas si grosses quand même ! Elles se mettent à part dans un module standard alors on peut les appeler de n'importe où dans le projet sans avoir besoin de se rappeler ce qu'il y a dedans.
Des End(xlUp) ne marchent pas parce qu'une cellule contenant une formule n'est pas vide. Tandis que mon ColUti(cellule de départ) cherche en remontant la dernière cellule valant quelque chose de plus significatif qu'un texte vide.
ColUti([E2]).Address = $E$2:$E$100

Cela dit dans le Der_ligne.xlsm vous interrogez la colonne A qui ne contient pas de formule après la partie utile, tandis que dans le DL_formules.xlsm vous interrogez la colonne E qui en contient.
Il semble donc que votre Function DerLigne n'ignore pas les formules renvoyant un texte vide. Mes Function ColUti et PlgUti, si.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir à tous,

Oui c'est une petite colle car il suffit de mettre une boucle dans la fonction utilisée au post #1 :
VB:
Function DerLigne(xrg As Range)
Set xrg = xrg(1) 'si plus d'une cellule
Do
    If Trim(CStr(xrg)) <> "" Then DerLigne = xrg.Row: Exit Function
    Set xrg = xrg(0) 'cellule au dessus
Loop While xrg.Row > 1
End Function
A+
 

Discussions similaires