web-dev-qa-db-fra.com

Obtenir la gamme utilisée actuelle

J'ai une feuille de calcul Excel avec un bouton.

Lorsque j'appelle la fonction usedRange (), la plage renvoyée inclut la partie bouton. 

Y a-t-il un moyen de me procurer une plage réellement utilisée contenant des données?

17
thinkanotherone

Quel type de bouton, ni un contrôle de formulaire ni un contrôle ActiveX ne devrait affecter la plage utilisée.

C'est un problème connu, Excel ne suit pas très bien la plage utilisée. Toute référence à la plage utilisée via VBA réinitialisera la valeur à la plage actuelle utilisée. Essayez donc d’exécuter cette sous-procédure:

Sub ResetUsedRng()
    Application.ActiveSheet.UsedRange 
End Sub 

Si vous ne le faites pas, vous aurez peut-être un peu de formatage en suspens. Essayez d'effacer/supprimer toutes les cellules après votre dernière ligne.

En ce qui concerne ce qui précède, voir aussi:

Astuce pour les développeurs Excel

Une autre méthode pour trouver la dernière cellule utilisée:

    Dim rLastCell As Range

    Set rLastCell = ActiveSheet.Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)

Changez le sens de la recherche pour trouver la première cellule utilisée.

32
Reafidy

Readify a donné une réponse très complète. Pourtant, je voulais ajouter la déclaration End, vous pouvez utiliser:

Recherchez la dernière cellule utilisée, avant un blanc dans une colonne:

Sub LastCellBeforeBlankInColumn()
Range("A1").End(xldown).Select
End Sub

Trouver la dernière cellule utilisée dans une colonne:

Sub LastCellInColumn()
Range("A" & Rows.Count).End(xlup).Select
End Sub

Recherchez la dernière cellule avant un blanc d'affilée:

Sub LastCellBeforeBlankInRow()
Range("A1").End(xlToRight).Select
End Sub

Trouvez la dernière cellule utilisée dans une rangée:

Sub LastCellInRow()
Range("IV1").End(xlToLeft).Select
End Sub

Voir ici pour plus d'informations (et l'explication de pourquoi xlCellTypeLastCell n'est pas très fiable).

20
JMax

Voici une paire de fonctions pour renvoyer la dernière ligne et la dernière colonne d'une feuille de calcul, basées sur la solution de Reafidy ci-dessus.

    Function LastRow(ws As Object) As Long

        Dim rLastCell As Object
        On Error GoTo ErrHan
        Set rLastCell = ws.Cells.Find("*", ws.Cells(1, 1), , , xlByRows, _
                                      xlPrevious)
        LastRow = rLastCell.Row

    ErrExit:
        Exit Function

    ErrHan:
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
               vbExclamation, "LastRow()"
        Resume ErrExit

    End Function

    Function LastCol(ws As Object) As Long

        Dim rLastCell As Object
        On Error GoTo ErrHan
        Set rLastCell = ws.Cells.Find("*", ws.Cells(1, 1), , , xlByColumns, _
                                      xlPrevious)
        LastCol = rLastCell.Column

    ErrExit:
        Exit Function

    ErrHan:
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
               vbExclamation, "LastRow()"
        Resume ErrExit

    End Function
5
davidlandy
Public Sub FindTrueUsedRange(RowLast As Long, ColLast As Long)
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    RowLast = 0
    ColLast = 0
    ActiveSheet.UsedRange.Select
    Cells(1, 1).Activate
    Selection.End(xlDown).Select
    Selection.End(xlDown).Select
    On Error GoTo -1: On Error GoTo Quit
    Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Activate
    On Error GoTo -1: On Error GoTo 0
    RowLast = Selection.Row
    Cells(1, 1).Activate
    Selection.End(xlToRight).Select
    Selection.End(xlToRight).Select
    Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Activate
    ColLast = Selection.Column
Quit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    On Error GoTo -1: On Error GoTo 0
End Sub
3
David F Mayer

J'utilise le code vba suivant pour déterminer la totalité de la plage de lignes utilisée par la feuille de calcul afin de raccourcir la plage sélectionnée d'une colonne:

    Set rUsedRowRange = Selection.Worksheet.UsedRange.Columns( _
    Selection.Column - Selection.Worksheet.UsedRange.Column + 1)

Fonctionne également dans l'autre sens:

    Set rUsedColumnRange = Selection.Worksheet.UsedRange.Rows( _
    Selection.Row - Selection.Worksheet.UsedRange.Row + 1)
0
swhgraham