Saltar al contenido

Macro para reescribir automaticamente fórmulas en celdas vacias


Recommended Posts

publicado

Hola,

Acerca del ejemplo del cual adjunto un ejemplo, hago la siguiente consulta:

En cada celda de la columna A tengo una fórmula. En esas mismas celdas (las de la columna A) el usuario puede escribir un número; por lo cual la formula que estaba en dicha celda se borraría.

La pregunta es ¿cómo hacer una macro para que si un usuario escribe un numero sobre la formula, y luego borra dicho número, al quedar la celda vacía en ésta se vuelva a reescribir de manera automática la formula que tenía originalmente?

Cabe destacar que no es posible bloquear la celda, porque en la misma columna A se debe poder: o escribir el número que uno quiera, o dejar que actúe la fórmula en base a los datos puestos en la columna B

Macro para formulas.xls

publicado

Lo que estás pidiendo, imagino, es que la fórmula que aparece en la columna "A" se incluyera mediante código al dejar vacía una celda.....es así?

Porque lo que es magia.....como que no.......jejeje

Un saludo,

Tese

publicado

Estimado Tese,

Lo planteo de forma diferente. Partiendo de que las celdas de la columna A no pueden estar bloqueadas, si alguien borra la fórmula de alguna celda de dicha columna, al quedar vacía la celda, que la macro reescriba la formula automáticamente. Como parámetro se puede tomar que la formula de todas las celdas es siempre la misma, con la salvedad que cambia el número de fila.

publicado

Ok, cacatua

Escribe este código en la Hoja1, no en un módulo...


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row > 1 And Target.Value = "" Then
Target.FormulaR1C1 = "=IF(RC[1]=1,""SI"",0)"
End If
End Sub
[/CODE]

Prueba a ver si es eso lo que necesitas........y cuentas....

Un saludo,

Tese

publicado

Hola:

Porque lo que es magia.....como que no.......jejeje

A veces si se puede hacer magia,......jejeje:

Haz una copia de la Hoja1 con el nombre "Copia" y ocúltala

Y coloca esta macro en la Hoja1

Private Sub Worksheet_Change(ByVal Target As Range)

If Trim(Target) = "" Then
If Sheets("Copia").Range(Target.Address).HasFormula = True Then
Target.Formula = Sheets("Copia").Range(Target.Address).Formula
End If
End If

End Sub

[/CODE]

Esta macro restaurará la fórmula de cualquier celda al borrarla.

Saludos a ambos dos.

PD. No me doy al "Me gusta" porqué no puedo, que si no,......jajaja

publicado

Nada, nada, Macro........muy complicado........la mía es más sencilla........recuerdas?.......jejejeje

Cuídate, maestro........y a ver si me dices como se puede contactar contigo directamente, porque no puedo mandarte mensajes privados.....o me tienes en la lista negra ó es que tienes el buzón a tope siempre!!!......jejeje

Chao....

Cacatua.......no hay color........él sabe mucho más......pero la mía es más fácil en este caso......:witless:

Tese

publicado

Ambos dos:

Bueno, bueno,... menos lobos Caperucita,...., mi solución vale para cualquier celda y cualquier fórmula, y además ambas macros tiene el mismo número de líneas.

Saludos a todos menos a dos, ¡Ale! ahí queda eso.

publicado

Disiento totalmente, querido maestro........

Cuando tú haces la copia, cualquier celda posterior de la columna A en la que sea necesario incluir la fórmula no se tendrá en cuenta.......y con la mía sí........aunque solo sea por eso, se adapta mejor a la petición.....jejeje

Y en cuanto a mbenitesh........no te asustes con las proclamas del maestro.......que es buena gente......jejeje.....no hace falta que le hagas la pelota....jejej

Chao.......

Y por cierto, cacatua ha dicho algo?........jejeje

Tese

publicado

He estado probando su programación a la ligera y me funcionó... y ahora que recuerdo tu me ayudaste en un tema también... se te agradece Tese1969 jejej

Disiento totalmente, querido maestro........

Cuando tú haces la copia, cualquier celda posterior de la columna A en la que sea necesario incluir la fórmula no se tendrá en cuenta.......y con la mía sí........aunque solo sea por eso, se adapta mejor a la petición.....jejeje

Y en cuanto a mbenitesh........no te asustes con las proclamas del maestro.......que es buena gente......jejeje.....no hace falta que le hagas la pelota....jejej

Chao.......

Y por cierto, cacatua ha dicho algo?........jejeje

Tese

*Ivette :o

publicado

Amigo Tese,

Dos consulta más:

1) Esta macro tengo que aplicarla sólo a 2 columnas de la hoja que estoy utilizando en realidad: H17:H36 e I17:I36. ¿Cómo debería ser la macro?

2) Esta hoja ya tiene otra macro por otro tema. ¿Cómo hago para agregar esta nueva macro a la hoja, siendo que ya tengo otra funcionando?

publicado

Buenas, cacatua

Te refieres a que tus columnas "H" e "I" hacen las veces de las "A" y "B" del ejemplo?

