2012-05-30 17 views
22

Non so se è possibile, ma voglio verificare se un intervallo in Excel è vuoto. Quindi, come scrivo se:Excel Visual Basic: rileva se l'intervallo è vuoto

Range("A38":"P38") 

È vuoto nel codice VBA?

Grazie in anticipo.

+0

Consultare l'API (questo è il PIA, ma il COM utilizzato in VBA dovrebbe essere simile): http://msdn.microsoft.com /en-us/library/microsoft.office.interop.excel.range_members.aspx (la proprietà Count, forse) –

+0

Sono abbastanza nuovo per VBA quindi questo non ha molto senso per me :) – Kano

+0

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

risposta

38

Ho trovato una soluzione dai commenti che ho ricevuto.

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

Attenzione: ** "Empty()" ** non è un nome procedura valido. @ darren-bartrup-cook, la mia modifica proposta non devia dall'intenzione originale del post e preserva i suoi obiettivi. –

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 

Per esperienza ho appena saputo che si possa fare:

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

chiarimento da fornire un po 'più tardi (in questo momento sto lavorando)

+1

Grazie per la risposta, potresti fornire anche un po 'di chiarimenti su cosa il confronto sta realmente facendo per i futuri visitatori? EDIT: anche un po 'complicato capire come la tua modifica si adatta all'esempio originale. – Thor

+0

@Quando cerchi una soluzione al problema su Google, ottieni questa pagina. Ma questa pagina non risponde a questo problema ed è per questo che ho risposto a questo problema. Credo che le persone qui non si limitino a votare le cose. Posso vedere questo già aiutato alcune persone. – DeerSpotter

+2

Stai ancora lavorando? –

3

IsEmpty restituisce True se il la variabile non è inizializzata, o è esplicitamente impostata su Vuota; altrimenti restituisce False. False viene sempre restituito se expression contiene più di una variabile. IsEmpty restituisce solo informazioni significative per le varianti. (https://msdn.microsoft.com/en-us/library/office/gg264227.aspx). Quindi è necessario controllare ogni cellula nella gamma separatamente:

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: 

Naturalmente qui sono più codice non in soluzione con la funzione CONTA.VALORI che non contano le celle vuote, ma GoTo possibile Interupt loop se non viene trovata almeno una non cella vuota e fai il tuo codice più velocemente, soprattutto se l'intervallo è ampio e devi rilevare questo caso. Anche questo codice per me è più facile da capire su cosa sta facendo, che con la funzione Excel CountA che non è la funzione VBA.

+1

Codice macro di Excel (non so se la compilazione è possibile) richiede un po 'di tempo quando si dispone di un numero elevato di iterazioni. La tua soluzione è necessaria se hai già stabilito che alcune celle dell'intervallo non sono vuote e vuoi elaborarle, ma il controllo per determinare se un intervallo è vuoto (cioè se il tuo codice è addirittura necessario) dovrebbe essere più veloce e forse molto più veloce usando la risposta accettata (CountA).L'utilizzo di una singola funzione "nativa" in un ciclo VB che fa lo stesso tende a portare a tempi di esecuzione più rapidi. –

+0

questo non sempre funziona. Ad esempio se hai un intervallo che non è una selezione continua dopo una selezione (diciamo che la tua selezione dell'intervallo salta 1 cella, quindi salta 5 celle, torna a 1 cella, ecc.) Allora questo errore verrà eliminato. – DeerSpotter

0

Un'altra possibile soluzione. Contare le celle vuote e sottrarre quel valore dal numero totale di celle

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