Macro para cambiar parte del contenido en un modulo ?
Necesitaría una macro dentro del mismo libro, que me cambie en una macros que están en Modulo 1 y 2
Parte del contenido.
Dentro de una ruta ejemplo: Libro Nº6 por Libro Nº7 o simplemente Nº6 por Nº7
1 Respuesta
[Hola
Sí se puede cambiar líneas de macros con otras macros pero, no es tan simple como por ejemplo usar "reemplazar" en una celda y por eso mismo yo sugiero que comentes un poco más sobre lo que necesitas y/o en que momentos, ya que igual si reemplazas una vez ¿qué pasaría y/o de dónde sacarías los datos para hacer una y otra vez (de ser necesario)?
Comentas.
Abraham Valencia
Seria cambiar un dato determinado desde una celda de una hoja.
La celda donde estaría el dato a cambiar en los módulos ejemplo: G10 nombre de hoja CENTRADAS LIBRO Nº6 por LIBRO Nº7 o Nº6 por Nº7
Esta sería una de las varias macros que están en el modulo 1 y mas de lo mismo en modulo 2 solo cambia el nombre de las macros el contenido es lo mismo salvo el dato del libro3, el dato a cambiar seria LIBRO Nº6 por LIBRO Nº7 o Nº6 por Nº7, que irá cambiando en G10 hoja CENTRADAS.
Sub UNA_2010_11 ()
Application.ScreenUpdating = False
Workbooks.Open Filename:="C:\Users\root\Desktop\ESCRITORIO\CARPETA1\LIBRO1\CARPETA2\CARPETA3\LIBRO Nº6\2010-11\LIBRO3.xlsm"
Sheets("HOJA1").Select
Range("C34").Select
Application.Run "'LIBRO3.xlsm'! RUTAS_VARIANTES"
End Sub
Y desde un libro maestro que sería el mismo donde reflejo la explicación de arriba, hacer lo mismo pero de otros libros en otras carpetas.
Espero explicarme bien.
Un Saludo.
[Hola
Cambiar el código me parece poco práctico, mejor tener en la celda que mencionas siempre el nombre del libro que necesitas. Cambia esta línea así:
Workbooks.Open Filename:= _ "C:\Users\root\Desktop\ESCRITORIO\CARPETA1\LIBRO1\CARPETA2\CARPETA3\" & Worksheets("Centradas").Range("G10").Value & _ "\2010-11\LIBRO3.xlsm"
Y en la celda G10 de la hoja "Centradas" siempre ten el nombre del libro que deseas. Comentas
Abraham Valencia
Perdona no entiendo de tener en g10 el libro que necesito ???
lo unico que entiendo es la incorporacion dentro de la macro
" & Worksheets("Centradas").Range("G10").Value & _ "
Que hace referencia a lo que escriba en la celda G10, pero esto como cambia los datos de la macro en un modulo que quiero Nº6 por Nº7 ???
Un Saludo.
[Hola nuevamente
Lo que he hecho aquí, al igual que en el otro foro en el que han intentado ayudarte, es usar la forma que suena más lógica y fácil para reemplazar valores dentro de una cadena, siendo en este caso la cadena una parte de tu ruta.
Si reemplazas la línea tal cual te he sugerido, basta que en la celda respectiva de la hoja correspondiente pongas el nombre exacto de la (sub) carpeta desde la que necesitas abrir el archivo, es decir, solo tendrías que cambiar el valor de la celda por el adecuado cada vez antes de correr la macro.
Si quieres usar el "LIBRO Nº7" basta poner eso en la celda, lo mismo para "LIBRO Nº6" o lo que necesites (obvio sin las comillas dentro de la celda)..
De ese modo no tendrás que estar cambiando una macro con otra macro, sino solo el valor de la celda.
¿Se entiende?
Abraham Valencia
PD: Si insistes en cambiar una macro con otra macro, es aún más complicado que esto (sobre todo de entender) por si acaso.
Bueno voy abandonar la idea de cambiar la primera macro desde el libro maestro, desde este lo are desde buscar reemplazar desde módulos.
En lo anterior con
" & Worksheets("Centradas").Range("G10").Value & _ "
Lo que monte no cambiaba nada en modulo, que es mi intención.
Pero ahora sobre la misma idea desde LIBRO1 (maestro) cambiar en LIBRO2 en modulo 1 el dato "Nº4” por "Nº5” o el que fuese 6, 7, 8,9 de esta macro ( esto es para varias carpetas con libros y es un coñazo cambiar modulo a modulo el dato "Nº4” ) :
Sub RUTAS_VARIANTES()
Sheets("HOJA 1").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 2").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 3").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 4").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 5").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA6").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA7").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 8").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 9").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA 10").Select
Cells.Replace What:="Nº4", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Sheets("HOJA ORIGINAL").Select
ThisWorkbook.Close SaveChanges:=True
End Sub
Un saludo.
[Hola
Ya vi lo que escribiste en el otro foro por lo que, para que no te quedes con la intriga, igual te dejo un ejemplo de cómo cambiar macros con macros. Primero que nada debes activar las referencias a "Microsoft Visual Basic for Applications Extensibility 5.3". Luego, por ejemplo para cambiar datos del "Módulo5" como por ejemplo la palabra "LIBRO Nº6" y cambiarla por "LIBRO Nº7", se usa esto:
Sub CambiarSub() Dim VBModulo As CodeModule Dim LineasCod As Integer, x As Integer Dim Cadena As String Set VBModulo = Workbooks(1).VBProject.VBComponents("Módulo5").CodeModule Let LineasCod = VBModulo.CountOfLines For x = 1 To LineasCod Let Cadena = VBModulo.Lines(x, 1) If InStr(1, Cadena, "LIBRO Nº6") > 0 Then Let Cadena = Application.WorksheetFunction.Substitute(Cadena, "LIBRO Nº6", "LIBRO Nº7") VBModulo.replaceLine (x), Cadena End If Next x End Sub
Donde dice "Workbooks(1)" para mayor especificación puede ir el nombre del libro con las macros a cambiarse. Segundo, en este caso se cambia de un módulo puntual pero también se puede hacer un bucle que recorra todos los módulos del libro correspondiente pero, obvio hay que programar más.
Saludos]
Abraham Valencia
Me imagino que sera lo que ves de mi solución es del mismo foro.
Y como veras solo me queeda un tema y es el cambio en módulos pero desde el mismo libro maestro, voy a ver si soy capaz de acoplar esta macro.
¿En herramientas>Referencias no tengo la librería Microsoft Visual Basic for Applications Extensibility 5.3?
Pues a menos que uses Excel 97 o inferior (y no creo que sea el caso), ahí debería de estar. Las referencias están en orden alfabético, debería ser fácil de encontrar:
Verifica.
Abraham Valencia
Lo encontre.
En el libro maestro CAMBIAR RUTAS.xlsm,trato de acoplar tu macro para cambiar valores del Nº6 al Nº7 en modulo 4 (realmente serian cambiar dos valores a la vez ) que estoy haciendo mal ???
Sub CambiarSub()
Dim VBModulo As CodeModule
Dim LineasCod As Integer, x As Integer
Dim Cadena As String
Set VBModulo = Workbooks(CAMBIAR RUTAS.xlsm).VBProject.VBComponents("Módulo4").CodeModule
Let LineasCod = VBModulo.CountOfLines
For x = 1 To LineasCod
Let Cadena = VBModulo.Lines(x, 1)
If InStr(1, Cadena, "Nº6") > 0 Then
Let Cadena = Application.WorksheetFunction.Substitute(Cadena, "Nº6", "Nº7")
VBModulo.replaceLine (x), Cadena
End If
Next x
End Sub
me da error en esta linea
Set VBModulo = Workbooks(CAMBIAR RUTAS.xlsm).VBProject.VBComponents("Módulo4").CodeModule
Un Saludo.
Los nombres de archivos/libros van entre comillas ya que son cadenas de texto:
Set VBModulo = Workbooks("CAMBIAR RUTAS.xlsm").VBProject.VBComponents("Módulo4").CodeModule
Saludos]
Abraham Valencia
esta macro va ok.
Para libros externos tambien me funciona ok.
Sub Cambiar_Libro_2_2010_11()
Dim VBModulo As CodeModule
Dim LineasCod As Integer, x As Integer
Dim Cadena As String
Set VBModulo = Workbooks.Open("RUTA……..").VBProject.VBComponents("Módulo3").CodeModule
Let LineasCod = VBModulo.CountOfLines
For x = 1 To LineasCod
Let Cadena = VBModulo.Lines(x, 1)
If InStr(1, Cadena, "LIBRO SOLO 12 EUR Nº4") > 0 Then
Let Cadena = Application.WorksheetFunction.Substitute(Cadena, "LIBRO SOLO 12 EUR Nº4", "LIBRO 12 EUR Nº7")
VBModulo.replaceLine (x), Cadena
End If
Next x
Application.Run "'Libro 2.xlsm'! Cerrarlibro"
End Sub
Pero para cambiar dos datos ???? cambiar a la vez ejemplo Nº4 por Nº5 y Nº5 por Nº6 pero cada uno en la posision donde se encuentran en la macro.
Y ya sin querer abusar más de tu tiempo, estos cambios que se realizan en la macro Nº4 por Nº5 ect… desde una referencia en una celda del libro ¿??
Estas macros me ahorran un montón de trabajo, pero para ya finalizar de acabar el rizo desde una celda no tengo que entrar en los módulos y hacer los cambios manual
Un Saludo.
[Hola
En realidad una forma es agregar más "If" o quizás mejor "ElseIf," y en cada uno la cadena a ser reemplazada y el reemplazo. Ah, ojo, escribiste "Nº4 por Nº5 y Nº5 por Nº6", asumo que sería algo más bien parecido a " Nº4 por Nº5 y Nº6 por Nº7", ya que reemplazar para reemplazar no tiene sentido.
Sobre usar referencias desde celdas del libro, pues es algo parecido a lo que te mencioné antes:
Let Cadena = Application.WorksheetFunction.Substitute(Cadena, Worksheets("nombrehoja").Range("A3"), Worksheets("nombrehoja").Range("B3"))
Algo así.
Abraham Valencia
los dos datos que hay en la macro del libro que cambian datos de otro libro externo
Sub RUTAS_2010_11_()
Worksheets("HOJA 1").Select
Range("A1:A14").Replace What:="Nº5", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Worksheets("HOJA 2").Select
Range("A1:A14").Replace What:="Nº5", Replacement:= _
"Nº6", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Como puedes ver en un momento dado tengo que cambiar en Nº5 por el Nº6 y el Nº6 por Nº7
De tu macro hice 2 macros con distintos nombres( para poder cambiar dos datos a la vez de la macro) y después la unifique en una macro y cambios manuales de datos y pufff al menor despiste me veo con dos Nº5 o dos Nº6 en la macro.
Un Saludo.
La programación es mucho de lógica, copiar/pegar y/o unificar procesos, no necesariamente y/o siempre dará el resultado esperado.
El dilema es que estamos en un momento en que solo tú, que conoces tus archivos al detalle y que con exactitud tienes una idea de lo que quieres hacer, puedes resolver y/o programar lo que necesitas.
Igual, de haber otras preguntas puntuales, ya sabes que en los foros siempre hay gente dispuesta a ayudar, aunque no siempre crean (creamos) que la respuesta ideal sea la que un usuario cree/espera je je je.
Saludos]
Abraham Valencia
- Compartir respuesta