it-swarm.it

Ottenere l'attuale usato

Ho un foglio di lavoro Excel con un pulsante.

Quando chiamo la funzione usedRange (), l'intervallo restituito include la parte button. 

C'è comunque che posso solo ottenere l'attuale intervallo utilizzato che contiene i dati?

17
thinkanotherone

Che tipo di pulsante, né un controllo Forms né un controllo ActiveX dovrebbero influire sull'intervallo utilizzato.

È un problema noto che Excel non tiene traccia degli intervalli utilizzati molto bene. Qualsiasi riferimento all'intervallo utilizzato tramite VBA reimposterà il valore sull'intervallo corrente utilizzato. Quindi prova a eseguire questa sottoprocedura:

Sub ResetUsedRng()
    Application.ActiveSheet.UsedRange 
End Sub 

In caso contrario potresti avere qualche problema di formattazione. Prova a cancellare/cancellare tutte le celle dopo l'ultima riga.

Riguardo a quanto sopra anche vedere:

Suggerimento per gli sviluppatori di Excel

Un altro metodo per trovare l'ultima cella utilizzata:

    Dim rLastCell As Range

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

Cambia la direzione della ricerca per trovare la prima cella utilizzata.

32
Reafidy

Readify ha dato una risposta molto completa. Eppure, volevo aggiungere la dichiarazione End, puoi usare:

Trova l'ultima cella utilizzata, prima di uno spazio vuoto in una colonna:

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

Trova l'ultima cella utilizzata in una colonna:

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

Trova l'ultima cella, prima di uno spazio vuoto in una riga:

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

Trova l'ultima cella utilizzata in una riga:

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

Vedi qui per maggiori informazioni (e la spiegazione perché xlCellTypeLastCell non è molto affidabile).

20
JMax

Ecco una coppia di funzioni per restituire l'ultima riga e il punto di un foglio di lavoro, in base alla soluzione di Reafidy riportata sopra.

    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

Io uso il seguente codice vba per determinare l'intera gamma di righe utilizzate per il foglio di lavoro per poi accorciare l'intervallo selezionato di una colonna:

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

Funziona anche al contrario:

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