2011-11-27 9 views
11

Chciałbym wybrać wszystkie wiersze i kolumny w arkuszu kalkulacyjnym. Makro musi być dynamiczne, ponieważ liczba kolumn i wierszy zmienia się za każdym razem, gdy makro zostanie wywołane. Musi także mieć możliwość rozliczania pustych wierszy i kolumn.Zwróć zakres od A1 do ostatniej ostatnio używanej komórki.

Ten podprogram osiąga część procesu:

Sub FindLastCell() 
Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Select 
End Sub 

stwierdzi i wybiera ostatniej komórki w arkuszu. Teraz, gdy znalazłem ostatnią komórkę w arkuszu kalkulacyjnym, jak wybrać komórkę A1 do LastCell jako zakres?

Odpowiedz

18

Trzeba dokonać tych modów do kodu

  1. Arkusz może być pusty, więc nigdy nie należy używać Select z Find jak da to błąd, jeśli Find nic nie zwraca. Zamiast tego sprawdź, czy obiekt zakresu może wyszukiwać według wierszy i kolumn. Musisz określić zarówno ostatniego wiersza i kolumny w celu ustalenia prawdziwej Ostatnio używane komórkę
  2. Po ustaleniu prawdziwej ostatniego użycia komórek Range ustawić zakres od pierwszej komórki (A1) do komórki ustalonej z dwóch Find zakresy

Pls patrz poniższy kod

Jeśli Find pobiera wartość to ma szereg rng3 od A1 do ostatniej używanej komórki zidentyfikowane przez dwa Find s.

enter image description here

Sub GetRange() 
    Dim rng1 As Range 
    Dim rng2 As Range 
    Dim rng3 As Range 
    Set rng1 = Cells.Find("*", [a1], xlFormulas, , xlByRows, xlPrevious) 
    Set rng2 = Cells.Find("*", [a1], xlFormulas, , xlByColumns, xlPrevious) 
    If Not rng1 Is Nothing Then 
     Set rng3 = Range([a1], Cells(rng1.Row, rng2.Column)) 
     MsgBox "Range is " & rng3.Address(0, 0) 
     'if you need to actual select the range (which is rare in VBA) 
     Application.Goto rng3 
    Else 
     MsgBox "sheet is blank", vbCritical 
    End If 
End Sub 
+1

Excellent !!! :) – AME

+1

Okay, to całkiem niezły sposób na wykonanie funkcji range. Wyglądam na użycie procedury i użycie iteracji nad rekursją, jeśli tylko z powodu różnicy. – JackOrangeLantern

+1

dobrze wyjaśniony :) –

9

Wybór A1 do ostatniej komórki używane (w tym półfabrykatów w międzyczasie) w kolumnie A jest tak proste, jak to:

Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Select 

Aby wybrać A1 do ostatniej komórki używane w całym arkuszu (niezależnie od tego, czy jest używany w kolumnie A), czy nie:

Range("A1:A" & ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row).Select 
+2

xlCellTypeLastCell zazwyczaj przeszukuje ostatnio używaną pozycję komórki (z usuniętych danych), chyba że poprzedza się wymuszeniem aktualizacji używanego zakresu, tj. Dodaniem wiersza takiego jak "ActiveSheet.UsedRange". Ale zgadzam się, że jest krótszy niż zastosowany Find, który dostosowałem z bardziej konkretnej potrzeby. Pozdrawiam Dave'a. – brettdj

+0

+1 dla wydajnej odpowiedzi. – brettdj

+0

Dziękujemy za dodanie uwagi o odświeżaniu używanego zakresu! To ważna rzecz, o której powinienem był wspomnieć. – aevanko

2

Wyjaśniałem jak zmodyfikować kod, aby wybrać zakres rozpoczynający się od określonej komórki, a kończący na ostatniej komórce. W linii 8 zmień a1 na komórkę, od której chcesz zacząć. W moim przypadku wybrałem j28.

Set rng3 = Range([j28], Cells(rng1.Row, rng2.Column)) 

pełny kod:

Sub GetRange() 
     Dim rng1 As Range 
     Dim rng2 As Range 
     Dim rng3 As Range 
     Set rng1 = Cells.Find("*", [a1], , , xlByRows, xlPrevious) 
     Set rng2 = Cells.Find("*", [a1], , , xlByColumns, xlPrevious) 
     If Not rng1 Is Nothing Then 
      Set rng3 = Range([j28], Cells(rng1.Row, rng2.Column)) 
      MsgBox "Range is " & rng3.Address(0, 0) 
      'if you need to actual select the range (which is rare in VBA) 
      Application.Goto rng3 
     Else 
      MsgBox "sheet is blank", vbCritical 
     End If 
    End Sub 
Powiązane problemy