2012-05-30 204 views
22

No sé si es posible, pero quiero verificar si un rango en Excel está vacío. Entonces, ¿cómo puedo escribir si:Excel Visual Basic - detectar si el rango está vacío

Range("A38":"P38") 

¿Está vacío en el código VBA?

Gracias de antemano.

+0

Consultar la API (este es el PIA, pero el COM que se utiliza en VBA debe ser similar): http://msdn.microsoft.com /en-us/library/microsoft.office.interop.excel.range_members.aspx (la propiedad Count, tal vez) –

+0

Soy bastante nuevo para VBA, así que esto no tiene mucho sentido para mí :) – Kano

+0

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

Respuesta

38

Encontré una solución de los comentarios que recibí.

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

Atención: ** "Empty()" ** no es un nombre de procedimiento válido. @ darren-bartrup-cook, mi edición propuesta no se desvía de la intención original de la publicación y conserva sus objetivos. –

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 

De la experiencia que acabo de aprender que podría hacer:

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

Aclaración ser proporcionado un poco más tarde (en este momento estoy trabajando)

+1

Gracias por la respuesta, ¿podría también proporcionarnos un poco de aclaración sobre lo que realmente está haciendo la comparación para los futuros visitantes? EDITAR: También es un poco complicado entender cómo encaja su edición con el ejemplo original. – Thor

+0

@Thor cuando busca una solución al problema en Google, obtiene esta página. Pero esta página no responde a ese problema y por eso respondí ese problema. Creo que las personas aquí no solo votan por cosas. Puedo ver que esto ya ayudó a algunas personas. – DeerSpotter

+2

¿Sigues trabajando? –

3

IsEmpty devuelve True si el la variable no está inicializada o está establecida explícitamente en Vacío; de lo contrario, devuelve False. False siempre se devuelve si la expresión contiene más de una variable. IsEmpty solo devuelve información significativa para las variantes. (https://msdn.microsoft.com/en-us/library/office/gg264227.aspx). Por lo que debe comprobar cada célula de rango por separado:

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: 

Por supuesto que aquí son más código que en solución con la función CONTARA que no cuenta las celdas vacías, pero GoTo puede interrumpirla bucles si se encuentra al menos uno no celda vacía y haga su código más rápido, especialmente si el alcance es grande y necesita detectar este caso. También este código para mí es más fácil de entender que lo que está haciendo, que con la función Excel CountA que no es función VBA.

+1

El código de macro de Excel (no sé si la compilación es posible) demora un tiempo cuando tienes una gran cantidad de iteraciones. Su solución es necesaria si ya ha determinado que alguna celda en el rango no está vacía y desea procesarla, pero la comprobación de determinar si un rango está vacío (es decir, si su código es incluso necesario) debería ser más rápido y tal vez mucho más rápido usando la respuesta aceptada (CountA).El uso de una única función "nativa" para un bucle VB que hace lo mismo tiende a generar tiempos de ejecución más rápidos. –

+0

esto no siempre funciona. Por ejemplo, si tiene un rango que no es una selección continua luego de una selección (digamos que su selección de rango omite 1 celda, omite 5 celdas, regresa a 1 celda, etc.), entonces se producirá un error. – DeerSpotter

0

Otra posible solución. Recuento de células vacías y restar ese valor a partir del número total de células

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