› Sviluppare funzionalita su Microsoft Office con VBA › Interazione Excel / Word con VBA
-
AutoreArticoli
-
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
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 Subprova 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 SubGrazie 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
Fra i tre, Word, Access e Excel, Word è il più ostico da manipolare, ci litigo da un sacco di anni quindi... chiedi pure 🙂
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
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).
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 = nothingC'è 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 -
AutoreArticoli
