XML - Download File - VBA Excel
Tengo un archivo que es usado por distintas personas, necesito realizar una modificación a gran escala en una de las hojas. Para esto usé un archivo estándar que se encontrará online en el servidor y los archivos de las personas puedan diferenciar si tienen una versión antigua comparando el archivo estandar. Para lograr esto, en el archivo usado por el personal cree un macro que valida la versión tanto del archivo personal como del online. También se valida que tengan Internet para realizar el update. y por ultimo se valida que si no realiza la actualización, no puede usar el archivo personal.
Inicio automático validación archivo personal:
Sub Auto_Open() 'Ejecuta el macro cuando abrimos el archivo excel personal. GetCurrentVersionNumber End Sub
Obtención de versión:
Function GetCurrentVersionNumber() As String Dim doc As MSXML2.DOMDocument Dim version As String If (checkInternetConnection = True) Then 'valida conexion a internet Set doc = New MSXML2.DOMDocument 'usamos la referencia correspondiente. doc.async = False doc.Load ("http://IP o RUTA/prueba/currentversion.xml") 'ruta del archivo que está online en el server. GetCurrentVersionNumber = doc.SelectSingleNode("/AppData/Version").Text 'obtiene la version que aparece en el archivo currentversion.xml. GetCurrentVersionRut = doc.SelectSingleNode("/AppData/Ruta").Text 'lo mismo de arriba pero buscando la ruta. version = Sheets.Item("Horas x Modelo").Cells(1, 2).Value 'obtengo la version del archivo personal. If (Sheets.Item("Horas x Modelo").Cells(1, 2).Value <> GetCurrentVersionNumber) Then 'valido que tengan la misma version. MessageBoxOption GetCurrentVersionNumber 'si la version es distinta, me saldrá un mensaje para descargar la nueva version, en caso de no bajar la version, el archivo se cierra. End If Else MsgBox ("No tienes conexion a internet y lo requieres!!!") 'si no se encuentra conectado a internet. End If End Function
Mensaje validador:
Sub MessageBoxOption(version) Dim iRet As Integer Dim strPrompt As String Dim strTitle As String ' Mensaje strPrompt = "Tienes una nueva versión de MP para descargar. Este proceso se hará de forma automatica." ' Titulo strTitle = "Versión " & version 'genero el titulo con la version nueva. 'Botones cuadro mensaje iRet = MsgBox(strPrompt, vbYesNo, strTitle) ' Validador yes no If iRet = vbNo Then Application.DisplayAlerts = False Application.Quit 'si elige no, saldra del Excel. Else DownloadFile version ' si selecciona si, descargará el archivo. End If End Sub
Descargar archivo:
Sub DownloadFile(version) Dim myURL As String 'creo variables Dim rutaExcel As String Dim rutaServidor As String rutaExcel = Application.ActiveWorkbook.Path 'saco la ruta estatica del archivo personal myURL = "http://IP o Ruta/prueba/respaldos/" & version & ".xlsx" 'URl del servidor donde esta el archivo online Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", myURL, False, "username", "password" WinHttpReq.send myURL = WinHttpReq.responseBody If WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile rutaExcel & "\" & version & ".xlsx", 2 ' 1 = no overwrite, 2 = overwrite" descargo el archivo oStream.Close End If copiarAotroLibro rutaExcel & "\" & version & ".xlsx", version & ".xlsx" 'llamo la funcion para realizar la copia de los datos. MsgBox (rutaExcel & "\" & version & ".xlsx") 'revisa rutaExcel & "\" & version & ".xlsx" End Sub
Validar Internet:
Function checkInternetConnection() As Boolean On Error Resume Next checkInternetConnection = False Dim objSvrHTTP As ServerXMLHTTP Dim varProjectID, varCatID, strT As String Set objSvrHTTP = New ServerXMLHTTP objSvrHTTP.Open "GET", "http://www.google.com" objSvrHTTP.setRequestHeader "Accept", "application/xml" objSvrHTTP.setRequestHeader "Content-Type", "application/xml" objSvrHTTP.send strT If err = 0 Then checkInternetConnection = True Else 'MsgBox "Sin internet: " & Err.Description & "", 64, "Additt !" checkInternetConnection = False End If End Function
Copia hoja archivo descargado:
Sub copiarAotroLibro(archivo, version) Dim nombreLibro As String nombreLibro = ActiveWorkbook.Name Worksheets.Item("Horas x Modelo").Visible = True Application.ScreenUpdating = False Workbooks.Open (archivo) 'Windows("origen.xls").Activate Sheets("Estandar").Select Sheets("Estandar").Copy After:=Workbooks(nombreLibro).Sheets("Horas x Modelo") Application.ScreenUpdating = True For Each she In Worksheets a = she.Name If a = "Horas x Modelo" Then Application.DisplayAlerts = False she.Delete End If Next For Each she In Worksheets a = she.Name If a = "Estandar" Then she.Name = "Horas x Modelo" Next Workbooks(version).Close True Application.ScreenUpdating = True Application.DisplayAlerts = True Worksheets.Item("Horas x Modelo").Protect Password:="icvsa", DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True Worksheets.Item("Horas x Modelo").Visible = False End Sub
Código completo:
Archivo XML en server:
Referencia faltantes:
Sub Auto_Open() 'Ejecuta el macro cuando abrimos el archivo excel personal. GetCurrentVersionNumber End Sub Function GetCurrentVersionNumber() As String Dim doc As MSXML2.DOMDocument Dim version As String If (checkInternetConnection = True) Then 'valida conexion a internet Set doc = New MSXML2.DOMDocument 'usamos la referencia correspondiente. doc.async = False doc.Load ("http://IP o RUTA/prueba/currentversion.xml") 'ruta del archivo que está online en el server. GetCurrentVersionNumber = doc.SelectSingleNode("/AppData/Version").Text 'obtiene la version que aparece en el archivo currentversion.xml. GetCurrentVersionRut = doc.SelectSingleNode("/AppData/Ruta").Text 'lo mismo de arriba pero buscando la ruta. version = Sheets.Item("Horas x Modelo").Cells(1, 2).Value 'obtengo la version del archivo personal. If (Sheets.Item("Horas x Modelo").Cells(1, 2).Value <> GetCurrentVersionNumber) Then 'valido que tengan la misma version. MessageBoxOption GetCurrentVersionNumber 'si la version es distinta, me saldrá un mensaje para descargar la nueva version, en caso de no bajar la version, el archivo se cierra. End If Else MsgBox ("No tienes conexion a internet y lo requieres!!!") 'si no se encuentra conectado a internet. End If End Function Sub MessageBoxOption(version) Dim iRet As Integer Dim strPrompt As String Dim strTitle As String ' Mensaje strPrompt = "Tienes una nueva versión de MP para descargar. Este proceso se hará de forma automatica." ' Titulo strTitle = "Versión " & version 'genero el titulo con la version nueva. 'Botones cuadro mensaje iRet = MsgBox(strPrompt, vbYesNo, strTitle) ' Validador yes no If iRet = vbNo Then Application.DisplayAlerts = False Application.Quit 'si elige no, saldra del Excel. Else DownloadFile version ' si selecciona si, descargará el archivo. End If End Sub Sub DownloadFile(version) Dim myURL As String 'creo variables Dim rutaExcel As String Dim rutaServidor As String rutaExcel = Application.ActiveWorkbook.Path 'saco la ruta estatica del archivo personal myURL = "http://IP o Ruta/prueba/respaldos/" & version & ".xlsx" 'URl del servidor donde esta el archivo online Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", myURL, False, "username", "password" WinHttpReq.send myURL = WinHttpReq.responseBody If WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile rutaExcel & "\" & version & ".xlsx", 2 ' 1 = no overwrite, 2 = overwrite" descargo el archivo oStream.Close End If copiarAotroLibro rutaExcel & "\" & version & ".xlsx", version & ".xlsx" 'llamo la funcion para realizar la copia de los datos. MsgBox (rutaExcel & "\" & version & ".xlsx") 'revisa rutaExcel & "\" & version & ".xlsx" End Sub Sub copiarAotroLibro(archivo, version) Dim nombreLibro As String nombreLibro = ActiveWorkbook.Name Worksheets.Item("Horas x Modelo").Visible = True Application.ScreenUpdating = False Workbooks.Open (archivo) 'Windows("origen.xls").Activate Sheets("Estandar").Select Sheets("Estandar").Copy After:=Workbooks(nombreLibro).Sheets("Horas x Modelo") Application.ScreenUpdating = True For Each she In Worksheets a = she.Name If a = "Horas x Modelo" Then Application.DisplayAlerts = False she.Delete End If Next For Each she In Worksheets a = she.Name If a = "Estandar" Then she.Name = "Horas x Modelo" Next Workbooks(version).Close True Application.ScreenUpdating = True Application.DisplayAlerts = True Worksheets.Item("Horas x Modelo").Protect Password:="icvsa", DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True Worksheets.Item("Horas x Modelo").Visible = False End Sub Function checkInternetConnection() As Boolean On Error Resume Next checkInternetConnection = False Dim objSvrHTTP As ServerXMLHTTP Dim varProjectID, varCatID, strT As String Set objSvrHTTP = New ServerXMLHTTP objSvrHTTP.Open "GET", "http://www.google.com" objSvrHTTP.setRequestHeader "Accept", "application/xml" objSvrHTTP.setRequestHeader "Content-Type", "application/xml" objSvrHTTP.send strT If err = 0 Then checkInternetConnection = True Else 'MsgBox "Sin internet: " & Err.Description & "", 64, "Additt !" checkInternetConnection = False End If End Function Public Sub revisa(ruta) Dim test As String test = Dir(ruta) If test <> "" Then Kill (ruta) End If End Sub Public Sub limpiaLista() Sheets.Item("Listado").Range("B3:Y1000").ClearContents End Sub Public Sub limpiaControl() Sheets.Item("Control PMs").Range("A2:G100").ClearContents Sheets.Item("Control PMs").Range("I2:L100").ClearContents Sheets.Item("Control PMs").Range("A2:L100").Interior.ColorIndex = xlNone End Sub
Archivo XML en server:
1.2 http://localhost/prueba/respaldos/1.2.xlsx
Referencia faltantes:
Comentarios
Publicar un comentario