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?
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.
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).
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
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
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)