Da excell a word



  • Da excell a word
    di PrimaFase data: 12/07/2016 18:08:39

    Ciao a tutti, ho un altro problema vi ringrazio in anticipo.

    Devo formare una serie di tabelle in word da un unica tabella generale presente in un file excel.

    Visto che a spiegarmi non sono il massimo allego un esempio; nel file xls c'è la tabella "Madre" mentre in word ci sono due tabelle che dovrei riempire.

    Vi ringrazio in anticipo per l'aiuto

    Ciao a tutti
    File Allegati File A



  • di Vecchio Frac data: 13/07/2016 08:24:49

    Te le caverai con una semplice stampa unione.

    p.s. "Excel" e non "excell", "Word" e non "word".





  • di patel data: 13/07/2016 11:35:24

    prova questa
     
    Sub a()
    LR = Cells(Rows.Count, "A").End(xlUp).Row
    Range("A1:B" & LR).Copy Range("M1")
    Range("E1:E" & LR).Copy Range("O1")
    Range("B1:B" & LR).Copy Range("M" & LR + 2)
    Range("D1:D" & LR).Copy Range("N" & LR + 2)
    Range("G1:G" & LR).Copy Range("O" & LR + 2)
    Range("F1:F" & LR).Copy Range("P" & LR + 2)
    Range("E1:E" & LR).Copy Range("Q" & LR + 2)
    Range("I1:I" & LR).Copy Range("R" & LR + 2)
    Set tbl = Range("M1:R" & LR * 2 + 1)
      On Error Resume Next
          Set WordApp = GetObject(class:="Word.Application")
          Err.Clear
          If WordApp Is Nothing Then Set WordApp = CreateObject(class:="Word.Application")
          If Err.Number = 429 Then
            MsgBox "ERRORE"
            GoTo EndRoutine
          End If
      On Error GoTo 0
      WordApp.Visible = True
      WordApp.Activate
      Set myDoc = WordApp.Documents.Add
      tbl.Copy
      myDoc.Paragraphs(1).Range.PasteExcelTable _
        LinkedToExcel:=False, _
        WordFormatting:=False, _
        RTF:=False
      Set WordTable = myDoc.Tables(1)
      WordTable.AutoFitBehavior (wdAutoFitWindow)
    EndRoutine:
      Application.CutCopyMode = False
    End Sub
    
    






  • di talete79 data: 25/07/2016 23:04:48

    Anche a me occorre copiare una tabella da word in excel. Premetto che ho cercato su questo e altri forum qualcosa che mi aiutasse, ma niente di ciò che ho visto fa effettivamente al mio caso.
    Ho preso in parte il codice disponibile qui: thetruster altervista org importare dati da word a excel

    Ho preso spunto dal codice presente in quella pagina per scrivere la mia prima macro, che immette in word un'immagine che il cui indirizzo è specificato in una data cella di excel:


     
        Sub Importa_immagine()
         
        'Dichiaro le variabili locali
        Dim ValoreCella As String
        Dim i As Integer
         
         
        'Creo la nuova applicazione
        Set xlapp = New Excel.Application
         
        'Attraverso la nuova applicazione apro il Workbook
        'assegnandolo alla variabile oggetto xlBook
        Set xlBook = xlapp.Workbooks.Open("C:Desktop
    ome_file.xlsm")
         
        'Decido quale foglio utilizzare
        Set xlSheet = xlBook.Worksheets("Foglio 1")
         
        ValoreCella = xlSheet.Cells(1, 2)
            Selection.InlineShapes.AddPicture FileName:= _
                ValoreCella, LinkToFile:=False, _
                SaveWithDocument:=True
        '    Application.Selection.TypeText ValoreCella
    
         
        'Chiudo il Workbook e l'Applicazione
        xlBook.Close
        xlapp.Quit
         
        'Annullo le variabili per liberare le risorse
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlapp = Nothing
    End sub



  • di talete79 data: 25/07/2016 23:11:53

    Io ho provato a costruire la macro da word. Vi riporto la parte di codice che ho scritto. Per risolvere la richiesta di PrimaFase e mia, occorre... "far capire a VBA" che deve copiare un range a caso (B6:F8 a titolo di esempio).
     
    Sub Importa_tabella()
     
    'Dichiaro le variabili locali
    Dim tabella As Table
    Dim i As Integer
     
     
    'Creo la nuova applicazione
    Set xlapp = New Excel.Application
     
    'Attraverso la nuova applicazione apro il Workbook
    'assegnandolo alla variabile oggetto xlBook
    Set xlBook = xlapp.Workbooks.Open("C:Desktop
    ome_file.xlsm")
     
    'Decido quale foglio utilizzare
    Set xlSheet = xlBook.Worksheets("Foglio 1")
     
    '  QUI MANCA LA PARTE DEL CODICE IN CUI SI CHIEDE DI COPIARE
    ' LA TABELLA DI RANGE, AD ESEMPIO (B6:F8)
       
    
        Selection.PasteExcelTable False, False, False
     
    'Chiudo il Workbook e l'Applicazione
    xlBook.Close
    xlapp.Quit
     
    'Annullo le variabili per liberare le risorse
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlapp = Nothing
     
    
    End Sub



  • di Vecchio Frac data: 26/07/2016 08:24:41

    Per "farlo capire a VBA" occorre scriverlo nel linguaggio comprensibile al compilatore :)
    Rovescia il ragionamento. Come lo faresti se fossi in Excel? parti da lì e hai risolto il problema.
    In Excel hai degli oggetti già pronti che in Word devi istanziare ma il concetto di base è che puoi sfruttare il modello ad oggetti di Excel anche in Word, una volta che hai preparato un riferimento a Excel.
    Nel codice che hai trovato, hai creato un oggetto Application (xlapp), un oggetto Workbook (xlBook), un oggetto Worksheet (xlSheet). Hai tutto quello che ti serve.
    Ti chiedo: se fossi in Excel, come faresti per inserire in memoria un range e copiarlo?
    Quando hai ricordato come lo faresti in Excel, riportalo in Word. E' facile, una sola riga di istruzione, col codice di esempio che hai postato che è già funzionante (piuttosto, studialo bene e vedi di capire cosa fa e come lo fa).





  • di patel data: 26/07/2016 08:57:40

    io non ho capito bene se vuoi copiare una tabella da Word a Excel o viceversa, un file di esempio sarebbe utile





  • di Vecchio Frac data: 26/07/2016 13:11:37

    Dal primo post (cit. "Devo formare una serie di tabelle in word da un unica tabella generale presente in un file excel") sembra che debba costruire della tabelle in Word pescandole da Excel, e per questo avevo suggerito l'uso della stampa unione.





  • di patel data: 26/07/2016 13:16:05

    ma ora è cambiato l'interlocutore





  • di Vecchio Frac data: 26/07/2016 13:24:40

    Hai ragione patel o.O





  • di talete79 data: 29/07/2016 01:16:24

    Salve.
    Per VecchioFrac: in effetti la mia intenzione era quella che dici tu. E ho tradotto questa mia intenzione creando una macro in Excel che copia l'intervallo di celle che mi occorre. Ho poi brutalmente fatto copia e incolla del pezzo di codice relativo all'interno del codice VBA in word che ho postato, ma mi da errore (domani vi dirò quale, non ho il file a disposizione ora).

    Per patel: stampa unione non mi va bene perchè in linea generale devo copiare più di una tabella e ciascuna di esse può non essere presente in alcuni casi. Domani posto un po' del codice che ho sviluppato. Perché praticamente sto sviluppando un offerta commerciale e devo trasferire i dati da excel a word. Il cliente in ciascun file è unico (ad un'altra offerta creerò un nuovo file), mentre delle 7 tabelle che in teoria possono essere richieste nel file word, solo una è senz'altro presente, mentre le altre dipendono dal contesto (che non sto a spiegarvi).

    Sto riuscendo abbastanza agevolmente nel mio intento perché so come richiamare da excel in Word:
    - testo
    - immagini
    Non so come richiamare le tabelle :( , fatto ciò me la sbrigo agevolmente.
    Grazie della vostra attenzione



  • di patel data: 29/07/2016 08:06:46

    io non ho parlato di stampa unione, la mia domanda era questa

    io non ho capito bene se vuoi copiare una tabella da Word a Excel o viceversa, un file di esempio sarebbe utile





  • di Vecchio Frac data: 29/07/2016 08:30:51

    Ero io che parlavo di stampa unione, non patel, ma ho ben capito il tuo problema e ti ho già indirizzato verso la soluzione.
    Rileggi bene il mio post precedente.
    Il codice che hai mostrato è funzionante e ti basta una sola riga di istruzione per completare l'operazione che desideri.

    @patel
    E' già chiaro che vuole copiare una tabella da Excel a Word. L'esempio di codice che ha già funziona bene ma gli manca un'inezia... basta ricordarsi che sta lavorando da Word e non da Excel :)





  • di patel data: 29/07/2016 10:31:19

    Hai ragione VF, comunque sul 2010 l'struzione Set xlapp = New Excel.Application dà errore, occorre modificarla con
    Set xlApp = CreateObject("Excel.Application")
    per il resto basta aggiungere una riga che copia il range, quella dell'incolla è già presente






  • di Vecchio Frac data: 29/07/2016 11:12:35

    Non è un errore di Excel 2010, è solo il fatto che non hai referenziato la libreria di Word tra i Riferimenti.
    Questo è l'early binding di cui ogni tanto parliamo.
    Io uso quasi sempre la tecnica del late binding, cioè di passare da CreateObject ma la prima è comodissima perchè quando digiti il punto dopo un oggetto, l'Intellisense ti mostra subito metodi e proprietà di quell'oggetto.





  • di Vecchio Frac data: 29/07/2016 11:13:33

    Errata corrige.
    cit. mia "non hai referenziato la libreria di Word"
    ---> E' chiaro che intendevo dire "non hai referenziato la libreria di Excel"





  • di patel data: 29/07/2016 11:55:38

    avevo capito, grazie





  • di talete79 data: 30/07/2016 01:14:56

    Ho referenziato la libreria di Excel sin dall inizio, come indicato da quella pagine (thetruster).

    il codice che ho inserito è riportato di sotto


    purtroppo però non gira., produce errore 4065, dice che non c'è testo da copiare
     
        Range("A2:D6").Select
        Range("C6").Activate
        Selection.Copy



  • di patel data: 30/07/2016 08:11:01

    mi sembra che tu vada un po' a caso, cosa c'entra Range("C6").Activate ? inoltre perché hai definito xlSheet per poi non usarlo ?
     
    Set xlSheet = xlBook.Worksheets(1)
    xlSheet.Range("A2:D6").Copy
    Selection.PasteExcelTable False, False, False
    xlBook.Close
    






  • di talete79 data: 30/07/2016 14:43:05

    innazitutto grazier per l'aiuto.
    ho incollato quanto prodotto dalla macro di excel.
    MI ponevo in effetti la domanda: come fa a VBA a capire che deve andare a "pescare" da Excel e non da Word?
    Pensavo che avendo inizializzato l'appilicazione, il file ed il foglio, bastasse questo, invece no: lui "pesca" di default da word e giustamente non trovava niente.

    LA macro va una bellezza "SE" cancello il tutto dopo l'incolla. Perchè altrimenti blocca le risorse. Una volta chiuso Excel con le maniere forti (ossia da Gestione applicazioni) mi compare la tabella. Al momento non so se sia il caso di chiudere l'app, visto che in virtù dell'utilizzo che intendo farne, Excel andrebbe aperto e chiuso innumerevoli volte.
    Comunque, ripeto... ora posso copiare dati da excel come testo, tabelle e immagini; ho in pratica le 3 "parole" necessarie per il "discorso" che ho in mente. Ho anche elaborato un select case per comandare la formattazione da excel a ogni riga di testo (vedi codice sottostante).

    Praticamente non ho alibi: mi tocca elaborare il discorso.
     
    Sub Importa_cella_come_testo()
     
    'Dichiaro le variabili locali
    Dim ValoreCella As String
    Dim Stile As Integer
    Dim i As Integer
     
     
    'Creo la nuova applicazione
    Set xlapp = New Excel.Application
     
    'Attraverso la nuova applicazione apro il Workbook
    'assegnandolo alla variabile oggetto xlBook
    Set xlBook = xlapp.Workbooks.Open("C:percorso
    omefile.xlsm")
     
    'Decido quale foglio utilizzare
    Set xlSheet = xlBook.Worksheets("nomefoglio")
     
    'prendo i valori passandoli sul documento Word da b2 a b33, a seconda dei valori da c2 a c33
     For i = 8 To 33
        ValoreCella = xlSheet.Cells(i, 2).Value
        Stile = xlSheet.Cells(i, 3).Value
        
        Select Case Stile
        Case 1
        Call Inserisci_testo_stile1_normale
        Case 2
        Call Inserisci_testo_stile2_gentile_signore
        Case 3
        Call Inserisci_testo_stile3_paragrafo
        End Select
        
        Application.Selection.TypeText ValoreCella & vbCrLf
    Next i
     
    'Chiudo il Workbook e l'Applicazione
    xlBook.Close
    xlapp.Quit
     
    'Annullo le variabili per liberare le risorse
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlapp = Nothing
     
    End Sub
    
    Sub Inserisci_testo_stile1_normale()
    '
    ' Inserisci_testo_1_normale Macro
    '
    '
        Selection.Style = ActiveDocument.Styles("Stile1-normale")
    'va creato uno stile che si chiama "Stile1-normale" in word, poi uno stile 2, poi uno stile 3...
    End Sub
    



  • di talete79 data: 30/07/2016 15:09:13

    aggiungo... il motivo per cui si blocca la macro chiedendogli di chiudere il file è dovuto al fatto che mi chiede di salvare il file, cosa che non vedo immediatamente perchè... come dire, excel è aperto ma non mi compare (nemmeno in background).



  • di Vecchio Frac data: 01/08/2016 11:26:22

    cit. " lui "pesca" di default da word e giustamente non trovava niente. "
    ---> LOL, detto in modo un po' grezzo ma sì, è così. Piano piano ci siamo arrivati :)

    cit. "Perchè altrimenti blocca le risorse. Una volta chiuso Excel con le maniere forti (ossia da Gestione applicazioni)"
    ---> Dunque, non capisco bene il perchè. Non trovo più il mio file su cui avevo fatto prove ma andava via bene senza chiusure forzate.

    Mmmmh... hai chiuso anche il foglio prima del Workbook? Ricordati, va fatta ogni operazione a mano, non puoi pretendere che sia Word a farlo.
    'Chiudo il Workbook e l'Applicazione
    
    xlSheet.Close False
    xlBook.Close
    xlapp.Quit


    Vedo inutili le sub "inserisci_testo_stile_*", puoi impostare lo stile desiderato direttamente nel select case:
    Select Case Stile
    
    Case 1: Selection.Style = ActiveDocument.Styles("Stile1-normale")
    Case 2: Selection.Style = ActiveDocument.Styles("Stile2-gentile signore")
    Case 3: Selection.Style = ActiveDocument.Styles("Stile3-paragrafo")
    End Select


    cit. "Praticamente non ho alibi: mi tocca elaborare il discorso."
    ---> non ho capito :)