excel vba per Mac non copia grafico su word

Anonimo
2025-02-20T11:30:25+00:00

Ho sviluppato una macro con Excel 365 VBA per Mac attraverso la quale copio delle tabelle su un file word e devo incollare due grafici in due posizioni distinte ed individuate nel documento di Word attraverso due Segnalibri ("Bookmarks").

Nel momento in cui faccio l'operazione Incolla da Excel VBA sul documento Word il sistema si blocca per qualche minuto e non esegue il comando richiesto.

Allego il listato in VBA, potete darmi una mano a capire dove sbaglio?

Nell'estratto del listato che allego il segnalibro su Word si chiama "Graficop2" ed il grafico di Excel che vorrei copiare su Word si chiama "Grafico1".

Grazie

1                Dim Apriword As Object

2                Dim Mydoc As Object

3                Dim Tabella1 As Table

4                On Error Resume Next

'Apro l'istanza Word

5                Set Apriword = GetObject(, "Word.Application")    'gives error 429 if Word is not open

5.1               If Err = 429 Then

5.2               Set Apriword = CreateObject("Word.Application")   'creates a Word application

5.3               Err.Clear

5.4               End If

'Definisco le variabili per il salvataggio del file Word

6 periodoini = Day(Worksheets("Maschera").Cells(3, "C")) & "-" & Month(Worksheets("Maschera").Cells(3, "C")) & "-" & _ Year(Worksheets("Maschera").Cells(3, "C")) 

7 periodofine = Day(Worksheets("Maschera").Cells(3, "D")) & "-" & Month(Worksheets("Maschera").Cells(3, "D")) & _

"-" & Year(Worksheets("Maschera").Cells(3, "D"))

'Apro il documento Word

8                With Apriword

9                .Visible = True

'Apro il documento Word Master

10         .Documents.Open FileName:=Percorso & "Analisi di gestione/" & ragione & "/Caso di studio - master EE.docx"

'Salvo il documento Word con nome in modo da compilarlo lasciando il documento Master disponibile per i successivi cicli

11         strfile = testodir & "/" & ragione & "/Elaborazione dal " & periodoini & " al " & periodofine & ".docx"

12         .ActiveDocument.SaveAs FileName:=strfile

 'Attivo la procedura di copia ed incolla del grafico da Excel a Word

13         Application.EnableEvents = False

14          .Selection.GoTo what:=wdGoToBookmark, Name:="Graficop2"

15         .ActiveDocument.Bookmarks("Graficop2").Select

16         Worksheets("Maschera").ChartObjects("Grafico 1").Activate

17         ActiveChart.PlotArea.Select

18         ActiveChart.ChartArea.Copy

19              Worksheets("Maschera").ChartObjects("Grafico 1").CopyPicture

20         .Selection.GoTo what:=wdGoToBookmark, Name:="Graficop2"

21                 .ActiveDocument.Bookmarks("Graficop2").Select

22                .ActiveDocument.Selection.Range.Paste

23         ActiveDocument.Save 'As Filename:=strfile

24         .ActiveDocument.Close

25         'chiudere word per le prossime analisi

26         .Quit wdDoNotSaveChanges

27         End with

28         Set Mydoc = Nothing

29         Set Apriword = Nothing

Ho provato anche a cambiare le dichiarazioni iniziali ponendo:

Dim Apriword as Word.Application

Dim Mydoc as Word.Document.Application

ma a quel punto il sistema va in crash nel momento in cui deve eseguire l'istruzione CreateObject.

Microsoft 365 e Office | Excel | Per il lavoro | MacOS

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

7 risposte

Ordina per: Più recente
  1. Anonimo
    2025-02-22T07:15:39+00:00
    Perchè?
    

    Purtroppo non saprei.

    Con le versioni più recenti di office, nella versione Windows, mi è capitato che si avesse un errore di VBA in corrispondenza dell'istruzione di incollaggio nel range del bookmark. L'errore era dovuto dal fatto che l'immagine non venisse caricata in memoria e occorresse attendere un paio di decimi di secondo prima di passare all'istruzione di incollaggio.

    Ho risolto facendo trascorrere quel tempo tramite una sub di "delay".

    Te la riporto qui sotto:

    Public Sub TimerDelay(Optional Delay As Double)
    
      Const vDelay As Double = 0.25
    
      Dim vTimer As Double
    
      If Delay = 0 Then Delay = vDelay
    
      vTimer = Timer
    
      Do While Timer < vTimer + Delay
    
          DoEvents
    
      Loop
    
    End Sub
    

    Se chiamata senza il parametro il tempo di ritardo è prefissato 1/4 di secondo.

    Prova ad inserire l'istruzione "Call TimerDelay" dopo il "copypicture" e prima del "range.paste" e vedere se viene comunque prodotto l'errore vba.

    Inoltre hai provato a fare il "contrario"?

    Word che apre Excel, copia il grafico di Excel e lo riporta nel documento?

    Per vedere se anche così si presenta l'errore nel momento in cui si cerca di incollare il grafico nel documento?

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2025-02-21T23:04:17+00:00

    Ciao,

    innanzitutto grazie del supporto. Eseguita la prova il risultato non è cambiato.

    Credo che la differenza di comportamento stia nella versione Mac degli strumenti Word ed Excel: non stanno dialogando.

    Ho fatto un altro test: ho eseguito la Subroutine su Excel fino all'istruzione:

    Worksheets("Maschera").ChartObjects("Grafico 1").CopyPicture Appearance:=xlPrinter, Format:=xlPicture 
    poi mi sono spostato su word ed ho fatto una macro di prova che contiene l'istruzione:
    ActiveDocument.Bookmarks("Graficop2").Range.Paste
    A questo punto il programma funziona.
    Ho pensato allora di creare un'istruzione di chiamata da excel alla Sub "prova" su Word:
    Apriword.Run ("prova")
    si è verificato nuovamente l'errore di automazione.
    A questo punto credo che il problema sia nel rapporto tra excel e word. La cosa strana è che i bookmarks di testo 
    o numerici vengono incollati bene. Il problema emerge quando excel e word dialogano sul grafico.
    Perchè?
    

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2025-02-21T18:09:28+00:00

    Ciao,

    io ho provato, anche se senza i riferimenti numerici di riga e impostando i percorsi sul mio pc, partendo da un documento word con un segnalibro e con un semplice grafico nel foglio di lavoro.

    Alla fine della procedura mi viene creato il documento con il grafico.

    Questo l'excel con il grafico:

    lancio la procedura e viene salvato il documento word:

    Questo il codice come da me modificato:

    Sub TestCopiaGraficoInDocWord() 
    
       Dim Apriword As Object 
    
       Dim mydoc As Object 
    
       Dim percorso As String 
    
       Dim strfile As String 
    
       'Apro l'istanza Word 
    
       On Error Resume Next 
    
       Set Apriword = GetObject(, "Word.Application")    'gives error 429 if Word is not open 
    
       If Err = 429 Then 
    
          Set Apriword = CreateObject("Word.Application")    'creates a Word application 
    
          Err.Clear 
    
       End If 
    
       On Error GoTo 0 
    
       'Definisco le variabili per il salvataggio del file Word 
    
       percorso = "C:\Dropbox\Microsoft Community\TestWord\" '<== tuo percorso con "barra" finale
    
       strfile = percorso & "Caso di studio - Analisi EE.docx" 
    
       'Apro il documento Word 
    
       With Apriword 
    
          .Visible = True 
    
          Set mydoc = .Documents.Add(Template:=percorso & "Caso di studio - master EE.docx", NewTemplate:=False) 
    
          'Attivo la procedura di copia ed incolla del grafico da Excel a Word 
    
          Worksheets("Maschera").ChartObjects("Grafico 1").CopyPicture Appearance:=xlPrinter, Format:=xlPicture 
    
          mydoc.Bookmarks("Graficop2").Range.Paste 
    
          .ActiveDocument.SaveAs Filename:=strfile 
    
          .ActiveDocument.Close 
    
          'chiudere word per le prossime analisi 
    
          .Quit 
    
       End With 
    
       Set mydoc = Nothing 
    
       Set Apriword = Nothing 
    
    End Sub 
    

    Qui ti metto il link dropbox dove trovi anche il file Excel (e il "modello" word che ho utilizzato).

    Magari fai delle prove con questo file "basico" per vedere se funziona o se ti dà errori.

    Link DropBox

    Ciao

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2025-02-21T16:00:27+00:00

    Ciao,

    prima di tutto grazie dei suggerimenti che ho implementato e, sicuramente, trovo un enorme risparmio di righe e di elaborazione nella prima parte.

    Purtroppo, però, il sistema continua a dare errore; ti allego lo schema del nuovo codice e quanto mi compare come messaggio di errore da Word:

    1                Dim Apriword As Object

    2                Dim mydoc As Object

    3                'Dim Tabella1 As Table

    4                On Error Resume Next

    'Apro l'istanza Word

    5                Set Apriword = GetObject(, "Word.Application")    'gives error 429 if Word is not open

                  If Err = 429 Then

                  Set Apriword = CreateObject("Word.Application")   'creates a Word application

                  Err.Clear

                  End If

    'Definisco le variabili per il salvataggio del file Word

    'Apro il documento Word

    6                With Apriword

    7                Apriword.Visible = True

    'Apro il documento Word Master

    8         Percorso = "/Users/amministratore/Library/CloudStorage/Dropbox/Richiesta aiuto Microsoft"

    9 Set mydoc = .Documents.Add(Template:=Percorso & "/Caso di studio - master EE.docx", NewTemplate:=False)

     'Attivo la procedura di copia ed incolla del grafico da Excel a Word

    Worksheets("Maschera").ChartObjects("Grafico 1").CopyPicture Appearance:=xlPrinter, Format:=xlPicture

    mydoc.Bookmarks("Graficop2").Range.Paste

    11         strfile = Percorso & "/Caso di studio - Analisi EE.docx"

    12         .ActiveDocument.SaveAs FileName:=strfile

    24         .ActiveDocument.Close

    25         'chiudere word per le prossime analisi

    26         .Quit wdDoNotSaveChanges

    27         End With

    28         Set mydoc = Nothing

    29         Set Apriword = Nothing

    End Sub

    Dopo qualche minuto che Word lavora, ottengo la seguente risposta: Errore di runtime 4198 - Non è possibile modificare la macro specificata.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2025-02-21T06:32:59+00:00

    Ciao,

    personalmente eviterei tutte quelle "selezioni" e agirei direttamente tramite gli oggetti.

    Ad es. per copiare un grafico presente in un foglio (che ho dichiarato tramite la variabile "wsGraficiComposizioneAttivoPassivo") e "i" è una variabile per un ciclo poiché ci sono più grafici, con:

    wsGraficiComposizioneAttivoPassivo.ChartObjects("GraficoComposizioneAttivoPassivoAnno" & i).CopyPicture Appearance:=xlPrinter, Format:=xlPicture

    e per incollarlo dove è presente il segnalibro nel documento word:

    .BookMarks("GraficoComposizioneAttivoPassivoAnno" & i).Range.Paste

    dove ".BookMarks" è preceduto da un

    "With oDocWord"

    e dove "oDocWord" corrisponderebbe al tuo "Mydoc"

    Personalmente poi richiamo un eventuale "documento master" come template con il comando "Add".

    Ad es.

    Set oDocWord = .Documents.Add(Template:=tmpPath & sNomeFileModello, NewTemplate:=False)

    In questo modo viene aperto un documento nuovo senza che venga realmente aperto il file che fa da modello.

    La risposta è stata utile?

    0 commenti Nessun commento