apertura lenta macro



  • apertura lenta macro
    di gio (utente non iscritto) data: 03/10/2012 10:32:17

    una domanda.. cosa puo essere che mi rallenta in modo indecente l'apertura di un file excel contentente solo una macro? [e non una macro chissa quanto grande]...ovviamente nelle stesse condizioni...ovvero senza nessuun altro programma aperto..
    ogni tanto si apre in mezzo secondo ma spesso si blocca addirittura excel e non si apre proprio per 10 volte di fila magari..apparentemenre senza motivo..come mi aveva consigliato harry ogni volta che avvio la macro in automatico elimina tutte le connessioni presenti..

    ps:il pc è molto veloce..non è colpa del sua..

    questa cosa mi sta innervosendo tantissimo..e sopratutto non vorrei che quando servono davvero sti file per lavoro non mi si aprono e mi fanno perdere tantisimo tempo

    grazie



  • di Vecchio Frac data: 03/10/2012 11:11:58

    Se ci sono collegamenti esterni da aggiornare o se ci sono moltissime formule da ricalcolare è abbastanza normale.





  • di gio (utente non iscritto) data: 03/10/2012 11:13:52

    non è niente di fantascientifico...ti allego qui sotto il codice..
    sono poi 2 cicli for e poco piu...

    o me lo apre in mezzo secondo o si blocca...dev'esserci quaclsoa di sbagliato che ogni tanto genera errori strani o va in loop infinito..non so
     
    Sub auto_open()
    
    For Each cn In ThisWorkbook.Connections        'elimina connessioni
     cn.Delete
    Next
     
    Sheets("Foglio1").Visible = True
    Sheets("Foglio3").Visible = True
    Application.ScreenUpdating = False         'refresh schermo
                                                                               
    Sheets(Array("Foglio1", "eCAV")).Select         'cancella fogli
    Range("A1").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.ClearContents
    
    Sheets("foglio3").Select                    'azzera [importa] tabella modello
        Cells.Select
        Selection.Copy
        Sheets("eCAV").Select
        Cells.Select
        ActiveSheet.Paste
    
    Dim fd As FileDialog                                    'seleziona cartella
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    Dim CartellaSelezionata As Variant
    With fd
    If .Show = -1 Then
    For Each CartellaSelezionata In .SelectedItems
    miaCartella = CartellaSelezionata
    Next
    Else: Exit Sub
    End If
    End With
     
    Sheets("foglio1").Select
    
    Dim MyFile As String
    MyFile = Dir(miaCartella & "*.dmo")
    
    Do While MyFile <> ""
       With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & miaCartella & "" & MyFile, Destination:=Range("A1"))
            .Name = "SOM59054_NP2216552_BFA_REP1_1"
             .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 1252
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = True
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = True
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
         MyFile = Dir
    Loop
    
    For i = 2 To 30         'imposta distanza tra report
     If Left(Cells(1, 1).Value, 10) = Left(Cells(1, i).Value, 10) Then
     dist = i - 1
     Exit For
    End If
    Next i
    
    k = 0                           'valori misurati
    For j = 0 To Cells(Columns.Count).End(xlToLeft).Column Step dist
    Sheets("foglio1").Select
    y = 1
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        With Sheets("eCAV")
         If IsNumeric(Cells(i, 2 + j)) And Cells(i, 2 + j) <> "" And Application.IsText(Cells(i - 1, 2 + j).Value) Then
         .Cells(25 + k, 5 + y) = Cells(i, 2 + j)
         y = y + 1
         End If
         End With
    Next i
    k = k + 1
    Next j
    
    Sheets("foglio1").Select
    y = 1
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        With Sheets("eCAV")
         If IsNumeric(Cells(i, 2)) And Cells(i, 2) <> "" And Application.IsText(Cells(i - 1, 2).Value) Then
          .Cells(6, 5 + y) = Cells(i - 1, 2)            'nomi quote
          .Cells(7, 5 + y) = Cells(i, 3)                  'nominali
          .Cells(8, 5 + y) = Cells(i, 3) + Cells(i, 5)    'valori max toll
          .Cells(9, 5 + y) = Cells(i, 3) + Cells(i, 6)    'valori min toll
          y = y + 1
         End If
         End With
    Next i
    
    'stringa = Cells(1, 1)
    's = Split(stringa, "")
    'Sheets("eCAV").Cells(3, 1) = s(3)
    
    Sheets("eCAV").Select
    Dim a As String                    'autofit colonne                                     'autofit colonne di tutti i fogli
    Dim b As Worksheet
    a = ActiveSheet.Name
    For Each b In ActiveWorkbook.Worksheets
    On Error Resume Next
    b.Activate
    Cells.EntireColumn.AutoFit
    Next b
      
    Sheets("foglio1").Select
    Cells.Select
    Range("A76").Activate
    Selection.ColumnWidth = 10
    
    Sheets("Foglio1").Visible = True
    Sheets("Foglio3").Visible = False
    Application.ScreenUpdating = False         'refresh schermo
    
    End Sub



  • di HarryBosch data: 04/10/2012 00:09:45

    Ciao Gio
    non credo che il problema sia legato alla connessione o al codice; a me gira benissimo, il file si apre immediatamente mostrandomi la finestra di dialogo e seleziono qualsiasi cartella.

    Forse, e dico forse, il problema è legato a quei file .DMO che cerchi di caricare; leggendo qualche post, sembra che a volte causino qualche problema. Non posso pubblicarti qua i link, ma ti riporto un estrapolato:

    "Se si evidenziano errori mentre si prova ad aprire un file DMO possono verificarsi le seguenti situazioni:
    Missing Host Application (Mancanza dell’applicazione adatta): Il Windows non ha l'applicazione adatta per aprire, legere e riprodurre le informazioni criptate usando la specifica di un file con estensione DMO.
    Corrupt File Type Association (Associazione di File corotta): L'aplicazione implicita per aprire i files di tipo DMO esiste pero l'associazione con i file DMO e stata corotta nei registri"

    "Stai cercando di aprire un .DMO allegato o un file del tuo hard disk, ma il computer non te lo permette. Ti esce un'irritante finestra popup dove si legge: "Impossibile aprire il file".
    Il motivo per cui non puoi aprire il .DMO file è perchè non hai il .DMO software giusto"

    Fai qualche ricerca e fai sapere,
    ciao



  • di gio (utente non iscritto) data: 04/10/2012 07:58:18

    ma a dire il vero i file DMO che leggo io sono dei banalissimi file di testo che mi genera un programma..leggeri e chiarissimi..
    ma comqunue sto problema me lo fa allo stesso modo anche aprendo dei file TXT normalissimi...



  • di gio (utente non iscritto) data: 04/10/2012 08:43:15

    ma sopratutto spesso si blocca ancora prima di chiedermi i file da caricare..



  • di HarryBosch data: 04/10/2012 09:07:34

    se per te non è un problema, vuoi provare ad inviarmi questo file?
    così lo testo sui miei pc...



  • di gio (utente non iscritto) data: 04/10/2012 09:36:06

    te li passo in una mail o qualcosa di privato..non mi va di pubblicare su internet cosi a caso...

    comunque tipo oggi mi si bloccava ancora prima di aprire excel...restava fuori la schermatina di caricamento del file [e si bloccava al 100%]..oppure viene fuori la schermata per selezionare la cartella dei file ma il resto di excel è gia bloccato..

    e se provo a uscire e aprire un foglio di lavoro nuovo parte sempre e subito..quindi è come se fosse qualcosa che carica prima di aprire la macro..
    ma non lo fa sempre..



  • di HarryBosch data: 04/10/2012 09:51:01

    Infatti, per quello ti avevo scritto "inviare" e non "allegare"..
    Bene, allora fai così:;mi mandi un messaggio con la tua mail a questo indirizzo, senza allegare nulla:

    hachunerfot@dunflimblag.mailexpire.com

    poi ti contatto io con la mail personale



  • di Vecchio Frac data: 04/10/2012 09:55:58

    Ma ThisWorkbook.Connections è corretto? Su Excel 2003 no di sicuro :)
    E "miaCartella" punta a una cartella di rete? se sì, è probabile che ci siano anche problemi di rete a complicare le cose.
    C'è qualche On Error attivo?
    Inoltre prima di ogni Exit Sub (come quando dalla finestra di dialogo scegli Annulla) è bene ripristinare Application.ScreenUpdating = True perchè altrimenti lo schermo non si riaggiorna all'uscita (che poi... scrivere Else: Exit Sub è orribile ^_^)





  • di gio (utente non iscritto) data: 04/10/2012 10:04:09

    mail inviata..però adesso sono da lavoro..non so se riesco a inviarti i file..caso mai te li mando quando torno a casa stasera..



  • di gio (utente non iscritto) data: 04/10/2012 10:09:19

    @vecchio frac: dunque...

    -ThisWorkbook.Connections me l'ha detto harry e io l'ho copiato senza pensare perchè non ho idea di come usare quelle funzioni..però mi sembra che funzioni

    -ovviamente mia cartella non è in rete [altrimenti ci metterebbe 4 vite e mezzo ogni volta che apre un file]

    -gli OnError attivi dove li posso controllare? cosa sono?

    -lo screenupdating mi sono dimenticato di metterlo TRUE..ma in realtà non ho mai notato differenze..serve disattivarlo all'inizio per velocizzare..ma alla fine mettere true o false mi semrba uguale...

    -la parte di else:exit sub è un'altra di quelle che ho brutalmetne copiato da internet senza neanche leggere...fa quello che deve e non voglio sapere come..xd
    però il fatto che mi esca dal programma se schiaccio annulla mi va bene..



  • di HarryBosch data: 04/10/2012 10:38:51

    Confermo che ThisWorkbook.Connections fa a dovere il proprio lavoro di cancellare tutte le connessioni inserite, onde evitare un continuo accumolo delle stesse.

    Per il resto forse è come dice VecchioFrac, la rete crea qualche problema

    PS: non mi è arrivato il messaggio



  • di gio (utente non iscritto) data: 04/10/2012 10:50:37

    harry mi è tornato indietro un messaggio che mi dice che il tuo server ha rifiutato la mia mail..

    "user unknown in local recipient table"

    comunque te li mando stasera i file perchè da lavoro non posso..



  • di Vecchio Frac data: 04/10/2012 11:08:36

    cit. " ThisWorkbook.Connections me l'ha detto harry "
    cit. " Confermo che ThisWorkbook.Connections fa a dovere il proprio lavoro "
    --> vi credo perfettamente, ma non trovo la proprietà e non ho modo di capire se è un problema mio o se manca del tutto in XL2003.

    cit. " ovviamente mia cartella non è in rete "
    --> non era così ovvio :) perchè nel tuo codice dipende da FileDialog

    cit. " gli OnError attivi dove li posso controllare? cosa sono? "
    --> On Error Goto ... e On Error Resume sono una modalità per intercettare gli errori ("trappole per errori") e quindi gestirli senza interrompere bruscamente l'esecuzione. Ogni errore che viene sollevato (eccezione, in altri linguaggi) ha un proprio codice numerico che può essere riconosciuto e gestito appropriatamente. Se intercetti ogni errore con On Error ma non crei una gestione degli errori, l'esecuzione continuerà imperturbata, gli errori si verificheranno ma passeranno sotto silenzio e tu non te ne accorgerai. Sembrerà che tutto sia andato liscio ma in realtà non avrai ottenuto i risultati desiderati.

    cit. " lo screenupdating mi sono dimenticato di metterlo TRUE..ma in realtà non ho mai notato differenze "
    --> le differenze si notano in programmi che fanno elaborazioni lunghe e che modificano grandi range di celle, se lavori in memoria non noti grandi differenze, ma noti solo il tempo di attesa.


    cit. " la parte di else:exit sub è un'altra di quelle che ho brutalmetne copiato da internet senza neanche leggere...fa quello che deve e non voglio sapere come..xd però il fatto che mi esca dal programma se schiaccio annulla mi va bene.."
    --> Oh my God :) copiare va bene, ma bisogna anche capire cosa si copia. Certo che funziona... i due punti servono a separare le istruzioni una dalle altre, in teoria ogni programma può essere scritto su una linea continua con le istruzioni separate dai due punti (ci sono alcune limitazioni). Solo che è più ordinato per chi legge codice altrui che le istruzioni restino su righe separate :)

    cit. " mi è tornato indietro un messaggio che mi dice che il tuo server ha rifiutato la mia mail "
    --> non è il server di HarryBosch che ha rifiutato la tua mail ma il contrario... verifica di aver scritto correttamente ed esattamente l'indirizzo fornito da Vanni o, in alternativa, che non hai fatto passare troppo tempo prima di inviare la mail (quelle mail temporanee sono comodissime ma hanno una durata temporale per l'appunto limitata)







  • di gio (utente non iscritto) data: 04/10/2012 11:23:36

    per la mail [machecazz di sistema stupido è?? ahaha]...scrivimi a sto indirizzo che ti rispondo [stasera] coi file allegati: giovannifornera@infinito.it

    -questione onerror..adesso che me lo dici ricordo di averlo studiato e usato qualche volta..ma se stai programmando è meglio che ti escano gli errori in modo che capisci dove e cosa non funziona..a programma finito poi vedrò se aggiungerli.. ma per lo stesso motivo preferisco ch si blocchi il programma piuttosto che funzionare ma in modo sbagliato o non come voglio io...

    -questione screenupdating
    immaginavo fosse un discorso del genere..io l'ho poi messa li..sapevo che non cambiava tantissimo ma va bè...

    -questione else:exit sub
    questa funzione so benissimo che esce dal programma...e come ti dicevo mi va bene che faccia cosi..

    Dim fd As FileDialog 'seleziona cartella
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    Dim CartellaSelezionata As Variant
    With fd
    If .Show = -1 Then
    For Each CartellaSelezionata In .SelectedItems
    miaCartella = CartellaSelezionata
    Next
    Else: Exit Sub
    End If
    End With

    io ho copiato sto blocco intero.. leggendolo posso capire cosa fa..ma contiene funzioni che non ho mai ne usato ne visto...per cui non mi sto afare tanti problemi per capirle...so che funziona e quel giorno che avrò bisogno di modificarle ci studierò con piu attenzione...



  • di HarryBosch data: 04/10/2012 11:38:33

    Non è un sistema stupido, ma anzi, è molto utile per evitare un sacco di spam!
    Inoltre, cosa non da poco, si evita di lasciare la propria mail a disposizione di tutti, soprattutto quando scrivi sui Forum


    "sai, ho visto la tua mail, e pensavo che forse mi potresti aiutare...."



  • di gio (utente non iscritto) data: 04/10/2012 11:41:03

    oh be per quello non c' è problema..è una mail che uso per tutte le possibili cavolate immaginabili...su qualsiasi sito che mi registro o qualsiasi cosa che compro uso quella mail..quindi puoi immaginarti quanta spam mi arriva..ci sono abituato..

    e poi se uno viene a scrivere a me per consigli sulla programmazione dev'essere messo ben male xd..ahahhaah



  • di Vecchio Frac data: 04/10/2012 11:53:24

    cit. " per la mail [mache*** di sistema stupido è?? ahaha] "
    --> Evitiamo per cortesia di ricorrere in forum a un linguaggio poco consono, grazie
    (comunque il sistema di mailexpire.com è fantastico, e proprio per i motivi già espressi, l'ho imparato pure io da Vanni ^_^)

    cit. " leggendolo posso capire cosa fa..ma contiene funzioni che non ho mai ne usato ne visto...per cui non mi sto a fare tanti problemi per capirle"
    --> Una buona occasione per imparare istruzioni o funzioni nuove, no? e anche per cercare le alternative. Perché rinviare sempre? :)
    Per esempio puoi sostituire tranquillamente il richiamo a FileDialog con Application.GetOpenFilename e anche con Application.FindFile (questa seconda istruzione apre direttamente il file).
    Il ciclo For Each serve a scorrere una lista di oggetti, restituendo ogni volta un oggetto della lista (e vuole una variabile contatore di tipo variant perché Excel non può sapere a priori su che tipo di oggetto sta ciclando)