Condividi tramite

Excel lentissimo quando ha molte foto

Anonimo
2014-05-09T10:48:38+00:00

Buondì a tutti,

ho un file excel (il problema è presente in tutte le versioni.. 2003, 2007, 2010, 2013 e in tutti i sistemi operativi)

In questo file excel ho una lista di nomi (circa 7000)

Da questa lista con un codice VBA per ogni cella ne leggo il contenuto e tramite ad esso scarico una immagine (100x75) all'interno della cella adiacente.

Il programma rolla alla velocità della luce per le prime 100 celle poi rallenta drasticamente (più va avanti e più rallenta)

Per capire, le prime 2500 le carica in circa 10 minuti le restanti in altri 60..

Aggiornamento a parte che per ora trascuro perchè comunque riesco a concludere il ciclo ho un problema quando un utente apre il file.

All'apertura del file se utilizzo win7 office 2013 il file si blocca e va in calcolo di non so cosa.. dopo 20 minuti si sblocca e va tutto alla perfezione..

Aprendo il file su server win 2008 con office 2010 stessa cosa ma il file si apre in circa 3 minuti (penso sia dovuto dalla potenza che nel server è nettamente superiore al pc locale, si parla di uno xeon con 4 cuori da 2.4ghz)

La mia domanda è dunque questa:

Perchè excel ricalcola tutte le immagini all'apertura se le ho già caricate durante l'aggiornamento?

Domanda 2:

Perchè con l'incrementare degli inserimenti excel rallenta sempre di più?

Vi riporta la routine vba che utilizzo:

Sub CaricaFoto()

Dim i As Variant

Dim foglio As String

Dim origine As String

Dim colonna As Integer

'Rif inserimento foto

On Error GoTo PictureNotAvailable

Application.DisplayAlerts = False

foglio = "Elenco_modelli_Date"

'Mi sposto sul foglio in cui voglio caricare le foto

Sheets(foglio).Select

origine = "I8:I" & ActiveSheet.Range("A6").Value + 7

colonna = 1

    ' Ciclo tutte le foto del foglio e le cancello

    For Each i In Sheets(foglio).Shapes

        If Left(i.Name, 7) = "Picture" Then i.Delete

    Next i

    ' Ciclo tutte le celle e cancello gli NA (ATTENZIONE se la routine viene applicata in una pivot commentare le successive 3 righe)

    For Each i In Sheets(foglio).Range(origine)

        ActiveSheet.Cells(i.Row, colonna).Value = ""

    Next i

    ' Carico la foto e la ridimensiono con la grandezza della cella

    For Each i In Sheets(foglio).Range(origine)

        'Se il modello ha uno spazio lo cambio con un underscore

        nomefile = Replace(Trim(i.Value), " ", "%20")

        'Seleziono la cella

        ActiveSheet.Cells(i.Row, colonna).Select

        'Decido dove mettere la foto

        var_Width = Sheets(foglio).Columns(colonna).ColumnWidth

        var_Height = Sheets(foglio).Cells(i.Row, colonna).Height

        'Carico la foto

        ActiveSheet.Pictures.Insert("http://xxxxxxx/xxxx/xxxx/xxx/jpg?style=" & nomefile).Select

        'Ridimensione la foto

        var_Width = Sheets(foglio).Columns(colonna).ColumnWidth

        var_Height = Sheets(foglio).Cells(i.Row, colonna).Height

        Selection.Width = var_Width

        Selection.Height = var_Height

        'Aggiungo Hyperlink alla foto

        Sheets(foglio).Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="http://xxxxxxx/xxxx/xxxx/xxx/jpg?style=" & nomefile

    Next i

'Formatto le foto affinchè funzionino con i filtri di tabella

For Each s In ActiveSheet.Shapes

    If Left(s.Name, 7) = "Picture" Then s.Placement = xlMoveAndSize

Next s

 'Posiziono il cursore in testa al foglio

ActiveSheet.Range("a1").Select

Exit Sub

PictureNotAvailable:

    ActiveSheet.Cells(i.Row, colonna).Value = "N.A."

    Resume Next

End Sub

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2014-05-09T15:18:28+00:00

    Ho trovato una soluzione! :)

    Con questo metodo carico 7000 foto in un unico tab in circa 12 minuti (50 minuti meno del metodo tradizionale).

    Il file dovrà essere composto da almeno 2 tab.

    Tab1 => tab vuoto o avente qualcosa che sia leggero da questa posizione faremo partire il codice VBA (io uso un tab chiamato "Aggiornamento" in cui indico la data di ultimo aggiornamento del report)

    Tab2 => tab che contiene i 7000 record a cui dovranno essere associate le foto

    Ora aggiungiamo in testa al nostro script questo codice:

    Application.screenupdating = False

    Questo codice disattiva il refresh video, così facendo la memoria video rimane libera e il codice scorre molto più velocemente!

    Il caricamento lato utente invece è sempre sui 2-3 minuti (da server) per le mie esigenze è accettabile.

    Grazie ancora a tutti per il supporto!

    La risposta è stata utile?

    0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-05-09T14:27:39+00:00

    Grazie ad entrambi per i fdbk e i consigli, grazie a voi ho capito che:

    (affermazioni che riporto dopo i test)

    Lato consultazione del report:

    Come suggerito se spacco l'ammontare dei record su più tab il caricamento in apertura (lato utente finale) diminuisce di molto perchè il calcolo delle foto si attiva solo sul tab attivo, quindi avendo meno foto da calcolare il tab diventa molto più veloce.


    Lato caricamento delle img:

    L'aggiunta dell'hyperlink alle foto non compromette ne il tempo di caricamento ne il tempo di lettura del tab dagli utenti utilizzatori (direi bene)

    Il caricamento delle foto in un unico Tab come descritto sopra è troppo elevato, 66 minuti per 7000 foto, spaccando i record in più tab il caricamento delle foto diventa molto più veloce.. 14 tab con 500 foto l'uno ottengo un tempo di aggiornamento globale di 8 minuti (pazzesco quanto cambia)..


    Mi vien quindi da dire che è il singolo tab a non riuscire a gestire più di n foto, perchè il file in sé non ha problemi a gestirle purchè siano spaccate in più tab..

    Cerco di approffondire, perchè il rallentamento del caricamento non me lo spiego da 66 minuti a 8.. (la memoria utilizzata nel file è identica, in più quando termina passo da un tab all'altro senza alcuna attesa, è già tutto in memoria..)

    Da quello che intuisco ci deve essere una sorta di memoria legata ad ogni singolo tab (che magari con il vba è incrementabile, anche se dubito fortemente...)  :-)

    Voi sapete niente a riguardo?

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-05-09T12:39:18+00:00

    è la mia stessa conclusione ma farlo capire alle capocce è dura..

    Qualcuno ha qualche idea per aggirare l'ostacolo mantenendo le img incorporate?

    Concordo al 100% con Andrea.

    Le immagini non vanno MAI incorporate.

    Un consiglio è questo: pagina. O, per meglio dire, simula la paginazione che hai in un report di un database.

    *Convinci* ad utilizzare i fogli di Excel come fossero *pagine* di un report e carica un numero limitato di immagini quando attivi un determinato foglio (esempio, 50 immagini).

    Evento Activate del foglio.

    Volendo puoi eliminare le immagini del foglio che lasci con l'evento Deactivate.

    Puoi anche gestire il tutto da un unica posizione, il modulo di ThisWorkbook(o Questa_cartella_di_lavoro) con gli evento SheetActivate e SheetDeactivate.

    Io utilizzo questa soluzione quando importo in Excel cataloghi prodotti e relative immagini da db.

    (Nota. Le immagini non risiedono in questo caso nel db, dove si trova solo il link alle immagini. Le immagini *costano* tempo/spazio sempre).

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-05-09T12:16:48+00:00

    è la mia stessa conclusione ma farlo capire alle capocce è dura..

    Qualcuno ha qualche idea per aggirare l'ostacolo mantenendo le img incorporate?

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-05-09T11:48:19+00:00

    Buondì a tutti,

    ho un file excel (il problema è presente in tutte le versioni.. 2003, 2007, 2010, 2013 e in tutti i sistemi operativi)

    In questo file excel ho una lista di nomi (circa 7000)

    Da questa lista con un codice VBA per ogni cella ne leggo il contenuto e tramite ad esso scarico una immagine (100x75) all'interno della cella adiacente.

    ...

    A mio modestissimo parere excel non è un gestore di immagini, caricare 7000+ immagini con altrettanti collegamenti ipertestuali equivale ad 'ucciderlo'.

    Memorizza le immagini esternamente e caricale a necessità.

    La risposta è stata utile?

    0 commenti Nessun commento