Trouver limite d'un tableau en VBA

Bonjour,

Je crois avoir vu une solution en vba permettant de connaitre la dernière ligne vide et la dernière colonne vide d'un tableau variable sans faire une recherche sur une colonne et sur une ligne en particulier car on ne sais pas quelle est la plus longue, mais bien en prenant en compte toutes les colonnes et toutes les cellules.

Mais pas moyen de retrouver ce code.

Est-ce que l'un d'entre vous a la solution ?

Sur le fichier joint j'ai mis 3 exemples (sur 3 feuilles) du même tableau remplis différemment ou je dois trouver les limites (qui sont les mêmes dans mes 3 exemples

J'espère avoir posé mon problème correctement.

Merci d'avance pour votre aide

bonsoir,

C'est pas des tableaux... C'est des passoires !

Pas évident.

A+

galopin01 a écrit :

bonsoir,

C'est pas des tableaux... C'est des passoires !

Pas évident.

A+

Oui, c'est bien le bute pour illustrer ma question.

Bonjour,

la dernière cellule occupée ou bien qui l'a été (ce n'est pas pareil) est trouvée avec ça non ?

ActiveCell.SpecialCells(xlLastCell).Select

P.

Hello, hello

Voici une proposition, qui cherche le chiffre de ligne occupé le plus élevé des dernières lignes dans les 9 1er colonne du tableau :

Sub bouclagecolonne()
i = 1 'détermine le début pour le nombre de tour de la boucle do while
col = 1 '1 = colonne A
Do While i < 10 'fait une boucle sur 9 colonne tant que inférieur à 10 (soit 9)
Cells(1048576, col).Select
Selection.End(xlUp).Select
If Selection.Row > Range("K1").Value Then 'indexation dernière ligne connue en cours du tableau dans une cellule technique servant de mémoire
Range("K1").Value = Selection.Row 'La cellule en K1 récupère le chiffre de la ligne la plus élevée de son bouclage sur les 9 1er colonnes
End If
i = i + 1 'passe à la boucle suivant
col = col + 1 'passe à la colonne suivante
Loop

End Sub


Re:

Je savais que j'avais déjà vu la problématique dans un blog l'été dernier, regardez ce site de Michel Defawes, la démo est pas mal :

http://www.info-3000.com/vbvba/selectioncellule/selectioncellule.php

Bonjour,

Essaie :

Public Sub DEMO()
Dim ws As Worksheet
Dim rCell As Range
    For Each ws In ActiveWorkbook.Worksheets
        Set rCell = ws.Cells.SpecialCells(xlCellTypeLastCell)
        MsgBox rCell.Address
    Next ws
    Set rCell = Nothing
End Sub

Bonjour à tous,

MsgBox Cells(Cells.Find("*", , , , xlByRows, xlPrevious).Row, Cells.Find("*", , , , xlByColumns, xlPrevious).Column).Address

eric

bonsoir

Je pense que La solution de "eriiic " est la bonne, elle est utilisable pour une feuille qui peut contenir autre chose que le tableau, tandis que La solution de "Jean-Eric" est utilisable qu’ avec une feuille qui ne contient pas autre chose que tableau

Sub test1()
Dim tabl
Set tabl = Range("a1:f9")
MsgBox Cells(tabl.Find("*", , , , xlByRows, xlPrevious).Row, tabl.Find("*", , , , xlByColumns, xlPrevious).Column).Address
End Sub
Sub test2()
Dim tabl
Set tabl = Range("a1:f9")
MsgBox tabl.SpecialCells(xlCellTypeLastCell).Address
End Sub

Bonjour,

Attention à SpecialCells(xlCellTypeLastCell) quand même.

Si j'ai écrit en K32 puis supprimé cette valeur il continuera à dire que c'est la dernière cellule même si en réalité c'est D19.

De plus il se moque qu'on l'applique à la plage a1:f9, il regardera la feuille entière.

Pas utilisable pour cet usage donc.

eric

Il faut donc nettoyer la feuille avec le code de Laurent LONGRE

P.

Bonjour,

Et une autre proposition à étudier.

Cdlt.

Option Explicit

Public Sub DEMO()
Dim ws As Worksheet
Dim rng As Range, rCell As Range
    For Each ws In ActiveWorkbook.Worksheets
        Set rng = ws.UsedRange
        Set rCell = rng.SpecialCells(xlCellTypeLastCell)
        MsgBox rCell.Address
    Next ws
    Set rCell = Nothing: Set rng = Nothing
End Sub

Bonjour à tous,

On peut écrire aussi :

Sub test()
    With ActiveSheet
        MsgBox UBound(.Range(.Range("A1"), .UsedRange.Address).Value)    ' nb de lignes
    End With
End Sub

et pour le nb de colonnes :

MsgBox UBound(.Range(.Range("A1"), .UsedRange.Address).Value, 2)

Pierre

Bonjour a tous,

Merci beaucoup pour touts vos réponses.

Avec toutes ces suggestions, je devrais m'en sortir.

Je vous tiendrais au courant de mon code final.

Encore merci

Re-Bonsoir,

A priori la proposition d'eriiic fonctionne bien.

eriiic a écrit :

Bonjour à tous,

MsgBox Cells(Cells.Find("*", , , , xlByRows, xlPrevious).Row, Cells.Find("*", , , , xlByColumns, xlPrevious).Column).Address

eric

voila mon code :

Sub test()
Dim adresse As String
adresse = Cells(Cells.Find("*", , , , xlByRows, xlPrevious).Row, Cells.Find("*", , , , xlByColumns, xlPrevious).Column).Address
Range(adresse).Activate
MsgBox ActiveCell.Column
MsgBox ActiveCell.Row
End Sub

Il y a peut-être plus simple pour avoir le Numéro de ligne et de colonne ?

Si oui, je veux bien le code

Merci

Plus court mais tu ne peux pas restreindre à une plage. S'applique à la feuille entière :

MsgBox UsedRange.Cells(UsedRange.Count).Address

PS : quelle horreur ton code

Garde l'adresse en Range.

Et évite les .Activate, à 99% inutiles et très chronophages. D'ailleurs ici ça devrait être .Select

Sub test()
    Dim adresse As Range
    Set adresse = Cells(Cells.Find("*", , , , xlByRows, xlPrevious).Row, Cells.Find("*", , , , xlByColumns, xlPrevious).Column)
    ' adresse.Select ' inutile !
    MsgBox adresse.Column
    MsgBox adresse.Row
End Sub

Merci eriiic.

C'est super

bonjour,

Finalement je préfère le UsedRange de pierre56 plus simple :

Sub test()
With ActiveSheet
   i = .UsedRange.Rows.Count
   j = .UsedRange.Columns.Count
End With

MsgBox "Lignes : " & i
MsgBox "Colonnes : " & j
End Sub

A+

galopin01 a écrit :

bonjour,

Finalement je préfère le UsedRange de pierre56 plus simple :

Sub test()
With ActiveSheet
   i = .UsedRange.Rows.Count
   j = .UsedRange.Columns.Count
End With

MsgBox "Lignes : " & i
MsgBox "Colonnes : " & j
End Sub

A+

Dans mon cas ce code ne marche pas car il prend en compte des cellule simplement coloriées ou d'autres critères que je n'ai pas compris.

Le code d'eriiic ne prend en compte que les cellules non vide.

Teste des deux codes :

code galopin01 et pierre56

Nb de ligne = 584

Nb de colonne = 34

Code eriiic

Nb de ligne = 50

Nb de colonne = 34

Les valeurs juste sont bien 50 et 34.

BONSOIR

AMIR a écrit :

Je pense que La solution de "eriiic " est la bonne, elle est utilisable pour une feuille qui peut contenir autre chose que le tableau, tandis que La solution de "Jean-Eric" est utilisable qu’ avec une feuille qui ne contient pas autre chose que tableau

Si vous avez l intention d’utiliser la méthode UsedRange, alors utiliser la méthode SpecialCells pcq contrairement a la méthode UsedRange, la méthode SpecialCells est paramétrable.

pmfontaine a écrit :

Dans mon cas ce code ne marche pas car il prend en compte des cellule simplement coloriées ou d'autres critères que je n'ai pas compris.

Le code d'eriiic ne prend en compte que les cellules non vide.

Il ne s’agit pas de la cellule coloriée ou même des cellules vides, mais par le code d'eriiic vous pouvez limiter la zone recherchée par une plage comme j ai déjà illustré

003
Sub test1()
    Dim tabl
    Set tabl = Range("A1:E12")
    MsgBox Cells(tabl.Find("*", , , , xlByRows, xlPrevious).Row, tabl.Find("*", , , , xlByColumns, xlPrevious).Column).Address
    End Sub
002
Sub test2()
    Dim tabl
    Set tabl = Range("A1:E12")
    MsgBox tabl.SpecialCells(xlCellTypeLastCell).Address
    End Sub

Re,

alors utiliser la méthode SpecialCells pcq contrairement a la méthode UsedRange, la méthode SpecialCells est paramétrable.

il faut oublier SpecialCells(xlCellTypeLastCell)

Valide un chiffre en Z80, supprime-le et demande lui la dernière cellule.

eric

Rechercher des sujets similaires à "trouver limite tableau vba"