Jump to content
Sign in to follow this  
AlexanderS

Actualizar código vba de varios archivos por medio de un txt en la red.

Recommended Posts

Voy a tratar de ser lo mas claro posible.

Supongamos que en nuestro trabajo estamos conectados a una red local y hemos realizado un archivo con macros para varios compañeros (el mismo para todos), resulta que encontramos un error en nuestro código y debemos empezar a actualizar cada uno de los archivos a nuestros compañeros, esto tomara algo de tiempo y tal vez a alguno no podamos actualizarlo porque no esta o etc, el departamento va a quedar con diferentes versiones del archivo.

Con el código que les facilito podemos actualizar todos los archivos de nuestros compañeros automáticamente sin necesidad de nosotros intervenir ya que solo debemos crear un archivo txt con el código actualizado o corregido y cada archivo en cada computadora al abrirse encontrara la actualización y procederá a reemplazar el código del archivo automáticamente.

1.Este código lo copiaremos en "ThisWorkbook" y reemplazaremos la ruta "sfile" por la deseada y el nombre del modulo que se debe actualizar. Obviamente esto solo se debe realizar en la primera versión del archivo.


Public codigo As String
Public sfile As String
Public NOM_MODULO As String
Private Sub Workbook_Open(): On Error Resume Next
'Comprobamos si existe una nueva versión del código
Dim oVBMod As Object
Dim ReadData As String
Dim x, y As Double
Call comprueba
sfile = "\\10.10.xxx.xxx\turuta\ejemplo.txt" 'Ruta del archivo de actualización
NOM_MODULO = "Code" 'Nombre del modulo que se actualizara

Open sfile For Input As #1: Line Input #1, ReadData: Close #1
Set oVBMod = ThisWorkbook.VBProject.VBComponents(NOM_MODULO)
x = Val(Right(ReadData, Len(ReadData) - 1))
y = Val(Right(oVBMod.CodeModule.Lines(1, 1), Len(oVBMod.CodeModule.Lines(1, 1)) - 1))
If x > _
y Then _
MsgBox "Nueva versión disponible", vbInformation, "By Riddle": Call GetCode

End Sub

Private Sub GetCode(): On Error Resume Next
'Creamos y copiamos el codigo al modulo
Dim str As Object
Dim NewModule As Object
Call Ext_Txt
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(NOM_MODULO)
Set NewModule = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
With NewModule
.Name = NOM_MODULO
.CodeModule.InsertLines 1, codigo
End With
MsgBox "Actualización aplicada correctamente", vbInformation, "By Riddle"
End Sub

Private Sub Ext_Txt(): On Error Resume Next
'Extraemos el codigo del txt
Dim fso As Object
Dim ts As Object
codigo = Empty
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sfile).OpenAsTextStream(1, -2)
codigo = ts.readall
ts.Close
End Sub

Private Sub comprueba()
'Comprobamos los permisos de seguridad para excel
Dim VBP As Object
If Val(Application.Version) >= 10 Then
On Error Resume Next
Set VBP = ActiveWorkbook.VBProject
If Err.Number <> 0 Then
MsgBox "Parece que la configuración de seguridad no permite que se ejecute el proceso de actualización de Macros." _
& vbCrLf & vbCrLf & "Para cambiar tu configuración de seguridad:" _
& vbCrLf & vbCrLf & " 1. Selecciona Opciones - Centro de confianza - Configuración." & vbCrLf _
& " 2. Selecciona Macros y activa la casilla ''Confiar en el acceso al modelo de objetos de proyectos de vba''" & vbCrLf _
& " 3. Cierra y vuelve a abrir el programa.'", _
vbCritical, "By Riddle"
End
End If
End If
End Sub
[/CODE]

[/spoiler]

