2012-10-26 19 views
6

Chcę policzyć liczbę wierszy w arkuszu Arkusz1, z modułu kodu Sheet2.Liczba wierszy w arkuszu roboczym

W module kodu Arkusz1 dodaje kod działa poprawnie

ctr = Range("B2", Range("B2").End(xlDown)).Count 

próbowałem ten sam kod w Sheet2 module kodu

recct = ThisWorkbook.Sheets("Sheet1").Range("B2", Range("B2").End(xlDown)).Count 

Dostaję run time error 1004 Application -Defined or Defined error

Dzięki

+1

Dzięki Scott Holtzman Wypróbowałem twój kod i to działa. Dzięki jeszcze raz. i każdego, kto skomentował. –

+0

Prawdopodobnie dostałeś więcej, niż się spodziewasz, popiołu! Ale witam w SO. Wspaniale jest móc się uczyć tak szybko. Biorąc pod uwagę wszystkie poniższe odpowiedzi, w zależności od tego, które z nich najlepiej pasuje do Twoich potrzeb, zaznacz je jako zaakceptowane, klikając pusty znacznik wyboru pod nim. Pomoże to w przyszłości innym, którzy najlepiej Ci pomogli. –

Odpowiedz

2

Można to wykorzystać na przykład:

rowsInThere = Sheets("Sheet1").UsedRange.Rows.Count 

to działa bez przedziałów. Możesz również użyć ActiveSheet jako arkusza do sprawdzenia, na wypadek gdybyś musiał zmienić bieżący arkusz i sprawdzić liczbę wierszy.

+1

To nie odpowiada na pytanie - jest szczególnie ważne dla B2 do ostatnio używanej komórki w kolumnie B – brettdj

+2

możesz tego użyć, ale jeśli są puste komórki pomiędzy 'Zasięgiem (" B2 "). Koniec (xlDown)' i ostatnia komórka w 'UsedRange' nie zwróci liczby wierszy, której oczekujesz! –

+0

Nie, pytanie brzmi "Chcę policzyć liczbę rzędów na Arkusz1", a to jest odpowiedź (alternatywna odpowiedź, nie używając jego metody do sprawdzania wierszy). I dla Scotta, to zależy od danych w arkuszach, i jakie zamiary ma OP. Widziałem okres "liczby rzędów", podaję to jako odpowiedź. – Vesper

9

Błąd występuje w 2. zakresie odniesienia w recct. Ponieważ odwołujesz się do innego arkusza, musisz powiedzieć VBA nazwę arkusza w obu odniesieniach do zakresu.

Spróbuj to zamiast:

With ThisWorkbook.Sheets("Sheet1")  
    recct = .Range("B2", .Range("B2").End(xlDown)).Rows.Count  
End With 

Alternatywnie, to będzie działać, jak również (choć nieco sloppier).

recct = ThisWorkbook.Sheets("Sheet1").Range("B2", ThisWorkbook.Sheets("Sheet1").Range("B2").End(xlDown)).Rows.Count 

Aktualizacja

Ponieważ istnieje wiele dyskusji wokół tego, co właściwie znaczy przez liczbę wierszy w arkuszu, należy użyć powyższy kod dosłownie zaczynają się B2 i policzyć liczbę sąsiadujących komórek bezpośrednio pod

Jednakże, jeśli chcesz znaleźć ostatnią „prawdziwą” używaną komórkę w kolumnie B (za prawdziwe, to znaczy z danych w nim) to zrobić:

With ThisWorkbook.Sheets("Sheet1") 

    recct = .Range("B2", .Range("B" & .Rows.Count).End(xlUp)).Rows.Count 

End With 
+1

Jedynymi problemami z tym, że dostaniesz 1048575 (Excel 2010), jeśli nie ma danych po B2 i ignoruje pierwszy wiersz. –

+2

@DanielCook -> nie ma problemu z tym kodem, ponieważ rozwiązuje on pytanie użytkowników. Pewne są zastrzeżenia z użyciem '.End', ale ponieważ użytkownik dostarczył kod, muszę założyć, że wie, co on robi z tym. Innymi słowy '.End (xlDown)', może być całkowicie poprawne, jeśli teraz używasz zestawu danych. –

+1

+1 przeoczył twoją odpowiedź była pełna odnosząc się do "Arkusz1" - czy edytowałeś swój pierwszy wpis? – brettdj

2

dwie rzeczy

  1. Przy pracy poza arkusz trzeba w pełni zakwalifikować Twój zakres
  2. Zawsze mierzyć ostatnie dno komórek w górę, zamiast z góry na dół - może mieć luki

kod

Sub GetB() 
Dim ws As Worksheet 
Set ws = Sheets(1) 
Dim lngCnt As Long 
lngCnt = ws.Range(ws.[b2], ws.Cells(Rows.Count, "b").End(xlUp)).Count 
End Sub 

więcej niezawodny

Aby obsłużyć wszystkie sytuacje czysto następnie Find łatwiej

Sub GetB() 
    Dim ws As Worksheet 
    Dim rng1 As Range 
    Set ws = Sheets(1) 
    Set rng1 = ws.Range("B:B").Find("*", ws.[b1], xlValues, , , xlPrevious) 
    If Not rng1 Is Nothing Then 
    Select Case rng1.Row 
    Case 1 
    MsgBox "Only B1 has data", vbCritical 
    Case 2 
    MsgBox "No used cells past B2" 
    Case Else 
    MsgBox rng1.Row - 1 & " cells between B2 and B" & rng1.Row 
    End Select 
    Else 
     MsgBox ws.Name & " column B Is blank", vbCritical 
    End If 
End Sub 
1

nie wiem, czy to pomoże, ale używam tego w moich modułów cały czas:

Dim TR as long, TC as long 

TR = [Sheet1!A1].CurrentRegion.Rows.count 
TC = [Sheet1!A1].CurrentRegion.Columns.count 

Jeśli wiem że jeśli zbiór danych, z którym mam do czynienia, nie ma pustego wiersza lub kolumny, jak wyciąg z innego programu lub czegoś takiego, to działa szybko i działa świetnie! Z tego można określić zakres wyboru lub wykonać vlookup.

TR = [Sheet1!A1].CurrentRegion.Rows.count 
[I2] = "=vlookup($C2,'sheet1'!A$2:B$" & TR & ",2,FALSE)" 
Powiązane problemy