Tengo una macro en una XLSM libro del módulo que se actualiza todos los datos externos, a continuación, guarda y cierra el libro.

ActiveWorkbook.RefreshAll
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.Quit

Yo uso un archivo de VBScript para ejecutar la macro, como parte de una tarea programada

objExcel.Workbooks.Open(fname)
objExcel.Visible = True
On error resume next
objExcel.Run "RefreshAllData"

Pregunta: ¿Cómo puedo reutilizar el macro existente en el libro existente para actualizar todos los datos de varios otros libros? (es decir. Estoy buscando las modificaciones necesarias en el archivo de VBScript, quiero minimizar los cambios en la macro sí mismo. Los nombres de los archivos contenidos en el archivo de VBScript) TIA.

InformationsquelleAutor Sam | 2013-06-05

3 Comentarios

  1. 9

    Me gustaría recomendar en contra de la re-uso de un trivial macro como eso. En lugar de incorporar la actualización de la funcionalidad en el VBScript:

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set xl  = CreateObject("Excel.Application")
    xl.Visible = True
    
    For Each f In fso.GetFolder("C:\some\folder").Files
      If LCase(fso.GetExtensionName(f.Name)) = "xlsx" Then
        Set wb = xl.Workbooks.Open(f.Path)
        wb.RefreshAll
        wb.Save
        wb.Close
      End If
    Next
    
    xl.Quit
    • Voy a seguir tu consejo. Gran concisa respuesta. Gracias Ansgar.
    • Esto es oro! Sólo tengo una sola pregunta en lo que respecta a este. Cuando lo ejecuto, me sale una ventana diciendo: «Esto va a cancelar una pendiente de actualización de datos. Continuar? [ACEPTAR] [Cancelar]» asumo porque la actualización de datos no ha tenido suficiente tiempo para correr, hay una manera de hacer que espere a que la actualización termine, antes de guardar y cerrar? @Ansgar Wiechers
    • Parece que tienes un consulta asincrónica en algún lugar. Ya sea cambiar una sincrónico uno, o añadir un retardo antes de guardar/cerrar el libro (WScript.Sleep).
    • ¿Cómo puedo agregar un WScript.Dormir mientras se está en el «Para Cada f» código? Sólo estoy usando el código que se ha escrito, no he añadido una consulta asincrónica en cualquier lugar?
    • Coloqué WScript.El sueño 30000 entre el bm.RefreshAll y el bm.Guardar, y se hizo el truco. gracias por la ayuda
    • Estoy usando este código con el fin de ejecutar un Programador de Tareas en un servidor. Yo no tengo ningún problema con él, cuando «Ejecutar sólo cuando el usuario se registra en» pero no se ejecuta cuando yo uso «Ejecutar si el usuario está conectado o no». Bien se dice que se ejecuta, pero no pasa nada. Cualquier idea sobre cómo resolver esto?
    • Esa es una cuestión diferente, así que por favor, publicarlo como una nueva pregunta.
    • He creado un nuevo post con respecto a mi pregunta, espero que usted tendrá un oppertunity a mirarlo link @AnsgarWiechers

  2. 2

    Supongo que se puede hacer algo como esto.

    1. Encontrar todos los archivo de excel en la carpeta
    2. Seleccione Cada archivo de Excel y activar
    3. llamada refreshdata función

    fragmento de código para apoyar esta

    Sub RefreshAllExcelInFolder()
        Dim fso
        Dim ObjFolder
        Dim ObjFiles
        Dim ObjFile
        Dim objExcel
    
        'Creating File System Object
        Set fso = CreateObject("Scripting.FileSystemObject")
        'Getting the Folder Object
        Set ObjFolder = fso.GetFolder("<<C:folder path>>")
    
        'Getting the list of Files
        Set ObjFiles = ObjFolder.Files
            'On Error Resume Next
            For Each ObjFile In ObjFiles
                If LCase(Right(ObjFile.Name, 5)) = ".xlsx" Or LCase(Right(ObjFile.Name, 4)) = ".xls" Then
                    Workbooks.Open(ObjFile).Activate
                    RefreshAllData
                End If
            Next
    End Sub
    
    Sub RefreshAllData()
        ActiveWorkbook.RefreshAll
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        MsgBox ("Going back In")
    End Sub

    Espero que esto ayude a

    • Bien hecho. Quiero una respuesta que me enseña más que la respuesta en sí, sin tener que ir por la borda con un documento técnico. Gracias Dharmesh.
    • me alegra ser de ayuda y a ver que el propósito de respuesta se sirve ,para enseñar..Para concisa código, yo recomendaría Ansgar del post
    • Creo que se olvidó de crear el objeto de Excel, aunque!
    • no me necesitaba ? porque yo estoy manejando a través de activos objeto de excel sólo ! ¿por qué crear nuevas excelobject cuando no es necesario
  3. 1

    Si no cambia la macro en todo lo que tiene para mantener la recarga de excel, a continuación, abra el libro de macros seguido por el libro de destino y, a continuación, ejecutar la macro. Si usted puede quitar:

    Application.quit

    a continuación, al menos puede mantener abierto excel y sólo mantener la apertura de destino de los libros antes de ejecutar la macro cada vez. A mí me parece que sería más sencillo poner el código de macro en el archivo vbs aunque

Dejar respuesta

Please enter your comment!
Please enter your name here