Visual Basic para Aplicaciones - cambiar formula

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 15/06/2020 21:34:51
Buenas tardes foreros, he utilizado el "grabar macro" para saber como copiar una celda en otra de otra pagina y me ha dado esto cuando yo la celda que he puesto era "Datos L9"

1
ActiveCell.FormulaR1C1 = "=Datos!R[2]C[4]"

No entiendo esta parte Datos!R[2]C[4]" he provado ha hacerl lo mismo pidiendo la celda M9 con lo que me ha puesto

1
ActiveCell.FormulaR1C1 = "=Datos!R[2]C[5]"

Por lo que entiendo que La "R" es la linea y la "C" la columna

he intentado crear una macro donde yo le diga la celda desde un formulario con el siguiente código

1
2
3
4
5
6
7
8
Dim otro As String
Dim otro2 As Integer
 
otro = UserForm1.TextBox2
    otro2 = UserForm1.TextBox3
Sheets("Vivienda 1").Select
Range("c6").Select
    ActiveCell.FormulaR1C1 = "=Datos!R[otro2]C[otro]"
En "otro" pongo la columna y en "otro2" la fila

Me sale el error 1004 "error definido por la aplicación o el objeto
Si alguien me puede decir que estoy haciendo mal
Mil Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.105
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Antoni Masana (376 intervenciones) el 16/06/2020 09:37:19
Como bien dice R es la fila del ingles ROW y C es la columna del ingles COLUMN.

Por otro lado no es lo mismo R[2]C[4] que R9C12.

La primera significa:

R[2]C[4] - es estoy en la fila 7 toma el valor de dos filas más a bajo y estoy en la columna H y toma el valor que hay 4 columnas a la derecha.

La segunda significa:

R9C12 - Toma el valor de la Fila 9, Columna 12 ( L )

En la celda de Excel el primero se escribe L9 (referencia relativa) y el segundo $L$9 (referencia absoluta)

Entendido esto pasemos a la formula:

lo correcto es esto:

1
ActiveCell.FormulaR1C1 = "=Datos!R" & otro2 & "C" & otro

Veras que he quitado lo corchetes porque supongo que quieres poner una referencia absoluta.
otro y otro2 son variables y van fuera de las comillas porque de lo contrario es texto.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 13:22:23
Gracias Antoni, funciona perfecto, es justo lo que necesitaba.
Ya solo me falta saber como añadir la celda a la cabecera de la hoja datos para que cambie el nombre de la hoja si fuese necesario (disculpa que ya lo pregunte en el tema anterior)
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.105
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Antoni Masana (376 intervenciones) el 16/06/2020 14:20:59
Para cambiar el nombre de la hoja

1
Sheets(...).name = Nuevo_Nombre

En los puntos suspensivos debes poner el nombre anterior o el numero de hoja.

1
Sheets("Vivienda 1").Name = "Nueno nombre"

Si ejecutas esta línea de código te funcionara bien la primera vez pero si vuelves a ejecutarla por segunda vez te dada error porque la hoja "Vivienda 1" ya no existe, ahora se llama "Nuevo nombre".

1
Sheets(3).Name = "Nueno nombre"

Esto siempre funciona porque la tercera hoja siempre es la número 3 independientemente de como se llame.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 14:50:48
Gracias Antoni, ya tengo la formula para que me cambie el nombre de la hoja si se cambia el valor de la celda que le toca, lo tengo puesto en la cabecera( yo lo llamo cabecera cundo le doy a "ver Código" de la hoja) de la hoja "datos" lo que necesito es ir añadiendo las nuevas hojas
poniendo la celda con el numero de la hoja, este es el código que uso

1
2
3
4
Set KeyCells = Range("d8")
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
    Hoja5.Name = [d8]
End If

lo primero seria saber como escribir en la cabecera, y ya no se hacerlo, empiezo bien, jejeje

por cierto intento usar tu formula anterior en una condición y me salta error en la coma de "","" ( he cambiado otro por columna y otro2 por fila)
Error de compilación
Se esperaba: fin de la instrucción

1
ActiveCell.FormulaR1C1 = "=IF(Datos!R" & Fila & "C" & Columna= """","""",Datos!R[3]C)"

La formula la he copiado de un "grabar Macro" que me ha dado esta

1
ActiveCell.FormulaR1C1 = "=IF(Datos!R[3]C[10]="""","""",Datos!R[3]C)"

no entiendo por que funciona solo y no funciona con el IF

saludos y Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 16/06/2020 17:02:57
Esta es tu formula grabada
ActiveCell.FormulaR1C1 = "=IF(Datos!R[3]C[10]="""","""",Datos!R[3]C)"

Y supongo que quieres cambiar [3] por Fila y [10] por columna.

Empieza por partir cadenas:

1
2
3
4
5
ActiveCell.FormulaR1C1 = "=IF(Datos!R[
3
]C[
10
]="""","""",Datos!R[3]C)"

Cierra las comillas de las cadenas que has partido y pon los concatenadores:
1
2
3
4
5
ActiveCell.FormulaR1C1 = "=IF(Datos!R[" &
3 &
"]C[" &
10 &
"]="""","""",Datos!R[3]C)"

Cambia el 3 por Fila y el 10 por Columna
1
2
3
4
5
ActiveCell.FormulaR1C1 = "=IF(Datos!R[" &
Fila &
"]C[" &
Columna &
"]="""","""",Datos!R[3]C)"

Te queda:
1
ActiveCell.FormulaR1C1 = "=IF(Datos!R[" &Fila &"]C[" &Columna &"]="""","""",Datos!R[3]C)"

Este tipo de sustituciones no son dificiles, pero son "liosas". Nada mejor que un poco de orden.

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Antoni Masana
Val: 1.105
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Antoni Masana (376 intervenciones) el 16/06/2020 17:19:42
No se si no me he explicado bien o no me has entendido

Esta macro

1
2
3
4
5
6
Sub Macro()
    Range("C6").Select
    Fila = 2
    Colum = 4
    ActiveCell.FormulaR1C1 = "=IF(Datos!R[" & Fila & "]C[" & Colum & "]="""","""",Datos!R[3]C)"
End Sub

Da como resultado en la celda C6:

1
=SI(Datos!G8="";"";Datos!C9)

Y esta otra que la diferencia con la anterior es que no tiene los corchetes

1
2
3
4
5
6
Sub Macro()
    Range("C6").Select
    Fila = 2
    Colum = 4
    ActiveCell.FormulaR1C1 = "=IF(Datos!R" & Fila & "C" & Colum & "="""","""",Datos!R3C)"
End Sub

Da como resultado en la celda C6:

1
=SI(Datos!$D$2="";"";Datos!C$3)

Es evidente que los corchetes juegan un papel MUY importante.

Si en la celda B2 le pones que te devuelva el valor de E4 asi =E4 la macro graba =R[2]C[3]
Si en la celda B2 le pones que te devuelva el valor de E4 asi =$E$4 la macro graba =R4C5

No me expliques como lo estas haciendo porque no lo entiendo.
Explica que quieres hacer y te explicare como hacerlo.
Y ayuda mucho a entenderlo si subes un ejemplo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 17:57:53
Gracias Antoni, Ret me lo ha resuelto pero con tu respuesta aprendo
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 17:54:04
Gracias RET por tu respuesta, así voy aprendiendo, solo un pequeño detalle (lo he aprendido hoy gracias a Antoni) para que funcione correctamente No se deben de poner [ ] por que si no toma como referencia la celda donde estas escribiendo he puesto la "L9" y me ha puesto "N15" por que estaba escribiendo en la "B6"
Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 16/06/2020 18:59:36
Albert,

Efectivamente, si pones corchetes le estás indicando que use referencias relativas. Si no los pones, estás dando referencias absolutas a la fila y columna que indiques junto a R y C respectivamente. Y también puedes "mezclar", es decir, fijar solo filas o solo columnas. Eso depende de lo que necesites.

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 19:16:09
Perdona una pregunta que ya he hecho pero necesito una respuesta, igual no es facil, necesito poder escribir en la cabecera de la hoja desde un modulo lo que tengo que escribir sera algo asi