[b][color=#b30000]2.[/color][/b]En el ejemplo al colocar un archivo txt en la ruta establecida el contenido de este reemplazara todo el modulo llamado "Code"

[color=#b30000][b]3.[/b][/color]En el Txt de actualización [u][color=#b30000]debemos colocar en la primera linea la versión del código[/color][/u] ejem: '1.01 con un apostrofe delante. Al detectar una versión [u][color=#b30000]superior[/color][/u] del código se ejecutara el proceso de actualización.

[spoiler=IMPORTANTE !!!!!!!!]

Debes tener habilitada la opción: Confiar en el acceso al modelo de objetos de proyectos de VBA desde la configuración de Macros del centro de confianza.

[/spoiler]

Adjunto un pequeño ejemplo, pueden probar cambiando el numero de versión y el codigo de la sub prueba en el txt y después abrir el excel para que se actualice.

Saludos a todos.

Actualizar VBA.rar

Share this post


Link to post
Share on other sites

Muy bueno [uSER=143023]@Riddle[/uSER], he hecho a mi me ayuda mucho, aun que nose si este código también puede actualizar toda la aplicación por ejemplo, nuevos formularios y bueno los modulo de clase, etc. (solo aplicación y nada de sus datos guardados)

te comento aca tengo una aplicación que funciona en 3 lugares entonces cuando agrego algo nuevo tengo que ir al sitio para actualizar, agregar los frm, modulos etc para no dañar sus datos.

Saludos,

Celest3

Share this post


Link to post
Share on other sites

[uSER=83431]@Celest3[/uSER]:

tengo una aplicación que funciona en 3 lugares entonces cuando agrego algo nuevo tengo que ir al sitio para actualizar, agregar los frm, modulos etc para no dañar sus datos

Con independencia de trabajar o no en red, es aconsejable separar el código de los datos en archivos distintos, de esta manera solo hay que sustituir el archivo que contiene el código, por el nuevo cuando hay modificaciones, sin tener que preocuparse de los archivos que contienen los datos.

Share this post


Link to post
Share on other sites

Hola pues si es posible actualizar varios módulos al mismo tiempo e incluso crear formularios, módulos normales o de clase, solo que el código que aporte esta pensado para actualizar el contenido de un solo modulo, podría pensar alguna forma de adaptar el código para que realizara esas acciones.

Share this post


Link to post
Share on other sites

Excelente [uSER=143023]@Riddle[/uSER], tengo una situación parecida con un archivo que usamos en la oficina y con este aporte tuyo, puedo ahorrar mucho tiempo y esfuerzo.

Como siempre, un placer estar por acá.

Saludos.

Share this post


Link to post
Share on other sites

Muy bueno. Muchas gracias. Lo estoy poniendo en práctica y funciona a la perfección.

Sería interesante realizar lo mismo pero con que el archivo de actualización estuviese en una ruta fuera de la red local. Por ejemplo, Dropbox.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

INFORMACIÓN BÁSICA SOBRE PROTECCIÓN DE DATOS

Responsable: Sergio Andrés Celemín

Finalidad: Moderar y responder comentarios de usuarios. Recuerda que la información que facilites es pública, y los datos que incluyas los leerá cualquier visitante de esta web, así como el avatar que poseas.

Legitimación: Consentimiento del interesado.

Destinatarios: Hetzner Online GmbH.

Derechos: Puedes ejercitar en cualquier momento tus derechos de acceso,
rectificación, supresión, oposición y demás derechos legalmente establecidos a
través del email sergio@ayudaexcel.com.

Información adicional: Encontrarás más información en la política de privacidad.

Sign in to follow this  



  • Posts

    • Saludos compañeros,tengo una tabla dinamica con algunas medidas,una de ellas devuelve el ultimo vendedor que tuvo cierto cliente,el caso es que cuando filtro por vendedor,efectivamente muestra el vendedor,pero sigue mostrando los clientes que antes atendia pero que ya no,solo que en la columna ult vendedor queda la celda vacia,lo que me indica que ese cliente lo tiene actualmente otro vendedor,lo que deseo es que cuando se realice el filtro solo aparezca el vendedor con su cliente actual,sin celdas en blanco en la columna ultvendedor,en el ejemplo adjunto hay mas aclaratorias.tengo otras preguntas que estan relacionadas con el mismo archivo pero no se si es posible hacer varias preguntas en u mismo post,la otra pregunta es como puedo meter en un slicer una medida para filtrar por esa medida,en la columna estatus tengo el estatus de activo,down y bajada quiero un slicer que cuando selecione lost me aparezcan solo los clientes perdidos por ejemplo,y finalmente como puedo hacer un conteo de los clientes con los diferentes estatus por vendedor para poder hacer luego un analisis de cuantos clientes perdidos,activos o en bajada tienen cada vendedor,si debo hacer estas preguntas en otro post me disculpo y lo hare seguro,volvemos solo a la primera pregunta,si no hay lio en responder las otras preguntas se los agradezco.saludos cordiales mis estimados Maestro de pedidos 1.2.xlsx
    • Hola @Antoni, muchas gracias por la respuesta, funciona bien, pero me di cuenta de algo que tal vez no empleé término correcto. Me estoy dando cuenta que si el valor del MONTO TOTAL reflejado en la columna J varía por modificaciones que se haga en la información. El valor que se copió en la hoja CONTROL GENERAL no se actualiza. Creo que empleé mal el término copiar como valor. Debería actualizarse si CONTROL1 se modifica. Así se mantiene actualizada la información en caso de cambios. Agradecido de antemano y disculpa no haberme expresado bien.  Gracias
    • Hola, Revisa el archivo a ver si te sirve. Saludos.  Prueba.xlsx
    • Sustituye la macro por: Sub Copiar() Dim SiNo As Range, Fila As Long With ActiveSheet Set SiNo = .Range("J" & Rows.Count).End(xlUp) If SiNo = "SI" Then Fila = Hoja1.Range("A" & Rows.Count).End(xlUp).Row + 1 Hoja1.Range("A" & Fila) = .Range("A3") Hoja1.Range("F" & Fila) = SiNo.Offset(-3) Hoja1.Select Hoja1.Range("D" & Fila).Select End If End With End Sub  
    • Hola Quizás si das detalles e indicas la web recibirás ayuda. Saludos
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy