3 votes

Comment localiser la dernière ligne de cellules dans une plage qui correspond en utilisant VBA ?

Il y a une colonne dans un tableau où les noms des usines sont affichés mais je n'ai besoin que des données pour un nom d'usine spécifique (disons l'usine "Australie").

Mon idée est de localiser les premières et dernières lignes qui correspondent car les données pour la même usine sont toujours présentées de manière consécutive. De cette façon, je peux obtenir la plage de cellules qui correspondent à ma recherche.

Localiser la position de la première ligne correspondante est assez facile mais je bloque pour obtenir la position de la dernière ligne correspondante.

Voici le code concernant cette section :

Sub Chercher()

Dim sh As Worksheet
Dim searchStr As String
Dim lastRow As Long, firstRow as Long
Dim tableRange As range

Set sh = Worksheets("Commande totale")
searchStr = "Australie"
Set tableRange = sh.range("B:B").Find(what:=searchStr, LookIn:=xlValues, lookat:=xlWhole)
firstRow = tableRange.Row

End Sub

Un exemple du tableau traité :

description de l'image ici

3 votes

Set tableRange = tableRange.Resize(Application.Countif(sh.range("B:B"), searchStr)) vous donnera B4:B7

0 votes

@Tim c'est génial....

0 votes

@TimWilliams Merci beaucoup mais puis-je demander comment accéder à cette plage? (ou seulement accéder à B7 de cette plage) Je veux enregistrer la position de la ligne dans "lastRow". Cependant, lorsque je définis lastRow = tableRange.Row suivant votre code, il ne montre que "4".

2voto

VBasic2008 Points 14466

Référez-vous à la plage de la cellule de la première à la cellule de la dernière occurrence d'une chaîne dans une colonne

Une note de côté

  • Le Méthode Range.Find est un peu délicat. Par exemple, vous pourriez ne pas être conscient que dans votre code la recherche commence à partir de la cellule B2 (ce qui est même préférable dans ce cas), et l'utilisation de xlValues peut entraîner des résultats indésirables si des lignes sont masquées (probablement pas important).

Utilisation

  • En utilisant la fonction, selon la capture d'écran, vous pourriez (après searchStr = "Australie") utiliser:

    Set tableRange = refRangeFirstLast(sh.Columns("B"), searchStr)

    pour vous référer à la plage B4:B7, ou utiliser:

    Set tableRange = refRangeFirstLast(sh.Columns("B"), searchStr).Offset(, -1).Resize(, 4)

    pour vous référer à la plage A4:D7.

Le Code

Function refRangeFirstLast( _
    ByVal ColumnRange As Range, _
    ByVal SearchString As String) _
As Range
    If Not ColumnRange Is Nothing Then
        With ColumnRange
            Dim FirstCell As Range: Set FirstCell = _
                .Find(SearchString, .Cells(.Cells.Count), xlFormulas, xlWhole)
            If Not FirstCell Is Nothing Then
                Dim LastCell As Range: Set LastCell = _
                    .Find(SearchString, , xlFormulas, xlWhole, , xlPrevious)
                Set refRangeFirstLast = .Worksheet.Range(FirstCell, LastCell)
            End If
        End With
    End If
End Function

Sub refRangeFirstLastTEST()
    Const SearchString As String = "Australia"
    Dim ColumnRange As Range
    Set ColumnRange = ThisWorkbook.Worksheets("Total order").Columns("B")
    Dim rg As Range: Set rg = refRangeFirstLast(ColumnRange, SearchString)
    If Not rg Is Nothing Then
        Debug.Print rg.Address
    Else
        MsgBox "La référence n'a pas pu être créée.", vbExclamation, "Échec?"
    End If
End Sub

0 votes

Super article @VBasic2008

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X