Aggiornare automaticamente i collegamenti

  • FILE ALLEGATI:
  • Aggiornare automaticamente i collegamenti (Excel 2010) di frapelle (Utente) data: 02/01/2018 10:00:55 



    Buongiorno,

    sto cercando di creare un programma che permetta di aggiornare automaticamente una serie di file xls, anche collegati tra loro, che devono essere aperti secondo un preciso ordine e sono salvati in cartelle diverse; per ogni file ho verificato che i collegamenti non siano in errore tramite "Modifica collegamenti - Verifica stato".

    Per ora ho predisposto in un file xlsm, dove sto preparando le macro, un foglio "processo" con l'elenco dei file xls da aprire secondo l'ordine necessario.
    Con il codice che riporto di seguito io apro una serie di file (scritti da riga 41 a riga 47 del foglio "processo") e per ogni file aperto (tranne quello dove ho la macro, quindi nwb = 2) faccio l'aggiornamento dei collegamenti, verifico se la cella chiamata "test" nel foglio "check" è pari a zero, quindi se sì salvo e chiudo, altrimenti compare un messaggio "controllare file".

    Il problema è che mi compare il messaggio "Errore di run-time '1004': Metodo 'UpdateLink' dell'oggetto '_Workbook' non riuscito.

    Ho provato quindi, utilizzando il codice che trovate inoperizzato, a effettuare queste operazioni su un solo file aperto, poi su due aperti contemporaneamente, etc.... Il risultato è che fino a tre file aperti la macro lavora, poi quando ne aggiungo un quarto, mi compare il messaggio di errore run-time 1004 di cui sopra (se questo quarto file lo lavoro da solo non mi genera errore, quindi credo che il problema non sia nel file).

    Come posso raggiungere il mio obiettivo?

    Vi ringrazio in anticipo per il vostro aiuto!
     
    Public Sub aggiorn7()
    
    Dim file41, file42, file43, file44, file45, file46, file47, file48, file49, file50 As String
    Dim nwb As Integer
    Dim wbnome As String
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    'file "nome1.xls"
    file41 = ThisWorkbook.Worksheets("processo").Cells(41, 2).Value
    Workbooks.Open file41, UpdateLinks:=False
    
    'file "nome2.xls"
    file42 = ThisWorkbook.Worksheets("processo").Cells(42, 2).Value
    Workbooks.Open file42, UpdateLinks:=False
    
    'file "nome3.xls"
    file43 = ThisWorkbook.Worksheets("processo").Cells(43, 2).Value
    Workbooks.Open file43, UpdateLinks:=False
    
    'file "nome4.xls"
    file44 = ThisWorkbook.Worksheets("processo").Cells(44, 2).Value
    Workbooks.Open file44, UpdateLinks:=False
    
    'file "nome5.xls"
    file45 = ThisWorkbook.Worksheets("processo").Cells(45, 2).Value
    Workbooks.Open file45, UpdateLinks:=False
    
    'file "nome6.xls"
    file46 = ThisWorkbook.Worksheets("processo").Cells(46, 2).Value
    Workbooks.Open file46, UpdateLinks:=False
    
    'file "nome7.xls"
    file47 = ThisWorkbook.Worksheets("processo").Cells(47, 2).Value
    Workbooks.Open file47, UpdateLinks:=False
    
    For nwb = 2 To Workbooks.Count
    wbnome = Workbooks.Item(nwb).Name
    Workbooks(wbnome).UpdateLink Name:=Workbooks(wbnome).LinkSources
    
    If Workbooks(wbnome).Worksheets("check").Range("test") = 0 Then
        Workbooks(wbnome).Close savechanges:=True
    Else
        MsgBox "Controllare " & wbnome & " ", vbOKOnly
        Exit Sub
    End If
    
    Next nwb
    
    'istruzione ripetuta aggiungendo "nome2.xls", "nome3.xls"...
    'Workbooks("nome1.xls").Activate
    'ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
    
    'Workbooks("nome1.xls").Activate
    'If ActiveWorkbook.Worksheets("check").Range("test") = 0 Then
    '    ActiveWorkbook.Close savechanges:=True
    'Else
    '    MsgBox "Controllare " & ActiveWorkbook.Name & " ", vbOKOnly
    '    Exit Sub
    'End If
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    
    messaggio = MsgBox("Aggiornamento terminato")
    
    End Sub
  • di Zer0Kelvin (Utente esperto) data: 03/01/2018 13:10:22 



    Ciao.
    C'è un motivo per cui apri tutti i file prima dell'aggiornamento?
    Perchè, altrimenti, il tutto si potrebbe riassumere così: 
     
    Public Sub aggiorn7()
    Dim C As Long
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        For C = 41 To 47
            Workbooks.Open ThisWorkbook.Worksheets("processo").Cells(C, 2), UpdateLinks:=False
            With ActiveWorkbook
                .UpdateLink Name:=.LinkSources
                If .Worksheets("check").Range("test") = 0 Then
                    .Close savechanges:=True
                Else
                    MsgBox "Controllare " & .Name & " ", vbOKOnly
                    Application.ScreenUpdating = True
                    Application.DisplayAlerts = True
                    Exit Sub
                End If
            End With
        Next C
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        MsgBox ("Aggiornamento terminato")
    End Sub
    
  • di frapelle (Utente) data: 03/01/2018 22:14:09 



    Ciao, grazie per la tua risposta e per il codice.

    L'apertura dei file è dovuta al fatto che i file da 41 a 47 sono collegati anche tra di loro, quindi l'apertura contestuale permette l'aggiornamento automatico dei file di origine aperti.

    Ad oggi, manualmente, tutti e 7 i file vengono aperti, per ogni file si aggiornano i collegamenti diversi da "origine aperta" e, solo dopo l'aggiornamento di tutti e 7 i file, si controlla la cella "test" del foglio "check" di ognuno e se zero si salva e chiude altrimenti compare il messaggio.
    Probabilmente già nel mio codice iniziale c'è un errore, in quanto con l'istruzione "For" il processo "apro-aggiorno-test-salvo/msg box" viene effettuato sul singolo file, mentre in realtà quello che devo fare è "apro tutti e 7 file-aggiorno tutti e 7 file-test su ogni file e a seconda del risultato salvo/msg box".

    Partendo dal tuo codice ho provato a modificarlo creando un doppio for, il primo per aprire e aggiornare, il secondo per controllare il test, lo proverò per vedere se in questo modo riesco a superare l'errore "run time 1004".
     
    Public Sub aggiorn7()
    Dim C As Long
    Dim nwb As Integer
    Dim wbnome As String
    
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
    'prima apro tutti e sette i file e li aggiorno
        For C = 41 To 47
            Workbooks.Open ThisWorkbook.Worksheets("processo").Cells(C, 2), UpdateLinks:=False
            With ActiveWorkbook
                .UpdateLink Name:=.LinkSources
            End With
        Next C
    
    'dopo l'aggiornamento controllo la cella test
        For nwb = 2 To Workbooks.Count
        wbnome = Workbooks.Item(nwb).Name
    
        If Workbooks(wbnome).Worksheets("check").Range("test") = 0 Then
        Workbooks(wbnome).Close savechanges:=True
    Else
        MsgBox "Controllare " & wbnome & " ", vbOKOnly
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        Exit Sub
    End If
    
    Next nwb
    
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        MsgBox ("Aggiornamento terminato")
    End Sub
  • di frapelle (Utente) data: 08/01/2018 23:36:10 



    Ciao,

    con la seguente parte di codice (che ho estratto dal precedente messaggio) incontro un problema, dato che con For conto i file xls aperti, ma se verificata la prima condizione dell'If i file vengono progressivamente chiusi, quindi si riduce il numero di file aperti e ad un certo punto incontro l'errore "indice non incluso nell'intervallo".

    Potete suggerirmi un modo più efficace per "testare" tutti i file aperti (ad eccezione di "ThisWorkbook")?

    Grazie per il vostro supporto!
     
    For nwb = 2 To Workbooks.Count
        wbnome = Workbooks.Item(nwb).Name
    
        If Workbooks(wbnome).Worksheets("check").Range("test") = 0 Then
        Workbooks(wbnome).Close savechanges:=True
    Else
        MsgBox "Controllare " & wbnome & " ", vbOKOnly
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        Exit Sub
    End If
    
    Next nwb
  • di Zer0Kelvin (Utente esperto) data: 11/01/2018 14:35:31 



    Ciao.
    Un semplice esempio che esegue un ciclo su tutte le cartelle aperte ed usa Workbook.Name per effettuare il controllo
     
    Sub TuttiTranneQuesto()
    Dim Wk As Workbook
    For Each Wk In Workbooks
        If Wk.Name <> ThisWorkbook.Name Then
            MsgBox "Questo non è ThisWorkbook: " & Wk.Name
        Else
            MsgBox "Questo,invece, è ThisWorkbook: " & Wk.Name
        End If
    Next Wk
    End Sub
    
  • torna su

Sostieni Excel VBA con una donazione! Con la tua donazione potrai contribuire al mantenimento del servizio.
Le donazioni sono eseguite con PayPal, il modo più facile, comodo e sicuro per pagare online.
Paypal accetta anche carta di credito o carte prepagate.