Hace ya un año desde que nuestro amigo Antoni nos descubriera la programación en VBA project en esta consulta (ver), es decir, programar en el propio proyecto VBA y alterar el código que siempre ha sido estático para la mayoría.
Este tipo de programación tiene un gran "pero", y es que la seguridad para ejecutar "VBA Editor" es demasiado alta por lo que es necesario realizar antes una configuración de referencias y permisos para que el código pueda ejecutarse en versiones posteriores a Excel 2000. Mas información en la página de Pearson (Programming The VBA Editor), o al final de este post, donde explico brevemente los pasos para los que quieran la ayuda rápida o no dominen bien ingles.
Dedico el aporte a Pedro, quien me inspiró en su énfasis a la hora de reducir mas y mas el peso de los archivos a la hora de subir aportes. Espero puedas sacarle provecho. Y ya pasamos al aporte:
===========
= EL APORTE =
===========
El código que va a ser extraído por la macro extractora, (cortito por ser un ejemplo pero puede ser tantos módulos, procedimientos y líneas como se desee):
This Is The Start
Sub EstoEsUnaPrueba()
Dim Cosa As Integer
For Cosa = 1 To 3
Cells(Cosa, 1) = Cosa
MsgBox "Hola mundo cruel"
Next Cosa
End Sub
This Is The End[/CODE]
El siguiente código, es una macro que extrae información de una página cualquiera, en este caso este mismo post que estáis leyendo. Extrae el código del [b]anterior[/b] cuadro de CODE comprendido entre "[color=Green]This Is The Start[/color]" y "[color=Green]This Is The End[/color]" que es la macro de ejemplo, (un codigo simple cualquiera). Luego crea el modulo y el procedimiento extraído. Elimina el modulo1 con la macro original de extracción y finalmente ejecuta la nueva función.
[CODE]Sub Extractor()
Dim IE As Object
Dim CODE As String
Dim Pos1 As Long, Pos2 As Long, Pos As Long: Pos = 1
Dim Fila As Integer: Fila = 0
'Extrayendo información de www.ayudaexcel.com/foro
Set IE = CreateObject("internetexplorer.application")
With IE
.Navigate "about:blank"
.Visible = False
.Navigate "https://www.ayudaexcel.com/foro/showthread.php?t=18210"
Do While .busy
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Application.Wait Now + TimeSerial(0, 0, 1)
End With
Pos1 = InStr(1, IE.Document.DocumentElement.OuterHTML, "This Is The Start", vbTextCompare)
Pos2 = InStr(Pos1, IE.Document.DocumentElement.OuterHTML, "This Is The End", vbTextCompare)
CODE = Mid(IE.Document.DocumentElement.OuterHTML, Pos1 + 17, Pos2 - Pos1 - 17)
IE.Quit
Set IE = Nothing
'Llamada a función que aun no existe
Application.OnTime Now + TimeValue("00:00:01"), "EstoEsUnaPrueba"
No sabia como se llamaba a un procedimiento que aun no existia sin que saltara error, por eso he usado un OnTimeNow, para llamar a un procedimiento inexistente con un delay de 1 segundo.
El código es muy mejorable, esto era solo un boceto de una idea. Se podría profundizar para hacer que tenga muchas más funcionalidades, como por ejemplo, dejar colgadas online todas las funciones de un usuario y llamarlas por medio de una función extractora a la que únicamente habría que enviarle de parámetros, por ejemplo, el nombre de usuario, Nombre_función, etc...
[b][color=Green]
[center]==============
= INSTRUCCIONES =
==============[/center]
[/color][/b]
[b] - Paso 0) [/b] Creamos un nuevo libro y dentro del mismo agregamos un modulo (Debe llamarse "Módulo1", si no, tendréis que alterar el código). Dentro del modulo, copiar la función "Sub Extractor()". Podeis saltar el Paso 0 descargando el libro de ejemplo adjunto.
[b] - Paso 1)[/b] Añadir referencia: Desde VBA / References: Microsoft Visual Basic For Applications Extensibility 5.3
[b] - Paso 2) [/b] Permitir Seguridad:
__ - (En excel 2003): Herramientas / Macro / Seguridad / pestaña (Editores de confianza) marcamos: Confiar en el acceso a proyectos de Visual Basic.
__ - (Posterior a 2003): Opciones de excel / Centro de confianza / Configuración del centro de confianza / Configuración de macros: Marcamos casilla "Confiar en el acceso al modelo de objetos de proyectos de VBA"
Hola {
=============
= ROLLO INICIAL =
=============
Hace ya un año desde que nuestro amigo Antoni nos descubriera la programación en VBA project en esta consulta (ver), es decir, programar en el propio proyecto VBA y alterar el código que siempre ha sido estático para la mayoría.
Este tipo de programación tiene un gran "pero", y es que la seguridad para ejecutar "VBA Editor" es demasiado alta por lo que es necesario realizar antes una configuración de referencias y permisos para que el código pueda ejecutarse en versiones posteriores a Excel 2000. Mas información en la página de Pearson (Programming The VBA Editor), o al final de este post, donde explico brevemente los pasos para los que quieran la ayuda rápida o no dominen bien ingles.
Dedico el aporte a Pedro, quien me inspiró en su énfasis a la hora de reducir mas y mas el peso de los archivos a la hora de subir aportes. Espero puedas sacarle provecho. Y ya pasamos al aporte:
===========
= EL APORTE =
===========
El código que va a ser extraído por la macro extractora, (cortito por ser un ejemplo pero puede ser tantos módulos, procedimientos y líneas como se desee):
El siguiente código, es una macro que extrae información de una página cualquiera, en este caso este mismo post que estáis leyendo. Extrae el código del [b]anterior[/b] cuadro de CODE comprendido entre "[color=Green]This Is The Start[/color]" y "[color=Green]This Is The End[/color]" que es la macro de ejemplo, (un codigo simple cualquiera). Luego crea el modulo y el procedimiento extraído. Elimina el modulo1 con la macro original de extracción y finalmente ejecuta la nueva función.
Dim IE As Object
Dim CODE As String
Dim Pos1 As Long, Pos2 As Long, Pos As Long: Pos = 1
Dim Fila As Integer: Fila = 0
'Extrayendo información de www.ayudaexcel.com/foro
Set IE = CreateObject("internetexplorer.application")
With IE
.Navigate "about:blank"
.Visible = False
.Navigate "https://www.ayudaexcel.com/foro/showthread.php?t=18210"
Do While .busy
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Application.Wait Now + TimeSerial(0, 0, 1)
End With
Pos1 = InStr(1, IE.Document.DocumentElement.OuterHTML, "This Is The Start", vbTextCompare)
Pos2 = InStr(Pos1, IE.Document.DocumentElement.OuterHTML, "This Is The End", vbTextCompare)
CODE = Mid(IE.Document.DocumentElement.OuterHTML, Pos1 + 17, Pos2 - Pos1 - 17)
IE.Quit
Set IE = Nothing
'Llamada a función que aun no existe
Application.OnTime Now + TimeValue("00:00:01"), "EstoEsUnaPrueba"
'Ensamblando Módulo
Pos1 = 1
Pos2 = InStr(1, CODE, Chr(10), vbTextCompare)
ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).Name = "ModuloEnsamblado"
Do While Pos2
Fila = Fila + 1
ActiveWorkbook.VBProject.VBComponents("ModuloEnsamblado").CodeModule.InsertLines Fila, _
Replace(Replace(Mid(CODE, Pos1, Pos2 - Pos1), Chr(10), ""), Chr(13), "")
Pos1 = Pos2: Pos2 = InStr(Pos1 + 1, CODE, Chr(10), vbTextCompare)
Loop
ActiveWorkbook.VBProject.VBComponents.Remove ActiveWorkbook.VBProject.VBComponents("Módulo1")
End Sub[/CODE]
No sabia como se llamaba a un procedimiento que aun no existia sin que saltara error, por eso he usado un OnTimeNow, para llamar a un procedimiento inexistente con un delay de 1 segundo.
El código es muy mejorable, esto era solo un boceto de una idea. Se podría profundizar para hacer que tenga muchas más funcionalidades, como por ejemplo, dejar colgadas online todas las funciones de un usuario y llamarlas por medio de una función extractora a la que únicamente habría que enviarle de parámetros, por ejemplo, el nombre de usuario, Nombre_función, etc...
[b][color=Green]
[center]==============
= INSTRUCCIONES =
==============[/center]
[/color][/b]
[b] - Paso 0) [/b] Creamos un nuevo libro y dentro del mismo agregamos un modulo (Debe llamarse "Módulo1", si no, tendréis que alterar el código). Dentro del modulo, copiar la función "Sub Extractor()". Podeis saltar el Paso 0 descargando el libro de ejemplo adjunto.
[b] - Paso 1)[/b] Añadir referencia: Desde VBA / References: Microsoft Visual Basic For Applications Extensibility 5.3
[b] - Paso 2) [/b] Permitir Seguridad:
__ - (En excel 2003): Herramientas / Macro / Seguridad / pestaña (Editores de confianza) marcamos: Confiar en el acceso a proyectos de Visual Basic.
__ - (Posterior a 2003): Opciones de excel / Centro de confianza / Configuración del centro de confianza / Configuración de macros: Marcamos casilla "Confiar en el acceso al modelo de objetos de proyectos de VBA"
} Un saludo, espero que os guste.
EnsamblarWebVBA.zip