Sviluppare funzionalita su Microsoft Office con VBA Interazione Excel / Word con VBA

Login Registrati
Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
  • Autore
    Articoli
  • #36177 Score: 0 | Risposta

    PMC77
    Partecipante
      18 pts

      Buongiorno a tutti!

      Mentre sulle macro di Excel qualcosa ne capsico, su quelle di Word ho davvero dei dubbi....

      Ma vado per gradi...

      Come posso fare per scorrere una tabella di N colonne e Y righe su un foglio word per poter spostare i dati in un determinato modo su un foglio excel?

      Grazie a chi si è già cimentato!

      Paolo

      #36183 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        Quanto a complessità, si tratta sempre di VBA quindi non avrai problemi.
        Quanto al modello ad oggetti, è leggermente differente (chiaramente) perché in Word non ci sono Selection nè ActiveCell però ci sono Documents, Tables con Cell e Range (dal significato simile ma leggermente diverso).
        Tuttavia il modo di ragionare è analogo perciò devi solo prendere confidenza con Word pasticciando come faresti con Excel: avvia un registratore di macro e studia il risultato. Sai già che dovrai depurarlo delle schifezze ma è un buon punto di partenza 🙂
        Prova questo e vedi cosa ottieni (nota: devi avere almeno la tabella 1 e che sia vuota sul documento di prova)

        Option Explicit
        
        Sub test()
        Dim col As Column
        Dim ce As Cell
            For Each col In ActiveDocument.Tables(1).Columns
                For Each ce In col.Cells
                    ce.Range.Text = ce.Row.Index & ", " & ce.Column.Index
                Next
            Next
        End Sub
        
                

         

        #36188 Score: 0 | Risposta

        patel
        Moderatore
          51 pts

          prova così

          Sub CopiaTabellaSuExcel()
          
          Dim oXL As Object, wkb As Object, wks As Object
          Dim tbl As Table
          Set doc = ActiveDocument
          Set oXL = CreateObject("Excel.Application")
          oXL.Visible = True
          Set wkb = oXL.Workbooks.Add
          Set wks = wkb.Worksheets(1)
          For Each col In doc.Tables(1).Columns
             For Each ce In col.Cells
                wks.Cells(ce.Row.Index, ce.Column.Index) = Left(ce.Range.Text, Len(ce.Range.Text) - 1)
             Next
          Next
          End Sub
          #36189 Score: 0 | Risposta

          PMC77
          Partecipante
            18 pts

            Grazie mille ad entrambi!

            Avevo iniziato con il registratore di macro di Word, ma come dice VF era pieno di schifezze "inutili"!

            Adesso vado avanti!

            Buona giornata!

            Paolo

            #36190 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              Fra i tre, Word, Access e Excel, Word è il più ostico da manipolare, ci litigo da un sacco di anni quindi... chiedi pure 🙂

              #36239 Score: 0 | Risposta

              PMC77
              Partecipante
                18 pts

                Ciao @vecchio_frac

                Premesso che la macro la farei su file di escel, quali sono le istruzioni per ciclare sulle righe della tabella contenuta in word e accedere cella per cella di ogni riga?

                Non devo copiare la tabella secca da W a E, ma solo alcuni dati e spostarli in alcune specifiche celle se soddisfano alcuni requisiti...

                Oppure copio tutto e poi smanetto su Macro Excel?

                Ciao e grazie

                Paolo

                #36242 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  PMC77 ha scritto:

                  ma solo alcuni dati

                  Ecco avevo intuito che fosso così e infatti il mio spunto partiva dal concetto di Cell in una Table, identificata da una certa Row e Column (il testo della cella, poiché non è intuitivo, si recupera con Cell(x, y).Range.Text).

                  Visto che lavori da Excel devi istanziare un oggetto Word.Application (io lo farei con CreateObject ma se c'è già un'istanza di Word in memoria devi usare GetObject... assicurati di chiudere tutti i Word e usa CreateObject).

                  PMC77 ha scritto:

                  quali sono le istruzioni per ciclare sulle righe della tabella

                  Il mio esempio era simile alla tua richiesta. Questo lo scheletro di vbase:

                  'pseudocodice
                  
                  'sono in excel e creo un riferimento a word
                  set wdapp = createobejct("word.application")
                  set wddoc = wdapp.documents.open("path\nomefile.docx", visible:=false)
                  
                  'scorro le righe della tabella
                  for each rw in wddoc.tables.rows
                      'scorro ogni cella di ogni riga
                      for each ce in rw.cells
                          'se soddisfano una condizione, copio la cella in excel
                          if lcase(ce.range.text) = "pippo" then activesheet.range("a1") = ce
                      next
                  next
                  
                  'chiudo word senza salvare e anniento gli oggetti, importantissimo!
                  wddoc.close false
                  wdapp.quit
                  set wddoc=nothingùset wdapp = nothing
                          

                  C'è da stare attenti che ce.range.text non restituisce nu testo pulito, c'è il terminatore di cella. Ti serve quindi anche una piccola macro che ripulisce il testo, io uso questa  mia (vabbè c'è anche un remove_chars forse superfluo, ti lascio studiartele 🙂 ):

                  Public Function clean_up(t As String) As String
                  ' ripulisce per benino la stringa in argomento
                  ' elimina tutti i caratteri non ASCII standard
                  ' ma mantiene le vocali accentate italiane,
                  ' minuscole e maiuscole
                  Dim m As String
                  Dim i As Long
                      
                      For i = 1 To Len(t)
                          m = Mid$(t, i, 1)
                          Select Case Asc(m)
                          Case 32 To 126, 146, 192, 200, 201, 204, 210, 217, 224, 232, 233, 236, 242, 249
                              'do nothing
                              'per i caratteri di cui sopra, lascia inalterato il carattere trovato
                          Case Else
                              t = Replace(t, m, " ")  'altrimenti sostituisce con space
                          End Select
                      Next
                      
                      'riduce gli spazi in eccesso lasciandone uno solo
                      clean_up = remove_chars(t, " ")
                  End Function
                  
                  
                  
                  Public Function remove_chars(ByVal source As String, char As String, Optional removeall As Boolean = False) As String
                  ' rimuove i caratteri indicati da source
                  ' in ogni caso è operato un Trim() globale
                  ' di default (true) toglie tutti, se false invece li riduce a uno solo
                  ' esempi:
                  ' s = remove_chars("Hell   o     wo    rld   ", " ", False) -> "Hell o wo rld"
                  ' s = remove_chars("Hell   o     wo    rld   ", " ", True) -> "Helloworld"
                  Dim s As String
                  Dim re As Object
                      s = Trim(source)
                      
                      Select Case removeall
                      Case True
                      Dim i As Integer
                          i = InStr(s, char)
                          Do
                              s = Replace(s, char, "")
                              i = InStr(s, char)
                          Loop Until i = 0
                          remove_chars = s
                      
                      Case False
                          Set re = CreateObject("vbscript.regexp")
                          re.Global = True
                          re.Pattern = char & "{2,}"
                          remove_chars = Trim(re.Replace(s, char))
                          Set re = Nothing
                      End Select
                  End Function
                  
                  #36243 Score: 0 | Risposta

                  PMC77
                  Partecipante
                    18 pts

                    Grazie mille, @vecchio_frac

                    Ti farò sapere come procedo!

                    Buona giornata

                    Paolo

                  Login Registrati
                  Stai vedendo 8 articoli - dal 1 a 8 (di 8 totali)
                  Rispondi a: Interazione Excel / Word con VBA
                  Gli allegati sono permessi solo ad utenti REGISTRATI
                  Le tue informazioni: