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

Problemi con PasteSpecial, da grafico a "Enhanced Metafile"

  1. #1
    BennyB non è in linea Scolaretto
    Post
    184
    Like Inviati  
    0
    Like Ricevuti  
    0
    Buongiorno.
    Ho trovato uno strano problema. Sarà una scemenza, ma non riesco a vederla.
    La questione è la seguente: ho un workbook con una ventina di grafici (in singoli fogli) collegati ad una lista di dati.
    In un foglio denominato "Riferimenti" ho aggiunto un tasto activeX con il seguente semplice codice:
    Private Sub TastoCrea_Click()
    Call graficiOUT
    
    End Sub
    
    La routine chiamata è in un modulo, ed è questa:
    Sub graficiOUT()
    
    Set ws = ActiveWorkbook.Sheets("Immagini")
    For iCont = 1 To 20
        Sheets("Grafico" & CStr(iCont)).Activate
        ActiveChart.ChartArea.Copy
        ws.Activate
        ws.Cells(3 + (iCont - 1) * 29, 1).Select
        ws.PasteSpecial Format:="Picture (Enhanced Metafile)", Link:= _
            False, DisplayAsIcon:=False
        Selection.ShapeRange.ScaleWidth 0.9, msoFalse, msoScaleFromTopLeft
        Selection.ShapeRange.ScaleHeight 0.9, msoFalse, msoScaleFromTopLeft
    Next iCont
    
    End Sub
    
    In pratica, copio un grafico alla volta (i grafici sono denominati come 'Grafico1', 'Grafico2', eccetera), poi mi sposto su un foglio denominato "Immagini"), e lo incollo come immagine Enhanced Metafile, per poi scalarlo alla dimensione voluta.
    Procedendo passo passo in debugging, funziona tutto correttamente.
    Se, però, lancio la routine dal tasto, si ferma all'istruzione PastSpecial con l'errore 1004. In quel momento, se richiedo il debug e proseguo con F8, l'immagine si incolla correttamente.
    Stravagante, vero?!
    Qualcuno sa darmi una spiegazione?

  2. #2
    Marius44 non è in linea Scolaretto
    Post
    355
    Like Inviati  
    0
    Like Ricevuti  
    4
    Ciao
    Non mi convincono queste tre righe di codice

    ws.Activate
    ws.Cells(3 + (iCont - 1) * 29, 1).Select
    ws.PasteSpecial

    Cioè: attivi ws e selezioni una determinata cella. Poi io metterei Selection.PasteSpecial non ws.PasteSpecial
    Ma sicuramente prendo un abbaglio.

    Ciao,
    Mario

  3. #3
    BennyB non è in linea Scolaretto
    Post
    184
    Like Inviati  
    0
    Like Ricevuti  
    0
    No, il PasteSpecial prevede la destinazione. Con selection l'errore è 438 (proprietà o metodo non supportati dall'oggetto).

    Indagando, ho trovato questa pagina: https://stackoverflow.com/questions/...copying-images; ho provato ad applicarla, ma il risultato è lo stesso.
    Il codice seguendo le indicazioni diverrebbe questo:
    Sub graficiOUT()
    
    Set ws = ActiveWorkbook.Sheets("Immagini")
    For iCont = 1 To 8
        With ActiveWorkbook.Sheets("Grafico" & CStr(iCont))
            .ChartArea.Copy
            DoEvents
            ws.PasteSpecial Format:="Picture (Enhanced Metafile)", Link:= _
                False, DisplayAsIcon:=False
        End With
        Application.CutCopyMode = False
        Selection.ShapeRange.ScaleWidth 0.9, msoFalse, msoScaleFromTopLeft
        Selection.ShapeRange.ScaleHeight 0.9, msoFalse, msoScaleFromTopLeft
    Next iCont
    
    End Sub
    
    ma presenta il medesimo errore.

    Forse è lo spostamento ad un altro foglio che gli crea problemi?

  4. #4
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    Quote Originariamente inviato da BennyB Visualizza il messaggio
    No, il PasteSpecial prevede la destinazione. Con selection l'errore è 438 (proprietà o metodo non supportati dall'oggetto).
    No, son proprio due metodi diversi. Se guardi la documentazione, il Worksheet.PasteSpecial fa una cosa, mentre il Range.PasteSpecial (che è quello che ti ha suggerito Marius) ne fa un'altra. Hanno proprio due firme diverse, nonostante siano omonime...

    A me non sembrano esserci errori nel codice (anche perché se no nemmeno in debug funzionerebbe)... Se registri una macro ed esegui il classicissimo CTRL+C - CTRL+V, che codice ti genera?

  5. #5
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Post
    300
    Like Inviati  
    0
    Like Ricevuti  
    0
    Il fatto che con F8 funzioni mi fa pensare che inserire un piccolo ritardo artificiale fra il Copy ed il PasteSpecial possa risolvere il problema.
    ℹ️ Leggi di più su Zer0Kelvin ...

  6. #6
    BennyB non è in linea Scolaretto
    Post
    184
    Like Inviati  
    0
    Like Ricevuti  
    0
    Sì, ha ragione Zer0Kelvin. In effetti, l'operazione di copia deve richiedere un certo tempo, visto che concerne una marea di dati, e infatti introducendo un Wait di 2 secondi l'operazione PasteSpecial va a buon fine.
    Ci avevo già pensato, ma avevo scartato l'idea presupponendo che non fosse necessario. La presunzione...

    Grazie ancora. A tutti.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 1
    Ultimo Post: 20-07-2020, 16:26
  2. Risolto: LibreOffice "BASE" - Connessione a db MYSQL "drive JDBC non caricati" non li vede
    Da CMCS nel forum LibreOffice, OpenOffice e altro
    Risposte: 5
    Ultimo Post: 30-07-2014, 12:45
  3. Access 2K - Grafico in maschera "oggetto bloccato"
    Da The Gang nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 06-09-2007, 17:15
  4. togliere delle fastidiose """""""
    Da cubateam nel forum Microsoft Word
    Risposte: 10
    Ultimo Post: 21-06-2007, 20:06
  5. Risposte: 8
    Ultimo Post: 11-10-2005, 17:21