2012-05-30 15 views
22

Nie wiem, czy to możliwe, ale chcę sprawdzić, czy zakres w Excelu jest pusty. Jak więc napisać, jeśli:Excel Visual Basic - wykryj, czy zakres jest pusty

Range("A38":"P38") 

Czy jest pusty w kodzie VBA?

Z góry dziękuję.

+0

Sprawdź interfejs API (jest to PIA, ale model COM używany w VBA powinien być podobny): http://msdn.microsoft.com /pl-pl/library/microsoft.office.interop.excel.range_members.aspx (właściwość Counta, być może) –

+0

Jestem całkiem nowy dla VBA, więc nie ma to dla mnie większego sensu :) – Kano

+0

'Range ("A38: P38"). Count ", zobacz http://msdn.microsoft.com/en-us/library/aa139976%28v=office.10%29.aspx –

Odpowiedz

38

Znaleziono rozwiązanie z komentarzy, które dostałem.

Sub Empty() 
    If WorksheetFunction.CountA(Range("A38:P38")) = 0 Then 
     MsgBox "Empty" 
    Else 
     MsgBox "Not Empty" 
    End If 
End Sub 
+0

Uwaga: ** "Empty()" ** nie jest prawidłową procedurą Name. @ darren-bartrup-cook, proponowana przeze mnie redakcja nie odbiega od pierwotnej intencji postu i zachowuje swoje cele. –

3
Dim M As Range 

    Set M = Selection 

If application.CountIf(M, "<>0") < 2 Then 
    MsgBox "Nothing selected, please select first BOM or Next BOM" 
Else 

'Your code here 

End If 

Z doświadczenia Właśnie dowiedziałem można zrobić:

If Selection.Rows.Count < 2 
Then End If` 

Wyjaśnienie, które należy dostarczyć nieco później (teraz pracuję)

+1

Dzięki za odpowiedź, czy mógłbyś podać nieco wyjaśnienia, co porównanie naprawdę robi dla przyszłych użytkowników? EDYCJA: Również trochę trudny do zrozumienia, w jaki sposób twoja edycja pasuje do oryginalnego przykładu. – Thor

+0

@ Tora, gdy szukasz rozwiązania problemu w Google, otrzymasz tę stronę. Ale ta strona nie odpowiada na ten problem, dlatego właśnie odpowiedziałem na ten problem. Uważam, że ludzie tutaj nie tylko głosują w górę. Widzę, że pomogło już kilku osobom. – DeerSpotter

+2

Nadal pracujesz? –

3

IsEmpty zwraca True jeśli zmienna jest niezainicjowana lub jest jawnie ustawiona na Empty; w przeciwnym razie zwraca False. Fałsz jest zawsze zwracany, jeśli wyrażenie zawiera więcej niż jedną zmienną. IsEmpty zwraca tylko ważne informacje dotyczące wariantów. (https://msdn.microsoft.com/en-us/library/office/gg264227.aspx). Więc trzeba sprawdzić każdą komórkę w zakresie oddzielnie:

Dim thisColumn as Byte, thisRow as Byte 

    For thisColumn = 1 To 5 
     For ThisRow = 1 To 6 
      If IsEmpty(Cells(thisRow, thisColumn)) = False Then 
       GoTo RangeIsNotEmpty 
      End If 
     Next thisRow 
    Next thisColumn 
    ........... 
    RangeIsNotEmpty: 

Oczywiście są tu więcej kodu niż w roztworze z funkcją COUNTA które nie liczą się puste komórki, ale GoTo może interupt pętle jeśli przynajmniej jedna pusta komórka znajduje się i wykonaj kod szybciej, szczególnie jeśli zasięg jest duży i musisz wykryć tę sprawę. Również ten kod jest dla mnie łatwiejszy do zrozumienia, co robi, niż z funkcją Excel CountA, która nie jest funkcją VBA.

+1

Kod makr programu Excel (nie wiem, czy kompilowanie jest możliwe) trwa długo, gdy masz dużą liczbę iteracji. Twoje rozwiązanie jest potrzebne, jeśli już ustaliłeś, że jakaś komórka w tym zakresie nie jest pusta i chcesz ją przetworzyć, ale sprawdzenie, czy zakres jest pusty (tj. Czy twój kod jest niezbędny) powinno być szybsze i może znacznie szybciej, używając zaakceptowanej odpowiedzi (CountA).Używanie pojedynczej "natywnej" funkcji w pętli VB, co prowadzi do tego, że prowadzi do szybszego czasu pracy. –

+0

to nie zawsze działa. Na przykład, jeśli masz zasięg, który nie jest ciągłym wyborem po selekcji (powiedzmy, że wybór zakresu pomija 1 komórkę, to pomija 5 komórek, wraca do 1 komórki, itp.), To spowoduje to błąd. – DeerSpotter

0

Kolejne możliwe rozwiązanie. Policz puste komórki i odejmij tę wartość od łącznej liczby komórek.

Sub Emptys() 

Dim r As range 
Dim totalCells As Integer 

'My range To check' 
Set r = ActiveSheet.range("A1:B5") 

'Check for filled cells' 
totalCells = r.Count- WorksheetFunction.CountBlank(r) 


If totalCells = 0 Then 
    MsgBox "Range is empty" 
Else 
    MsgBox "Range is not empty" 
End If 

End Sub