1
2
3
4
5
6
7
8
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    'Vivienda 1
    Set KeyCells = Range("C8")
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
    Hoja4.Name = [C8]
End If
End sub

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 16/06/2020 19:51:02
No tengo claro que quieres decir. Quieres que si se escribe algo en la celda C8, ese valor pase a ser el nombre de la hoja?

Si es eso, cambia Hoja4.Name = [C8] por Hoja4.Name = Hoja4.Cells(8,3).Value

Ojo, que si lo que se pone en la celda C8 no es un nombre valido, te generará un error que deberás gestionar. Por ejemplo, si el cambio en la hoja que dispara el evento es que borras el contenido de C8.

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 20:06:31
No perdona no me he explicado bien ,lo que quiero es que al generar una hoja nueva poder con una macro escribir lo mismo que ves a continuación de lo que ya esta en el vba de la hoja datos , no se como se llama cuando estas en el editor y clicas sobre "Hoja1(Datos), cambiando las celdas de referencia , quiero borrar todas las hojas de vivienda menos la 1 y así ir generando los libros según necesidad del proyecto y que al generar la hoja nueva se me ponga todo lo necesario, adjunto el libro para que lo veas, ya se que me explico mal, disculpa
Gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 16/06/2020 20:22:00
Debo andar bastante espeso... Quieres generar el código VBA en el módulo asociado a la nueva hoja o quieres crear una hoja, llamar a esas hoja ViviendaX y copiar una plantilla a esa nueva hoja?

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 16/06/2020 20:39:39
quiero dejar solo las hojas "datos" "construidas" "útiles" "vivienda1" vivienda2" y al generar una hoja nueva (mira el modulo2) se genera de manera que los datos de la hoja datos se ponen donde toca en la nueva, lo que necesito es poner que se cambie el nombre en caso de necesidad (por que la he generado mal o a la jefa le da por cambiar por ejemplo de" Vivienda3 "a " piso B3" lo que quiero es que se haga automático al cambiar la celda de la hoja datos, acabo de cambiar el archivo adjunto con una nota en la cabecera (VBA) de la hoja "datos" intento explicarme pero eso es difícil para mi
Muchas gracias por tu tiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 16/06/2020 22:19:20
Crear código en tiempo de ejecución es posible, pero no puedes modificar el mismo procedimiento que estás ejecutando.

Si te he entendido, lo que quieres es que si se cambia alguno de los nombres de cabecera (Título de hojas), se modifique el nombre de la hoja correspondiente. Yo creo que es mejor hacer una rutina que valga para todos los casos. Prueba algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim NombreAnt As String
    Dim NuevoNombre As String
 
    If Application.Intersect(Target, Range("C8:K8")) Is Nothing Then Exit Sub
 
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    NuevoNombre = Target.Value
    Application.Undo
    NombreAnt = Target.Value
    Target.Value = NuevoNombre
    Sheets(NombreAnt).Name = NuevoNombre
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Ojo, que no maneja errores. Si vas a dejar cabeceras en blanco para crear nuevas hojas, deberias comprobar que NombreAnt no sea "" y si lo es, crear nueva hoja.

Si añades mas columnas para las viviendas, revisa el rango C8:K8

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 17/06/2020 09:13:54
Gracias por tu respuesta, no puedo utilizarlo así por que no se hasta donde debería ponerlo puesto que no se cuantas viviendas van a tener los proyectos pueden ir de 1 a 25 o mas así que debo ponerlos columna por columna como esta en la hoja "datos"
Gracias por tu tiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RET
Val: 117
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por RET (32 intervenciones) el 17/06/2020 09:38:30
Pues en ese caso, te sugeriría que pensases en como puedes saber cuantas tienes y adaptar el rango "C8:K8" de forma automática.

IMF_RET
https://InformaticaMuyFacil.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 169
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

cambiar formula

Publicado por Albert (161 intervenciones) el 17/06/2020 16:59:19
ok gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar