2016-05-18 18 views
7

Ho una cartella di lavoro di Excel in cui quasi tutto è automatizzato. Apre altre cartelle di lavoro, copia i dati da loro, li chiude e quindi scorre i dati più volte per generare report che stampiamo e usiamo. Quasi ogni volta dopo aver eseguito tutto il VBA e dopo aver provato a stampare, l'anteprima di stampa si blocca sia trovando la stampante che caricando le dimensioni della pagina come si vede nell'immagine. La chiusura di Excel e la riapertura del documento ripristinano l'anteprima di stampa alla normale funzionalità. L'unica cosa legata alla stampa che fa il VBA è cambiare l'area di stampa. Non ho avuto questo problema con altri documenti che eseguono VBA. È solo un bug o forse qualcosa nel codice?Problemi di anteprima di stampa dopo aver eseguito grandi quantità di VBA

Issue

Questo è il codice che causa anteprima di stampa per riuscire a caricare in qualche modo. Se salgo questa sezione, funziona come previsto ... Mi piacerebbe avere questo codice in qualche modo in quanto è ancora necessario.

Set wb1 = Workbooks.Open(FileName) 
    Set wb2 = ThisWorkbook 

    For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report 
     ShtName = sArray(i, 0) 
     On Error Resume Next 
      wb1.Sheets(ShtName).Activate 
      If Err.Number = 0 Then 
       wb1.Sheets(ShtName).Activate 
       Columns("A:U").Copy 
       wb2.Sheets(ShtName).Activate 
       Columns("BE:BV").Select 
       Selection.PasteSpecial xlPasteValues 
       Application.CutCopyMode = False 
       lastrow = Cells(Rows.Count, "BE").End(xlUp).Row 
       Range("BA2:BC2").Select 
       Selection.AutoFill Destination:=Range(Cells(2, "BA"), Cells(lastrow, "BC")), Type:=xlFillDefault 
      End If 
     On Error GoTo 0 

     DoEvents 

    Next i 

    wb1.Close False 

    Sheet2.Activate 

Ho provato commentando "On Error Resume Next", "On Error Goto 0", "Se ...", "End If" e "DoEvents". Anteprima di stampa non riesce ancora con quelli rimossi e basta fare il copia e incolla dal foglio precedente.

+2

È necessario fornire alcune informazioni aggiuntive se si sta cercando una soluzione. Qual è il codice? Cosa succede se non si esegue la parte dell'area di stampa del codice? Succede su ogni macchina? E riguardo le diverse versioni di Excel? – Raystafarian

+0

Puoi pubblicare il tuo codice in modo che possiamo vedere cosa sta succedendo? Potrebbe esserci un problema con l'apertura o la perdita delle cartelle di lavoro. Puoi provare a impostare ActivePrint o PaperSize qualcosa di simile a 'ActiveWorkbook.Sheets (" Nome "). PageSetup.PaperSize = xlPaperLegal' – MatthewD

+0

Forse puoi controllare la raccolta di nomi sia a livello di foglio di lavoro sia a livello di foglio di lavoro _after_ hai eseguito il VBA . Se trovi che ci sono più nomi Print_Area o altre voci di nomi strani, questo potrebbe essere il tuo colpevole. Il problema è che il problema viene eliminato riavviando Excel, il che suggerisce che i nomi delle cartelle di lavoro che iterate nel processo stanno inquinando la raccolta dei nomi nella cartella di lavoro principale che presenta il problema di Anteprima di stampa. –

risposta

3

Sembra che la rimozione di tutte le istanze di DoEvents ha risolto il problema ...

Anteprima di stampa funziona correttamente ed Excel non va in crash quando si esce più la cartella di lavoro.

+0

Ahimè, hai scoperto orrori di doevents. Non lo sto dicendo al 100% ma nella maggior parte dei casi crea più problemi di quanti ne risolva.Voto positivo per la conoscenza degli eventi –

0

Credo che stai cercando un tipo di azione di aggiornamento che può risincronizzare la visualizzazione dell'anteprima con i dati sul foglio. Potresti provare questo alla fine:

ActiveSheet.EnableCalculation = False 
ActiveSheet.EnableCalculation = True 

Se ciò non funziona, vedere se il salvataggio manuale risolve il problema. Puoi provare a chiamare Application.Save alla fine.

+0

Darò le impostazioni di calcolo a lunedì. So che questo problema si verifica prima di salvare e dopo aver usato save as. Il documento verrà comunque stampato se si fa clic su stampa anche in caso di mancata visualizzazione del display/della dimensione della carta. – tjb1

+0

Aggiungendo questo a ciascun foglio non è stato risolto purtroppo. – tjb1

0

"L'anteprima di stampa si verifica automaticamente quando si seleziona File -> Stampa. Un'altra opzione consiste nell'utilizzare la vista Layout di pagina (l'icona sul lato destro della barra di stato). Per ottenere l'anteprima di stampa vecchio stile, necessità di utilizzare VBA la seguente dichiarazione viene visualizzata un'anteprima di stampa del foglio attivo:. ActiveSheet.PrintPreview "

Citato da Microsoft Excel 2013 Power Programming con VBA da John Walkenbach, pagine 956-957.

Detto ciò, ho verificato il problema precedente registrando una macro relativamente complessa che crea un nuovo foglio, esegue 25 azioni automatiche e mostra un'anteprima di stampa, quindi chiude l'anteprima di stampa quando faccio clic su OK su un MsgBox. Ho ripetuto il programma per farlo 1000 volte. Non ho mai avuto un problema con PrintPreview.

+0

Cercherò di aggiungere l'anteprima di stampa VBA. In questo momento i fogli che vengono solitamente stampati sono generati da un elenco, quindi utilizzo un modello che viene copiato. Crea in media 1-12 fogli dall'elenco, copia i dati da una cartella di lavoro più vecchia, esegue il ciclo di circa 3.000 righe per popolare i fogli creati, quindi esegue il ciclo di circa 40.000 righe per aggiungere ulteriori informazioni ai fogli. Probabilmente trarrebbe beneficio da una riscrittura ora che la funzionalità di scorrimento è terminata ma non mi vedo avere il tempo per quello ... – tjb1

+0

Concordato @ tjb1, quella volta è una risorsa rara. Quello che farei nella tua situazione non è un tentativo di riscrittura completa, ma iniziare con una copia testabile del codice originale salvato sul desktop (vice server di rete o qualcosa del genere). Quindi, prova semplici modifiche come hai tempo. Ad esempio, il codice VBA 'ActiveSheet.PrintPreview' si basa su un'Anteprima di stampa più vecchia e con meno memoria, che potrebbe essere sufficiente per risolvere il problema. – Andy

0

Il suo tipo di scatto al buio, ma ho provato a pulire un po 'il codice. Vedi se questo ha alcun effetto.

Sub Test() 

Dim wb1 As Workbook, wb2 As Workbook 
Dim ws1 As Worksheet, ws2 As Worksheet 
Dim isWS As Boolean 

On Error GoTo sub_err 

Set wb1 = Workbooks.Open(Filename) 
Set wb2 = ThisWorkbook 

For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report 
    ShtName = sArray(i, 0) 
    isWS = True 
    Set ws1 = wb1.Sheets(ShtName) 

    If isWS Then 
     Set ws2 = wb2.Sheets(ShtName) 

     ws1.Columns("A:U").Copy 
     ws2.Columns("BE:BV").PasteSpecial xlPasteValues 
     Application.CutCopyMode = False 
     lastrow = ws2.Cells(ws2.Rows.Count, "BE").End(xlUp).Row 
     ws2.Range("BA2:BC2").AutoFill Destination:=ws2.Range(ws2.Cells(2, "BA"), ws2.Cells(lastrow, "BC")), Type:=xlFillDefault 
    End If 
    DoEvents 
Next i 

wb1.Close False 

ws2.Activate 

sub_exit: 
Exit Sub 

sub_err: 
If Err.Number = 9 Then 
    isWS = False 
    Resume Next 
Else 
    MsgBox "Error: " & Err.Number & vbNewLine & Err.Description 
    Resume sub_exit 
End If 

End Sub 

La grande cosa che ho fatto è stata scorporata la vostra gestione degli errori, in questo modo si riprende solo dopo, quando non si trova il foglio in WB1 e tutti gli altri errori (nessuno errore 9 errori) sarà ancora mostrare il proprio errore Messaggio.

Mi sono anche assicurato che tutte le tue Range(), Cells() e Columns() facessero riferimento al foglio corretto (solo in caso excel si confondesse) e ho assunto che il foglio attivo fosse il foglio corretto, ma potresti volere per verificare questo nel codice per assicurarsi che stia facendo la cosa corretta nel foglio corretto.

Ora il codice di copia viene eseguito solo se isWS = true e sarà sempre true a meno che non venga generato un codice di errore 9. L'unica cosa che non sapevo era se WB2 sarebbe sempre un nome del foglio pari a ShtName ma credo lo farà dal momento che è all'interno del vostro se err.number = 0

Non sono sicuro se questo cambierà niente per te, ma sarei curioso di sentire i tuoi risultati in un altro modo.

+0

Sono riuscito a correggerlo ieri rimuovendo tutti i 'DoEvents' dal codice. Non so se fossero in cattive condizioni o quale fosse il problema, ma la loro rimozione ha riportato tutto alla normalità. Ho giocato un po 'con quella sezione di codice e avevo ancora problemi con la rimozione della gestione degli errori. – tjb1

Problemi correlati