Buscar en una columna las celdas vacías y colocar una fórmula con variables tipo string vba Excel

De TodoExpertos,

Les agradezco de anticipo cualquier aporte a esta pregunta, pasando a mi pregunta les explico:
Necesito formular una macro, que busque dentro de un rango de columna todas las celdas vacías y me permita insertar una formula mediante variables como yo lo he echo (formula: =SI.ERROR(DIAS(H15,G15)," ")) si tienen otra solución mejor, pueden ayudar me a corregir mi codigo se los agradeceré. A continuación les coloco el código que elabore, aun tiene fallas al momento de hacer una validación "Falsa" osea cuando hay datos en la columna, o mejor dicho todas las celdas tienen un valor y no hay ninguna vacía, me arroga un Error 13.
todo el codigo:

Sub totalDias()

Dim celda As Object
Dim text, text2, text3 As String
Dim rango As Range
Dim numFila As Integer

text = "=SI.ERROR(DIAS(H"
text2 = ",G"
text3 = "),)"

Set rango = Range("J15:J150")

For Each celda In rango
If celda = "" Then
numFila = celda.Row
MsgBox "Se encontro la fila " & numFila & " sin registro, para rellenar la fila encontrada presione Aceptar "
Range("J15:J150").Select
celda.Value = text & numFila & text2 & numFila & text3
ElseIf celda = 0 Then
MsgBox "0 Resultados en la busqueda de celdas vacias "
Exit Sub
Else
End If
Next celda

End Sub

Cuando en el rango de columnas hay una celda vacía, busca la celda y con Row encuentra el numero de fila y inserta con la fórmula el numero de fila correspondiente, como se ve en la concatenación.

celda.Value = text & numFila & text2 & numFila & text3

Tengo otra duda si quiero poner una Msgbox con vbYesNo, no me acepta la respuesta no, aun presionando me coloca los datos como si fuera YES.

Pero el error que quiero resolver es cuando al depurar me aparece la siguiente línea de código "If celda = "" Then" como la causante del error 13,

Si hay algún otro dato que pueda aportar, para resolver este error

Respuesta
2

No entiendo lo que hace la fórmula que estas usando de todas maneras te mando un ejemplo bastante sencillo de como hacer lo que quieres, la instrucción busca espacios en blanco en el rango j15 a j150 si los encuentra los rellenara con la fórmula sino simplemente no hará nada.

y esta es la macro

Sub rellena()
Range("j15:j150").Replace what:="", replacement:="=iferror(dias(h,g),)"
End Sub

Esta es otra opción por si la primera no funciona

Sub RELLENA()
Set DATOS = Range("j15:j150")
With DATOS
For I = 1 To .Rows.Count
    vacio = .Cells(I, 1) = Empty
    If vacio Then
        RANGO1 = .Cells(I, -2).Address
        RANGO2 = .Cells(I, -1).Address
        .Cells(I, 1).Formula = "=IFERROR(Dias(" & RANGO1 & "," _
        & RANGO2 & ")" & ", " & " " & ")"
    End If
Next I
End With
Set DATOS = Nothing
End Sub

Gracias ante todo james bond,
Te explico primero mi código como funciona y el error que tiene y después explico como me han funcionado los 2 códigos que me proporcionaste. Comparto una imagen de el proceso de ejecución:


Te explico en el primer código que me enviaste no toma en cuenta el numero de fila a la que corresponde cada vez que va a pegar el código, lo que hace es esto:

Funcionaria si colocara la fórmula de acuerdo a la fila donde inserta la fórmula, te explico el otro con imagen:

probaste el segundo codigo?, de ese no mencionaste nada, te explico el problema con tu macro, estas tratando de poner una formula con una cadena string que al final Excel la va a considerar como texto por la forma en que la escribes, celda.Value = text & numFila & text2 & numFila & text3celda.Value = text & numFila & text2 & numFila & text3, lo unico que hara sera crearte una cadena de texto y nada mas, por eso tienes que darle Enter individualmente a cada celda para que se active la formula, le hice algunas modificaciones a tu codigo, para que coloque formulas en vez de texto

Sub totalDias()
Dim celda As Object
Dim text, text2, text3 As String
Dim rango As Range
Dim numFila As Integer
'text = "=SI.ERROR(DIAS(H"
'text2 = ",G"
'text3 = "),)"
Set rango = Range("J15:J150")
x = 1
For Each celda In rango
If celda = "" Then
numFila = celda.Row
MsgBox "Se encontro la fila " & numFila & " sin registro, para rellenar la fila encontrada presione Aceptar "
        RANGO1 = celda.Offset(I, -2).Address
        RANGO2 = celda.Offset(I, -1).Address
celda.Formula = "=IFERROR(Dias(" & RANGO1 & "," _
& RANGO2 & ")" & ", " & "" & ")"
x = x + 1
ElseIf celda = 0 Then
MsgBox "0 Resultados en la busqueda de celdas vacias "
Exit Sub
Else
End If
Next celda
End Sub

Gracias por aportar,

Si he entendido lo de la cadena de texto, he probado tu segundo código si funciona pero el detalle es que me inserta formulas con rangos absoluto "=SI.ERROR(DIAS($G$17,$H$17),)" que en excel se detectan con el símbolo $ después de cada letra o numero de un rango. La verdad no tengo idea de como modificar tu código para que entregue el rango correspondiente a la fila y sin valor asoluto como por ejemplo =SI.ERROR(DIAS(H17,G17)," "), si me puedes ayudar con esto te lo agradeceré. Si probé el código y al momento de poner un valor no me entregaba el total de días como lo marca la formula solo se quedaba en 0 como se ve en la siguiente imagen.

El error no esta en si es absoluta o no la referencia más bien es tu fórmula, yo no puedo probarla porque la función días salio a partir del office 2013, to tengo la 2007, aun así te dejo dos fórmulas la que manejas y una alternativa, además según veo en tu imagen en la columna fechas de entrega tienes un triangulo de colores que puede significar que el dato esta en un formato que no es fecha y ese pudiera ser el porque no sale la operación.

Sub RELLENA()
Set datos = Range("j15:j150")
With datos
For i = 1 To .Rows.Count
    vacio = .Cells(i, 1) = Empty
    If vacio Then
    MsgBox ("LA FILA " & 14 + i & " ESTA VACIA"), vbInformation, "AVISO EXCEL"
        rango1 = .Cells(i, -2).Address(False, False)
        rango2 = .Cells(i, -1).Address(False, False)
        '.Cells(i, 1).Formula = "=iferror(DAYS(" & rango2 & "," & rango1 & "), )"
        .Cells(i, 1).Formula = "=" & rango2 & "-" & rango1
    End If
Next i
End With
Set datos = Nothing
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas