Aggiornare automaticamente i collegamenti



  • Aggiornare automaticamente i collegamenti di frapelle 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 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 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 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 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
    


  • problema puntato link esterno di alexmanfre data: 22/01/2018 10:16:30

    Buongiorno,
    mi presento sono un nuovo utente, piacere Manfredini Alessandro.
    Visto che l'argomento di cui si parlava nel post è lo stesso, mi lego a questo, forse mi potete aiutare.
    Ho un file xls con riferimenti a altri 3 file xls (collegamenti esterni), ho inserito un pulsante che può editare automaticamente i collegamenti esterni, due dei quali però poterbbero anche essere disattivati (con delle combobox yes-no), il mio problema è che dopo un pò di cambiamenti dei file per collegamenti esterni questi subiscono una variazione dell'array acquisito per controllare tali aggiornare tali collegamenti, c'è un modo univoco di indicare e non far variare il loro ordinamento?

    Grazie mille!
    Alessandro
     
    Sub upload_conf()
        Dim aLinks As Variant
        aLinks = ActiveWorkbook.LinkSources(xlExcelLinks)
        Dim uno, due, tre As String
        uno = aLinks(3)
        uno_file = Split(uno, "")(UBound(Split(uno, "")))
        due = aLinks(2)
        due_file = Split(due, "")(UBound(Split(due, "")))
        tre = aLinks(1)
        tre_file = Split(tre, "")(UBound(Split(tre, "")))
        
    '    MsgBox uno 'instr
    '    MsgBox due 'loc
    '    MsgBox tre 'n2
        
    Dim sPercorso_uno As String, sPercorso_due As String, sPercorso_tre As String
    
    n2_presencev = ThisWorkbook.Worksheets("CONFIGURATOR").Range("n2_presence")
    If (n2_presencev = 1) Then
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("locpath") = Application.GetOpenFilename(, , "Update " & uno_file) 
        sPercorso_uno = ThisWorkbook.Worksheets("CONFIGURATOR").Range("locpath")
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("locfile") = Split(sPercorso_uno, "")(UBound(Split(sPercorso_uno, "")))
        ActiveWorkbook.ChangeLink uno, sPercorso_uno, xlExcelLinks
    Else
    End If
    
    
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("instrpath") = Application.GetOpenFilename(, , "Update " & due_file) 
        sPercorso_due = ThisWorkbook.Worksheets("CONFIGURATOR").Range("instrpath")
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("instrfile") = Split(sPercorso_due, "")(UBound(Split(sPercorso_due, "")))
        ActiveWorkbook.ChangeLink due, sPercorso_due, xlExcelLinks
    
    loc_indv = ThisWorkbook.Worksheets("CONFIGURATOR").Range("loc_ind")
    If (loc_indv = 1) Then
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("n2path") = Application.GetOpenFilename(, , "Update " & tre_file)
        sPercorso_tre = ThisWorkbook.Worksheets("CONFIGURATOR").Range("n2path")
        ThisWorkbook.Worksheets("CONFIGURATOR").Range("n2file") = Split(sPercorso_tre, "")(UBound(Split(sPercorso_tre, "")))
        ActiveWorkbook.ChangeLink tre, sPercorso_tre, xlExcelLinks
    Else
    End If
    
    Application.Calculate
    End Sub