Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado

Función IsEmpty en VBA

| 26 comentarios

La función IsEmpty sirve para verificar si una celda (o rango) está vacía o no tiene datos. Si en una celda hubiera un espacio (el cual no se puede ver), Excel no reconocería a la celda como vacía. La función IsEmpty solo es efectiva cuando se usa en variables “variant”, esto debido a que las otras variables ya tienen un valor asignado por defecto en la declaración de las variables. Una variable es del tipo “variant” si no es explícitamente declarada como de otro tipo. Entonces, la función IsEmpty sirve para determinar si una variable ha sido alguna vez inicializada, es decir, si a esta variable se le ha asignado un valor.

El siguiente ejemplo es una forma sencilla de usar la función IsEmpty. Este ejemplo es sobre una cuota que tienen que pagar cada departamento de un edificio, y si un departamento no paga tal cuota, este  tendría que pagar una multa. La macro usada es la siguiente:

Sub macro01()

For i = 3 To 17

If IsEmpty(Cells(i, 2)) Then

Cells(i, 3).Value = "MULTA"

End If

Next i

End Sub

Donde, las funciones “For” y “Next” sirven para que se analice desde la celda (3,2) hasta la celda (17,2). Y si una celda está vacía se asignará en la siguiente columna (misma fila) el valor de “multa”.

Adjunto el archivo: Función IsEmpty en VBA

 

Reyes Castillo, José Miguel

