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ù utili
  1. 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
  2. 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
  3. 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
  4. Anonimo
    2025-02-20T17:53:03+00:00

    Thank you Jim,

    I've provided a simple file excel with macro that reproduces the behavior of my file.

    I give you the hyperlink to the directory in Dropbox in which I have put the example files: Test Directory

    The file Excel is named: Richiesta di aiuto Microsoft.xlsm

    The word file is: Caso di studio - master EE.docx

    Thanks for all

    Mirko

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Jim G 134K Punti di reputazione MVP Moderatore volontario
    2025-02-20T14:34:00+00:00

    La risposta è stata utile?

    0 commenti Nessun commento