En cuanto al segundo punto, te diré que depende mucho de lo que para tí signifique "otra macro" en esta hoja.....

Me explico: yo lo que he creado es un código de Evento (Worksheet_Change), que se dispara/ejecuta cuando se produce un cambio en la hoja donde se encuentra incluido......en este caso el eliminar el valor de alguna celda de la columna "A".

No se trata de un módulo asociado al archivo, sino que es código directamente incluido a través del editor de VBA (Alt+F11) en la Hoja1.

Si te parece puedes incluir un nuevo archivo ejemplo "con datos ficticios", pero con la estructura real, para poder ver mejor a qué te estás refiriendo con eso.........

Por cierto, al final no has comentado si te había servido ó era eso lo que esperabas.....

Un saludo,

Tese

publicado

Estimado Tese,

Tu solución me pareció muy buena, es la que utilizaré. Pero me da error en algunos casos que describo a continuación:

Cada vez que en la hoja borro más de una celda a la vez (contenga o no fórmulas) o elimino alguna fila, aparece un cartel de error del Microsoft Visual Basic que dice:

Se ha producido el error '13' en tiempo de ejecución

No coinciden los tipos

Cabe aclarar (por si tuviese algo que ver) que en la misma hoja tengo otra macro puesta, destinada a poder agrupar y/o desagrupar cuando la hoja está protegida. Dicha macro está alojada en el ThisWorkbook, y es la siguiente:

Private Sub Workbook_Open()

With Worksheets("Hoja1")

.EnableOutlining = True

.Protect Password:="", _

Contents:=True, UserInterfaceOnly:=True

End With

End Sub

Saludos,

- - - - - Mensaje combinado - - - - -

Estimado Tese,

Utilicé la función que me pasastes, me parece correcta, pero sucede que cuando selecciono más de una celda a la vez para borrar la información que tienen (sin importar si las celdas seleccionadas contengan fórmulas, texto, o estén vacías); o si quisiese eliminar o agregar una fila/columna, aparece el siguiente error de Microsoft Visual Basic:

Se ha producido el error '13' en tiempo de ejecución:

No coinciden los tipos

Cabe destacar que la hoja también tiene otra macro (por si tuviese algo que ver) destinada a poder agrupar/desagrupar con la hoja protegida. Dicha macro está puesta en ThisWorkbook, y es la siguiente:

Private Sub Workbook_Open()

With Worksheets("Costeo")

.EnableOutlining = True

.Protect Password:="", _

Contents:=True, UserInterfaceOnly:=True

End With

End Sub

¿Podrás ayudarme?

publicado

Buenas, cacatua

Con la línea extra que incluyo a continuación teóricamente desaparece el problema de cuando seleccionas más de una celda...ahora bien, eso supone que si borras alguna de las celdas de la columna "A" junto con otras, ya sean de la misma columna ó fila, no incluirá la "posible" fórmula que pedías en un primer momento.....


Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR=#0000ff]If Target.Count>1 Then Exit Sub[/COLOR]
If Target.Column = 1 And Target.Row > 1 And Target.Value = "" Then
Target.FormulaR1C1 = "=IF(RC[1]=1,""SI"",0)"
End If
End Sub
[/CODE]

Prueba a ver si ahora va mejor.....

Un saludo,

Tese

publicado

Tese querido,

Me parece que lo mejor es terminar utilizando:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 And Target.Row > 1 And Target.Value = "" Then

Target.FormulaR1C1 = "=IF(RC[1]=1,""SI"",0)"

End If

End Sub

Simplemente te pido me ayudes con lo siguiente: en vez de que la macro aplique a la columna A, debe aplicar a las columnas "H" e "I". ¿Cómo debería ser entonces la macro?

publicado

¿Te refieres a que la fórmula iría en H y toma como referencia el valor de I?

Como A y B en tu ejemplo.....me refiero....

Un saludo,

Tese

publicado

No, sino que tanto en H como en I hay celdas con fórmulas (que son las que no se deben borrar), las cuales toman como referencia valores de otros lugares de la hoja

publicado

¿Pero, como quieres incluir una fórmula sin saber cuáles son los valores de referencia?...recuerda que en el código que creé la fórmula la incluíamos con la referencia.....

Un saludo,

Tese

publicado

Tese,

La idea es que la macro se aplique a cualquier fórmula que yo ingrese en cualquier celda de la columna H o en cualquier celda de la columna I. La fórmula inicial (y luego son todas iguales, sólo que cambian el número de celda) están en H11 e I11

- - - - - Mensaje combinado - - - - -

Don Macro Antonio,

Probé su solución y me resultó. Me gusta porque me sirvió para toda la hoja. Tendría que solucionarle sólo una cosa. Cuando selecciono más de una celda a la vez para borrar su contenido (y que de esta manera vuelva a restaurarse la fórmula) me salta el siguiente error:

Se ha producido el error '13' en tiempo de ejecución

No coinciden los tipos

¿Podrá solucionarse? Asimismo planteo -si se pudiese- un nuevo desafío, que la fórmula se restaure no sólo si borro el contenido de la celda, sino también cuando agrego a mano el número 0 (cero).

Abrazo,

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.