en un rango saber si hay celdas vacías

03/03/2008 - 10:32 por chiri | Informe spam
1º Como puedo saber mediante código si en un rango hay celdas vacías

Con esto tengo suficiente pero por ir más allá

2º podría saber cuales están vacías.

gracias

Preguntas similare

Leer las respuestas

#16 chiri
03/03/2008 - 17:05 | Informe spam
Gracias, por acabar de liarla, ahora funciona, mis celdas eran de texto y
por ello era necesario CountA

MIL GRACIAS

"Juan M" escribió en el mensaje
news:
Hola chicos,

Ya si que la vamos a liar del todo,

Cuenta las celdas con números, es la función contar de la hoja de cálculo.
Al haber hecho la prueba con números no me he dado cuenta.
Application.WorksheetFunction.Count(Range("A:A"))

La siguiente es la que cuenta las celdas no vacías (ContarA en la hoja de
cálculo)
Application.WorksheetFunction.CountA(Range("A:A"))

Y la otra cuenta las vacías (contar.blanco en la hoja de cálculo)
Application.WorksheetFunction.CountBlank(Range("A:A"))

Vaya lunes llevo.

Un saludo,
Juan

"Ivan" escribió
hola de nuevo,

creo que el que lo ha liado he sido yo [sorry], por no haber leido
bien la propuesta de Juan. Realmente no habia visto la parte de solo
'Count'

de todas formas tras unas pruebas me da la impresion de que el
problema que esta teniendo Fernando es que el rango en el que busca
contiene datos alfanumericos o de texto, es decir, no numericos, y por
lo que me ha parecido ver 'Count' solo toma en cuenta los numericos,
por lo cual devuelve siempre 0

Fernando, en realidad lo habias puesto bien, lo unico que esa
instruccion es para buscar el nro de celdas con datos, pero por lo que
parece solo toma en cuenta las que contienen numeros (si quieres
prueba con un rango con numeros)

para las vacias efectivamente es la otra forma (con countBlank), que
ya has comprobado que funciona

bueno, disculpas por la metedura de pata

de todas formas siempre se aprende algo: la verdad es que no lo sabia
(lo de count y los numericos, si es que no me he equivocado)

un saludo
Ivan




Respuesta Responder a este mensaje
#17 Ivan
03/03/2008 - 17:07 | Informe spam
hola de nuevo, chicos,

y ya para, como dice Juan, acabar de liarlo, haciendo unas pruebas con
las funciones propuestas por mi me he encontrado con que en el caso de
que todas las celdas esten vacias, devuelve como si estuvieran
llenas.

Aunque creo que, al menos para saber el numero (y por tanto si
existen) de celdas vacias es bastante mas eficiente la propuesta con
countblank (al menos en rangos muy grandes supongo que sera asi, al
ser una formula de hoja), aqui pongo la rectificacion a dichas
funciones que parece arreglar el problema

'
' para saber si existen celdas vacias
Function HayVacias(Rango As Range) As Boolean
On Error Resume Next
HayVacias = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count > 0, _
Rango.Cells(1).Value = "")
If Err.Number <> 0 Then HayVacias = True
End Function
'
' para saber el nº de celdas en blanco
Function NumeroVacias(Rango As Range) As Long
On Error Resume Next
NumeroVacias = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count, _
-1 * (Rango.Cells(1).Value = ""))
If Err.Number <> 0 Then _
NumeroVacias = Rango.Cells.Count
End Function
'
' para obtener las referencias de las celdas vacias
Function CeldasVacias(Rango As Range) As String
Dim refs As String, Celda As Range
On Error Resume Next
If Rango.Cells.Count > 1 Then
For Each Celda In Rango.SpecialCells(xlCellTypeBlanks)
refs = refs & ";" & Celda.Address(0, 0)
Next
CeldasVacias = Right(refs, Len(refs) - 1)
Else
If Rango.Value = "" Then _
CeldasVacias = Rango.Address(0, 0)
End If
If Err.Number <> 0 Then _
CeldasVacias = Rango.Address(0, 0)
End Function


NOTA: en caso de todas las celdas vacias devuelve la referencia del
rango completo y no celda a celda, pues si el rango es muy grande,
podria ser una cadena imensa

espero que no aparezca ningun 'problemilla' mas

un saludo
Ivan
Respuesta Responder a este mensaje
#18 Ivan
03/03/2008 - 17:21 | Informe spam
para lunes el mio

espero que no aparezca ningun 'problemilla' mas







me temo que ahora ocurre al contrario, devuelve todas como vacias
cuando todas estan llenas.

Bueno, creo que estoy mas espeso por minutos y ademas lo tengo que
dejar un rato, asi que no me hagais caso y si quereis revisarlo
bienvenido sera. Sino luego lo miro mas tranquilo


un saludo
Ivan
Respuesta Responder a este mensaje
#19 Juan M
03/03/2008 - 20:47 | Informe spam
Hola Ivan,

Creo que el control de errores que has puesto ha jugado una mala pasada.

La siguiente instrucción provoca un error 1004. con descripción "No se
encontraron celdas." cuando se introduce un rango vacío

Rango.SpecialCells(xlCellTypeBlanks).Count

La función que no hace lo que debe es

'
' para saber el nº de celdas en blanco
Function NumeroVacias(Rango As Range) As Long
On Error Resume Next
NumeroVacias = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count, _
-1 * (Rango.Cells(1).Value = ""))
End Function

En el caso del rango vacío y según lo comentado del SpecialCells levanta un
error controlado por On Error Resume Next, le 'obliga' a pasar a la
siguiente instrucción, -1 * (Rango.Cells(1).Value = "", que sería el
resultado de todo el rango con valores.

La solución sería controlar ese error específicamente
'-
Function NumeroVacias(Rango As Range) As Long
On Error GoTo HayErrores
NumeroVacias = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count, _
-1 * (Rango.Cells(1).Value = ""))
Debug.Print NumeroVacias
HayErrores:
If Err.Number = 1004 Then
NumeroVacias = Rango.Cells.Count
End If
End Function

Lo que transmite el error a la parte de la representación de los valores.
que podríamos controlar comparando la cantidad de blancos con las celdas
existentes en el rango,
si es el mismo valor devuelve el rango escrito y si no seguiría el proceso
normal,
o como hicimos en el apartado anterior controlando el error de SpecialCells

'
' para obtener las referencias de las celdas vacias
Function CeldasVacias(Rango As Range) As String
Dim refs As String, Celda As Range
On Error GoTo HayErrores
Debug.Print Rango.SpecialCells(xlCellTypeBlanks).Count
On Error GoTo 0
If Rango.Cells.Count > 1 Then
For Each Celda In Rango.SpecialCells(xlCellTypeBlanks)
refs = refs & ";" & Celda.Address(0, 0)
Next
CeldasVacias = Right(refs, Len(refs) - 1)
Else
If Rango.Value = "" Then _
CeldasVacias = Rango.Address(0, 0)
End If
Exit Function
HayErrores:
If Err.Number = 1004 Then CeldasVacias = Rango.Address

End Function

Un saludo,
Juan

"Ivan" escribió en el mensaje
para lunes el mio

espero que no aparezca ningun 'problemilla' mas







me temo que ahora ocurre al contrario, devuelve todas como vacias
cuando todas estan llenas.

Bueno, creo que estoy mas espeso por minutos y ademas lo tengo que
dejar un rato, asi que no me hagais caso y si quereis revisarlo
bienvenido sera. Sino luego lo miro mas tranquilo


un saludo
Ivan

Respuesta Responder a este mensaje
#20 Ivan
03/03/2008 - 21:32 | Informe spam
hola Juan, muchas gracias por tus comentarios

a falta de leerlos con mas calma, y aplicando +/- algo parecido aunque
rizando el rizo, esto creo que funciona (aunque a estas alturas ya mas
bien es cabezoneria)

'
' para saber si existen celdas vacias
'
Function HayVacias2(Rango As Range) As Boolean
On Error Resume Next
HayVacias2 = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count > 0, _
Rango.Cells(1).Value = "")
If Err.Number <> 0 Then _
HayVacias2 = Rango.Cells(1) = ""
End Function
'
' para saber el nº de celdas en blanco
'
Function NumeroVacias2(Rango As Range) As Long
On Error Resume Next
NumeroVacias2 = IIf(Rango.Cells.Count > 1, _
Rango.SpecialCells(xlCellTypeBlanks).Count, _
-1 * (Rango.Cells(1).Value = ""))
If Err.Number <> 0 Then NumeroVacias2 = _
Rango.Cells.Count * -(Rango.Cells(1) = "")
End Function
'
' para obtener las referencias de las celdas vacias
'
Function CeldasVacias2(Rango As Range) As String
Dim refs As String, Celda As Range
On Error Resume Next
If Rango.Cells.Count > 1 Then
For Each Celda In Rango.SpecialCells(xlCellTypeBlanks)
refs = refs & ";" & Celda.Address(0, 0)
Next
CeldasVacias2 = Right(refs, Len(refs) - 1)
Else
If Rango.Value = "" Then _
CeldasVacias2 = Rango.Address(0, 0)
End If
If Err.Number <> 0 And Rango.Cells(1) = "" Then _
CeldasVacias2 = Rango.Address(0, 0)
End Function
' **************************************************

bueno, lo dicho, solo por cabezoneria y no dejarlo a medias (aunque a
lo mejor todavia surje algun gazapo)

muchas gracias y un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida