Trouver la dernière cellule vide en remontant un tableau

Bonsoir le Forum

Pour les besoins d’un tableau de saisies de tensions artérielles j’aurais besoin de votre aide pour retrouver en VBA la dernière cellule vide en remontant le tableau.

Les données :

Sur une feuille nommée « RELEVES » j’ai une plage de cellules nommée « SAISIES » qui s’étend de « D4 » à « AH21 » soit sur 31 colonnes et 18 lignes (les cellules colorées moins les deux premières colonnes des exemples joints).

La plage « SAISIES » est libre, toutes les autres cases sont verrouillées et la feuille est protégée. Seules les cellules libres sont sélectionnables.

Vous l’aurez compris, ce tableau est à remplir colonne par colonne (jour par jour) de haut en bas. Normalement … il est complet, mais … s’il arrivait que des mesures manquent en cherchant la première cellule vide on tomberait dans un « trou ».

Je souhaiterais donc remonter depuis la dernière case « AH21 » jusqu’à la case « AH4 » et continuer sur la colonne précédente jusqu’à la case qui précède la dernière valeur saisie puis activer cette cellule.

Soit les cellules « Z13 » et « AA4 » des exemples joints.

Merci d’avance de m’avoir lu ainsi que pour le temps consacré à la résolution. Il va de soi, que j’ai épluché divers forums et sites d’aide, malheureusement sans trouver de solution.

exemple1 exemple2

bonsoir Jean-Laurent,

un essai :

Sub Teste()
     Set c = Sheets("Releves").Range("D4:AH21")
     c.Name = "Saisies"
     x = Evaluate("IFERROR(aggregate(14,6,(column(saisies)+row(saisies)/100)/(saisies<>""""),1),0)")     'de la dernière cellule, colonne + (ligne/100)

     If x = 0 Then
          Set c0 = c.Cells(1)                'complètement vide
     Else
          Set c0 = c.Parent.Cells((x * 100) Mod 100, x \ 1).Offset(1)     '=1 cellule en dessous la dernière cellule
          If Intersect(c, c0) Is Nothing Then     'encore dans "Saisies" ?
               Set c0 = c0.Offset(c.Row - c0.Row, 1)     '1 colonne vers droite & 1ière ligne de "saisies"
               If Intersect(c, c0) Is Nothing Then     'encore dans "saisies"
                    Set c0 = Nothing
               End If
          End If
     End If

     If c0 Is Nothing Then
          MsgBox "erreur"
     Else
          Application.Goto c0, 1
          MsgBox "cellule : " & c0.Address
     End If

End Sub

méthode 2 :

Sub Teste()
     Set c = Sheets("Releves").Range("D4:AH21")
     c.Name = "Saisies"

     Set c0 = c.Find("*", After:=c.Cells(1), searchorder:=xlByColumns, searchdirection:=xlPrevious)

     If c0 Is Nothing Then
          Set c0 = c.Cells(1)                'complètement vide
     Else
          Set c0 = c0.Offset(1)              '=1 cellule en dessous la dernière cellule
          If Intersect(c, c0) Is Nothing Then     'encore dans "Saisies" ?
               Set c0 = c0.Offset(c.Row - c0.Row, 1)     '1 colonne vers droite & 1ière ligne de "saisies"
               If Intersect(c, c0) Is Nothing Then     'encore dans "saisies"
                    Set c0 = Nothing
               End If
          End If
     End If

     If c0 Is Nothing Then
          MsgBox "erreur"
     Else
          Application.Goto c0, 1
          MsgBox "cellule : " & c0.Address
     End If

End Sub

Bravo et un grand Merci Bart autant pour la rapidité que l'efficacité des réponses.

Les deux méthodes fonctionnent parfaitement, mais j'avoue que je n'y comprends rien.

Pas étonnant donc que tous mes essais se soient soldés par de cuisants échecs ;-)

re,

Set c0 = c.Find("*", After:=c.Cells(1), searchorder:=xlByColumns, searchdirection:=xlPrevious)

= on se positionne dans la première cellule de la plage D4:AH21, cad D4 et on commence à chercher avec direction "xlprevious" (=avant cette cellule) et on utilise "xlbycolumns" (= les colonnes), donc le système de vos flèches, la séquence sera AH21>>>AH4, puis AG21>>>AG4, ... jusqu'à la première cellule non-vide (= ce "*").

Vous voulez le suivant, ben c'est la cellule en dessous, mais si cette cellule est hors la plage (ligne 22), on prend la cellule de la colonne suivante et la ligne 4. Si cela est de nouveau hors la plage, cela veut dire que AH21 n'est pas vide, donc il n'y a pas de solution. Si le "Find" ne trouve rien, cela veut dire que la plage est complètement vide.

L'autre méthode est pareil

Merci pour l'explication, comme ça je comprends mieux.

Et du coup j'ai remplacé votre instruction (MsgBox "erreur"), par la mienne (GoTo Complet) qui renvoie vers une boite de dialogue indiquant que la saisie pour le mois est complète.

Encore Merci et Bravo.

Jean-Laurent

Rechercher des sujets similaires à "trouver derniere vide remontant tableau"