26 comentarios

  1. Una función que tiene muchas aplicaciones, pero ¿cómo se haría entonces para poder identificar a aquellas celdas que no están definidas como una variable "variant"?. ¿Hay otra función que realiza lo mismo para otros tipos de variables? o no es posible en ese caso.

  2. El uso de esta funcion es muy útil, ...me permitirá controlar mejor el envio de resultados de un grupo de personas al cierre de determinada fecha, pero seguiré leyendo para obtener otros datos mas complejos.
    Codigo
    Sub CeldasVacias()
    'Obtener celdas vacias de coordinadores que no remitieron resultados
    ult = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To ult
    If IsEmpty(Cells(i, 2)) Then
    Cells(i, 3).Value = "ENVIAR CORREO"
    End If
    Next i
    End Sub

    La aplicacion de macros es genial.
    Lizbeth

  3. Esta fórmula me parece recontra útil, sobre todo para cuando se requiera revisar pendientes o se desee hacer seguimiento

  4. Esta aplicación me parece interesante. Creo que se podría mejorar introduciendo una macro adicional para poder actualizar los pagos hechos a último momento y de esta manera exonerar de la multa a los que pagaron en último momento. Aqui va el código:

    Sub macro01()
    For i = 3 To 17
    If IsEmpty(Cells(i, 2)) Then
    Cells(i, 3).Value = "MULTA"
    End If
    Next i
    End Sub

    Sub Macro_inicio()
    ' Macro_inicio Macro
    ' Limpia la columna C para pode ractualizar los pagos hechos a última hora.
    Range("C3:C17").Select
    Selection.ClearContents
    End Sub

    Sub Macro_total()
    Macro_inicio
    macro01
    End Sub

  5. Esta función es una de las practicas que he visto. Interesante también el aporte de Lizbeth Paz. Trataré de buscarle una utilidad.

  6. El problema de que la función IsEmpty no reconoce a las celdas con uno o más 'espacios' como vacías, puede solucionarse incluyendo en la función condicional, a través de una función Or, lo siguiente:

    Or InStr(1, Cells(i, 2), " ", vbTextCompare) ; con esta función se estaría revisando al mismo tiempo si las celdas de la columna 'Cuota' contienen 1 o más espacios, para considerarlas también como vacías y dar el aviso de multa.

    De esta manera, siguiendo el ejemplo, el código quedaría como sigue:

    Sub macro01()
    For i = 3 To 17
    If IsEmpty(Cells(i, 2)) Or InStr(1, Cells(i, 2), " ", vbTextCompare) Then
    Cells(i, 3).Value = "MULTA"
    End If
    Next i
    End Sub

  7. Los comentarios sobre los espacios hace que esta funcion no se del todo fiable, pero corrigiendo la orden como lo comenta nuestro amigo Carlos, aplica. Para aprovechar la funcion esta se puede utilizar en cumplimientos de planes de mantenimiento, si es que noha sido llenado, el cumplimiento por area es cero, o para definir cantidad algun KPI, si por ejemplo se registran las horas operativas de un equipo, sabremos que las vacias son horas fuera de servicio, con lo que podremos saber en un rango de horas su disponibilidad.

  8. Una función muy útil para poder revisar si existen espacios vacíos en hojas de excel que tienen muchos valores y que sería difícil revisarlas a simple vista. Sería bueno modificarla para que tambien reconozca los espacios que tal vez fueron introducidos por error.

  9. Gracias buen hombre!

  10. También se podría añadir el código CountIf para contar los pagos y multas, luego sacar el producto con los respectivos montos en soles y así calcular lo que se debe recaudar según el ejemplo.

    Muy buena aplicación!

  11. excelente función y como podría utilizar esta función para rellenar numéricamente de 1 a n, (secuencia numérica) para las mismas celdas que estoy evaluando?

    ejemplo
    tengo estos datos
    A2 Juan
    A4 Pedro
    A6 Felipe
    debe quedar así
    A2 1
    A4 2
    A6 3

    Gracias

  12. que elegancia fue perfecto pues resulta que hice una macro para copiar datos con celdas vacias entre si, pero en cierto rango que no tenia datos se paraba el for pero este fue la solucion porque le cambie los datos para las columnas que yo necesitaba y fuera de eso un aviso que estan vacias y hay si me reconocia el aviso y lo pegaba donde yo lo necesito aqui dejo la aplicacion y muchas gracias y que Dios lo bendiga a usted y a los Suyos

    'este era el for que tenia y funciona bien

    For Each celda In Range("DQ2:DQ11")
    If celda.Value >= 30 And celda.Value <= 39 Then

    celda.Offset(0, 1035).Value = celda.Offset(0, 0).Value

    End If
    Next celda

    'aqui esta la alteracion de la aplicacion que me saco del apuro
    For i = 2 To 11
    If IsEmpty(Cells(i, 1157)) Then
    Range("ARL3").Value = "No Salio"

    End If
    Next i

    'aqui era donde se paraba porque no tenia datos para seleccionar
    Range("ARL2:ARL11").Select
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
    Selection.COPY
    Application.Goto Reference:="R2C128" 'este goto si lo necesito porque como sabe el donde lo va a descargar el dato para pegarlo
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

  13. Una funcion importante, que puede ayudarnos a evaluar al final del mes si un trabajdor no asistio a su centro laboral ya que si colocamos en diferentes celdas los dias de la semana se veran vacias aquellas donde no asistio.

  14. hola tengo este código para verificar si el dato esta repetido y si no lo esta que guarde la información....

    Private Sub CommandButton1_Click()
    Dim strfila$, ctr As Control

    Sheets("Base de datos").Select

    If TextBox1 = "" Or TextBox2 = "" Or TextBox3 = "" Or TextBox4 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or ComboBox1 = "" Then
    MsgBox "No dejes ningun campo en blanco", vbOKOnly + vbInformation, "AVISO"
    TextBox1.SetFocus
    'Exit Sub
    End If

    Set rango = Range("A:A").Find(What:=TextBox1, _
    LookAt:=xlWhole, LookIn:=xlValues)

    If rango Empty Then
    MsgBox "El dato ya existe", vbOKOnly + vbInformation, "AVISO"
    TextBox1.SetFocus
    Exit Sub
    End If

    strfila$ = [A65536].End(xlUp).Offset(1, 0).Row

    Range("A" & strfila$) = TextBox1
    Range("B" & strfila$) = TextBox2
    Range("C" & strfila$) = TextBox3
    Range("D" & strfila$) = TextBox4
    Range("E" & strfila$) = TextBox5
    Range("F" & strfila$) = TextBox6
    Range("G" & strfila$) = Val(TextBox7)
    Range("G" & strfila$).NumberFormat = "$ #,##0"
    Range("H" & strfila$) = ComboBox1

    For Each ctr In Me.Controls
    If TypeOf ctr Is MSForms.TextBox Then
    ctr = ""
    End If
    Next ctr

    Range("A" & strfila$ & ":H" & strfila$).HorizontalAlignment = xlCenter

    TextBox1.SetFocus

    End Sub

    pero el error esta cuando intento guardar el dato. me aparece el siguiente mensaje
    "se ha producido el error en tiempo de ejecución:
    Variable de objeto o bloque With no establecido"

    Alguien por favor me podría ayudar con este error, les agradecería. 🙂

  15. Muy buenas a todos:
    Yo tengo una hoja, con una cuadricula de 10x10 , llamemosle range("A1:J10")
    2 variables string (vacio y lleno)
    y quiero que cada vez que el usuario introduce un numero, ejecute la un for next para comprobar si en el rango existe o no una celda vacia.
    osea resto=lleno-vacio
    Si la cuadricula no esta completa, osea, hay celdas vacias , debe dejar seguir introduciendo valores.
    Si detecta que el rango esta completo
    crea
    he probado con if not isempty(range) pero no debo poner bien la sintaxis o no declaro bien las variables..
    He probado con if count hasta que me devuelva valor 0 (no vacias.) y tampoco.. que estoiy haciendo mal? alguien me puede ayudar ? Mil gracias de antemano .

  16. hola buenos días tengo un problema con una macro espero que me puedan ayudar:

    tengo una base de datos en la que quiero poner un recordatorio con un botón para programar una alarma para que avise en la fecha predeterminada en una celda y que en la fecha "programada" envíe un MsgBox de la personan a la que se tiene que hablar, tengo un código:

    Sub ProgramarAlarma()
    Dim SetTime As String

    SetDate = Hoja1.Range(“A1”).Text

    Application.OnTime DateValue(“SetDate”), “EjecutarAlarma”

    MsgBox “Alarma Programada”
    End Sub

    Sub EjecutarAlarma()

    MsgBox ” hablar xxx”
    End Sub

    lo que requiero y si me puedes ayudar es:

    que pueda cuando presione el botón tome la fecha que se encuentra en la celda definida, por ejemplo A1, A2, etc, que será la fecha para programar y que el mensaje de texto muestre el nombre de la persona que se encuentra en la misma fila a la que se le tiene que hablar, ejemplo D1, D2, etc. y si es posible que mande un correo electrónico avisando de esto.

    Gracias.

  17. Buenas, quisiera realizar una macro donde evalue si un campo está vacio, si es así me de un mensaje de error y si no imprima un documento (como pdf). Tengo ambos pero no los puedo unir para que se cumpla la función IF. Me podrían ayudar?
    Estos son los códigos para ambas tareas:

    Sub TestCellA1()

    'Test if the value is cell A1 is blank/empty
    If IsEmpty(Range("W1").Value) = True Then
    MsgBox "Colocar n° doc"
    End If
    ActiveSheet.ListObjects("Tabla17").Range.AutoFilter Field:=3, Criteria1:= _
    ""
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False

    End Sub

  18. Estoy buscando que un MSGBox que me evalue un rango de celdas, es decir si me excedo de X valor me arroje un mensaje de que en alguna celda de ese rango se ha excedido de lo permitido.

    Espero me puedan ayudar,

    Gracias!!

    • Sub valor_en_rango()
      ‘va a buscar rango mayo por ejemplo a 3 en un rango ejemplo: para el rango B2:E10
      filainicial = 2
      filafinal = 10
      columnainicial = 2
      columnafinal = 4
      For i = filainicial To filafinal
      For j = columnainicial To columnafinal
      If ActiveSheet.Cells(i, j) > 3 Then
      MsgBox “ columna ” & j & “fila ” & i & "mayor a 3"
      Else
      End If
      Next
      Next
      MsgBox “Macro finalizada, rango sin mayores a 3”
      End Sub

  19. Necesito saber como quedaria una macro para que no se imprima una hoja si hay una celda vacia

    Mil gracias

    • Hola, no le entiendo su pregunta. pero asumo que busca algo que le diga si hay una celda vacía y en donde esta ubicada. y si no tiene celda vacia pues luego proceder a imprimir.

      esta macro revisa vacíos en un rango que usted especifique, si encuentra uno, le dice en donde esta ubicado, en caso contrario le dice que no tiene vacios

      Sub buscar_vacio_en_rango()

      'va a buscar vacio en un rango ejemplo: para el rango B2:E10
      filainicial = 2
      filafinal = 10
      columnainicial = 2
      columnafinal = 4

      For i = filainicial To filafinal
      For j = columnainicial To columnafinal

      If IsEmpty(ActiveSheet.Cells(i, j)) Then
      MsgBox "vacio en columna " & j & "fila " & i
      Else
      End If

      Next
      Next
      MsgBox "Macro finalizada, rango sin vacios"
      End Sub

  20. Hola grupo buen dia,
    tengo una cosulta, como puedo modificar este código
    Sub BuscarCeco()
    '
    ' BuscarCeco Macro
    '
    ' Acceso directo: CTRL+o
    '
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[2],base,2,0)"
    ActiveCell.Select
    Selection.AutoFill Destination:=ActiveCell.Range("A1:A290")
    ActiveCell.Range("A1:A290").Select
    ActiveWindow.SmallScroll Down:=-6
    End Sub

    de tal forma que no se delimite por rango sino que se llene hasta donde la ultima fila de c este con datos. gracias y saludos

Página de comentarios 1 de 2
1 2

Deja una respuesta

Los campos requeridos estan marcados con *.