Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

(VBA) range copy.picture con file nascosto

  1. #1
    ginopizza non è in linea Scolaretto
    Post
    111
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao

    Ho un problema con copy.picture in vba excel, dovrei semplicemente copiare un determinato range da un file excel che apro in modo che non sia visibile, in un documento word.
    Questa operazione devo ripeterla per molti file attraverso un loop, e quindi devo nascondere sia il file excel che il documento word, aperti durante il processo, per evitare effetti grafici poco piacevoli.
    Provo a pubblicare una parte del codice per evidenziare il problema:

    Public objExcel As Excel.Application
    Public opjwkb As Workbook
    
    Public objWord ' As Word.Application
    Public objDoc ' As Word.Document
    
    
    Sub copia_immagine()
    
    
    link_exc = "c:/temp/pippo_d.xlsm" 'semplice --> pippo_2.xlsx,d_file --> pippo_d.xlsm,con macro --> pippo_2.xlsm
    link_doc = "c:/temp/pippo_2.docx"
    
    
    Set objWord = CreateObject("Word.Application") ' apro applicazione word
    
    
    
    Set objExcel = CreateObject("Excel.Application")
    
    
    
    
    
    Set opjwkb = objExcel.Workbooks.Open(link_exc) ' apro d-file
    
    
    
    Set objDoc = objWord.Documents.Open(link_doc)
    
    
    opjwkb.Application.CutCopyMode = False
    
    
    a = opjwkb.Sheets(1).Cells(2, 1)
    
    
    Call pp' sub con copia range
    
    
    objDoc.SaveAs FileName:=("C:/temp/pippo_doc.docx")
    
    opjwkb.Close SaveChanges:=False ' chiudo file d-card
    
    objDoc.Close SaveChanges:=True ' chiudo file d-card
    
    'objDoc.Close
    
    Set objDoc = Nothing
    Set objWord = Nothing
    
    Set opjwkb = Nothing
    Set objExcel = Nothing
    
    MsgBox "fine"
    
    End Sub
    
    
    Sub PP
    
    Sub pp()
    
    objExcel.Visible = true
    
    Do: DoEvents: Loop Until Application.Ready
    
    opjwkb.Sheets(1).Range("A1:t50").CopyPicture 'xlScreen, xlBitmap
    
    objExcel.Visible = False
    
    Do: DoEvents: Loop Until Application.Ready
    
    ' copia immagine nel documento word
    objWord.Selection.Paste
    objWord.Selection.TypeParagraph
    
    End Sub
    
    il problema è che se rendo visibile il file excel , modificando la riga evidenziate in rosso, funziona correttamente se invece rendo invibile il file ottengo errore, più precisamente --> CopyPicture method of range class failed.
    in riassunto:

    objExcel.Visible = False --> Errore --> CopyPicture method of range class failed
    objExcel.Visible = True --> OK

    Come posso risolvere ?

  2. #2
    UGoldrake non è in linea Scolaretto
    Post
    373
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao ginopizza, da un po' di tempo uso questi 2 blocchi di codice per velocizzare lo svolgimento delle macro e direi che funzionano alla grande.

    Apro le sub con:
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    'Application.Visible = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    
    e le chiudo con
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.Visible = True
    Application.DisplayStatusBar = True
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
        Range("A1").Select
        MsgBox "Finito."
    
    Come puoi vedere la terza riga del primo blocco contiene 'Application.Visible = False con l'apice per non farlo eseguire ma, nel tuo caso, penso che sia ciò che fa per te, ovvero esegue il codice senza mostrare neppure Excel, ricordati che nel secondo blocco va rimesso a true ed infatti ce lo trovi senza apice così, se mi scordassi di farlo, è già impostato.
    L'unica cosa a cui devi porre attenzione è che non ci siano errori che facciano terminare la macro prima di aver ripristinato la vista a true; se capitasse, passa in debug e sposta il cursore a mano fino a quella riga e poi fai F5, così puoi riprendere il controllo di excel, perché ti scompare pure l'IDE! Quindi correggi l'errore e riparti.

    le Ultime 2 righe con Range A1 e msgbox "Finito" mi servono per sapere che la macro è conclusa e ripristino il cursore in un punto da me preferito, soprattutto il messaggio è importante, soprattutto quando non vedi cosa sta facendo.

    Al di là del tuo problema questi 2 blocchi di codice sono veramente ottimi per velocizzare qualsiasi macro: provare per credere.

    Ugo

  3. #3
    ginopizza non è in linea Scolaretto
    Post
    111
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie Ugo
    Proverò ad attuare tuo suggerimento.
    Però il grosso problema è che con objExcel.Visible =false che equivale ad application.Visible=false il programma va in errore, a casa del comando CopyPicture.

    Ciao

  4. #4
    UGoldrake non è in linea Scolaretto
    Post
    373
    Like Inviati  
    0
    Like Ricevuti  
    0
    Forse lo ScreenUpdating = False potrebbe bastare...?

  5. #5
    ginopizza non è in linea Scolaretto
    Post
    111
    Like Inviati  
    0
    Like Ricevuti  
    0
    Niente da fare, non potendoli nascondere, i file si aprono in rapida sequenza e si rendono visibili per pochi attimi, creando un fastidioso effetto sfarfallio.
    Apparentemente il problema non sembra risolvibile, se nascondo i file che si aprono, il comando copypicture va in errore ...

  6. #6
    UGoldrake non è in linea Scolaretto
    Post
    373
    Like Inviati  
    0
    Like Ricevuti  
    0
    Hai pensato a minimizzare la finestra di excel?
    Non so se è corretto così:
    Application.WindowState = xlMinimized
    
    Fallo prima di OPEN, ovviamente, in questo modo, con la finestra dell'applicazione minimizzata non dovresti avere lo sfarfallio, FORSE!

    Non garantisco che Excel non la massimizzi per conto suo e la riporti in basso subito dopo, ma vale la pena tentare.
    Fammi sapere...
    Ugo

  7. #7
    ginopizza non è in linea Scolaretto
    Post
    111
    Like Inviati  
    0
    Like Ricevuti  
    0
    Fatto, ho provato ma porta lo stesso errore.
    È una strana situazione, se procedo in modalita debug il comando copypicture funziona, aspettanto 1-2 secondi prima di eseguirlo nel corso del programma.
    Ho provato allora mettendo una pausa:
    Application.Wait (Now + TimeValue("0:00:2"))
    
    prima del copypicture in combinazione con tuo suggerimento -->
    Application.WindowState = xlMinimized
    
    e funziona.
    Il tutto però è molto precario ed anche lento, i 2 secondi potrebbero non bastare ed aumentare il tempo, renderebbe tutto ancora più lento.
    Sembra che non sono in pochi ad avere riscontrato difficoltà con CopyPicture, ho provato ad applicare i più svariati suggerimenti che ho trovato in rete, ma senza successo.

  8. #8
    UGoldrake non è in linea Scolaretto
    Post
    373
    Like Inviati  
    0
    Like Ricevuti  
    0
    Prova a tornare alla finestra con lo sfarfallio, però riducila non ad icona ma semplicemente rimpiccioliscila, se la fai molto piccola non dovresti notare lo sfarfallio.
    La macro la fai partire dall'Ide o da una combinazione di tasti.

  9. #9
    ginopizza non è in linea Scolaretto
    Post
    111
    Like Inviati  
    0
    Like Ricevuti  
    0
    Funziona, la macro la faccio partire da un form con un command button, apro il file excel da elaborare con nuova istanza sul quale applico il copypicture per copiare l'immagine in un documento word.
    Come da te suggerito ridimensiono la finestra:

    Set opjwkb = objExcel.Workbooks.Open(link) ' apro nuovo file excel
        
        With objExcel
            .WindowState = xlNormal
            .Left = 1050
            .Top = 510
            .Width = 50
            .Height = 50
        End With
    
    e l'effetto sfarfallio, pur con il file visibile, si riduce notevolmente, quasi non si nota.
    Mi resta solo da risolvere la lentezza, il programma impiega 4-5 minuti per aprire un file excel x volta, copiare ed incollare l'immagine in 100 file word e salvarli, mi sembrano tanti.
    Grazie 1000 per il prezioso supporto.

  10. #10
    UGoldrake non è in linea Scolaretto
    Post
    373
    Like Inviati  
    0
    Like Ricevuti  
    0
    Per la velocità intanto mantieni le righe che ti ho messo nel primo post, con l'apice nella riga che nasconde l'applicazione 'application.visibile = true
    Non guasta.

    Ugo

    PS: a pensarci bene, potrebbe essere il salvataggio dei 100 file a fregarti rallentando tutto il lavoro.
    Fai un test levando il codice di salvataggio, dovresti avere il risultato finito in pochi secondi.
    Se fosse così, hai trovato il colpevole, e puoi concentrarti su quello.
    Ciao

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. cancellazione file di blocco di word (file nascosto)
    Da MaurizioBruni nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 30-05-2017, 13:44
  2. Range.Copy [VALORI]
    Da emanueleorabona nel forum Microsoft Excel
    Risposte: 20
    Ultimo Post: 14-10-2013, 10:38
  3. Risolto: Lanciare file bat nascosto
    Da ganzos nel forum Microsoft Windows
    Risposte: 4
    Ultimo Post: 09-05-2011, 00:27
  4. Utilizzo File.Copy
    Da caccola nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 07-07-2005, 11:34
  5. Creare un file nascosto
    Da Knives85 nel forum Visual Basic 6
    Risposte: 16
    Ultimo Post: 15-10-2004, 19:57