2011-09-14 3 views
15

Ho un foglio di lavoro Excel con un pulsante.Ottenere l'usato usato

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

Esiste comunque l'intervallo utilizzato che contiene i dati?

risposta

29

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

È un problema noto che excel non tiene traccia del range utilizzato molto bene. Qualsiasi riferimento all'intervallo utilizzato tramite VBA reimposterà il valore all'intervallo corrente utilizzato. Quindi provare a eseguire questa procedura secondaria:

Sub ResetUsedRng() 
    Application.ActiveSheet.UsedRange 
End Sub 

In mancanza di questo si può anche avere un po 'di formattazione appeso attorno. Prova a cancellare/cancellare tutte le celle dopo l'ultima riga.

Per quanto riguarda quanto sopra vedi anche:

Excel Developer Tip

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) 

cambiare la direzione di ricerca per trovare la prima cella utilizzata.

+0

+1 Bello, ho imparato qualcosa. (vedi?) –

+0

Lo proverò. Ho finito per scrivere la mia funzione di ricerca. Fondamentalmente, se trovo una cella vuota, conto sulla successiva 100 righe. Se il totale è 0, presumo sia l'ultima riga. – thinkanotherone

18

Readify ha fornito una risposta molto completa. Eppure, ho voluto aggiungere la dichiarazione End, è possibile utilizzare:

Trovare l'ultima cella utilizzata, prima di un 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 un vuoto in una riga:

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

Trova all'ultimo cella utilizzata in una riga:

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

Vedi here per ulteriori informazioni (e la spiegazione del perché xlCellTypeLastCell non è molto affidabile).

+6

+1 Grandi informazioni. Ti suggerirei di usare Range ("A" e Rows.Count) .End (xlup) in questo modo il tuo codice è realizzabile per più versioni di Excel. – Reafidy

+0

@Readify: davvero! grazie per questo suggerimento per le versioni incrociate :) – JMax

3
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 
5

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 
0

Uso il seguente codice vba per determinare le intere righe usate vanno 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 viceversa:

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