Questo articolo è la continuazione del post precedente Word VBA: popolare una tabella con dati presi da un foglio Excel (Parte 1). Eravamo arrivati al punto di definire due variabili booleane utili per segnalare eventuali errori nel caso in cui la tabella Word o le informazioni su Excel non fossero disponibili, per cui ripartiamo da qui.
Una volta identificata la tabella su Word, ci spostiamo su Excel e scorriamo tutte le celle della prima colonna fino a quando non troviamo una riga vuota. Il valore di ogni cella lo confrontiamo con la variabile “primaCella” che contiene il valore della prima cella della tabella Word per cui dobbiamo cercare i dati.
Aggiungiamo questa parte di codice alla macro:
Public Sub PopolaTabellaDaExcel() ' ' PopolaTabellaDaExcel Macro ' ' Dim myexl As Object Dim myws As Object Dim myworkbook As Object Dim path_file_excel As String path_file_excel = "C:\Users\davis.molinari\Desktop\EsempioVBA\SorgenteDatiTabella.xlsx" If Dir(path_file_excel) = "" Then descrizione = "Errore: Impossibile trovare file excel di input " & path_file_excel Call MsgBox(descrizione, vbExclamation) Exit Sub End If Set myexl = CreateObject("Excel.Application") Set myworkbook = myexl.Workbooks.Open(path_file_excel) Set myws = myexl.Worksheets(1) Dim tbl As Table Dim s As String Dim primaCella As String primaCella = "Codice Articolo" Dim trovataWord As Boolean Dim trovataExcel As Boolean trovataWord = False trovataExcel = False r = 1 For Each tbl In ActiveDocument.Tables s = tbl.Rows(1).Cells(1).Range.Text If InStr(1, s, primaCella) Then trovataWord = True Debug.Print "Trovata tabella " & primaCella & " in Word" v = myws.Cells(r, 1).Value While v <> "" If v = primaCella Then trovataExcel = True Debug.Print "Trovati dati per la tabella " & primaCella & " su Excel" 'Qua dobbiamo copiare i dati da Excel a Word' End If r = r + 1 v = myws.Cells(r, 1).Value Wend End If Next tbl If trovataWord = False Then descrizione = "Errore: nel file Word " & path_file_excel & _ " non è stata la trovata la tabella che inizia con '" & primaCella & "'" Call MsgBox(descrizione, vbInformation, "Attenzione") Else If trovataExcel = False Then descrizione = "Errore: nel file excel " & path_file_excel & _ "non sono stati trovati i dati per la tabella '" & primaCella & "'" Call MsgBox(descrizione, vbInformation, "Attenzione") End If End If myworkbook.Close myexl.Quit Set myws = Nothing Set myworkbook = Nothing Set myexl = Nothing End Sub
Eseguendola otteniamo il risultato mostrato in figura:
In questo caso erano disponibili tutte le informazioni; esiste infatti sul nostro file Word una tabella la cui prima cella inizia con “Codice Articolo” e sono disponibili sul file Excel le relative informazioni con cui popolarla, definite in una tabella che a sua volta inizia con la stessa stringa. Le due variabili boolean e il codice di gestione degli errori che abbiamo inserito ci permettono di comunicare all’utente un messaggio di errore nel caso in cui una delle due informazioni non sia disponibile.
Se, ad esempio, modifichiamo la prima colonna della tabella nel file Word in una stringa diversa da “Codice Articolo”
ed eseguiamo nuovamente la macro, otteniamo il seguente messaggio di errore:
Allo stesso modo, proviamo a rimettere il valore della prima cella della tabella su Word uguale a “Codice Articolo”, ma modifichiamo il valore della cella sul file Excel, simulando il fatto che non ci siano dati utili da esportare, come illustrato nella figura seguente.
Eseguendo la macro otteniamo un altro messaggio di errore, diverso, che ci segnala il nuovo problema:
A questo punto ci resta più solo da scrivere il codice che, una volta identificato il punto in cui iniziano i dati su Excel, li inserisce sulla tabella Word. Per farlo scorriamo le celle a partire dalla riga successiva a quella di intestazione, scorrendo le colonne verso destra fino a quando non troviamo la prima cella vuota.
Per aggiungere i valori letti all’oggetto tabella sul file Word, utilizziamo il codice seguente:
Do While myws.Cells(r, c).Text <> "" tbl.Rows.Add Set newRow = tbl.Rows(tbl.Rows.Count) Do While myws.Cells(r, c).Text <> "" cellValue = myws.Cells(r, c).Text newRow.Cells(c).Range.Text = cellValue c = c + 1 Loop r = r + 1 c = 1 Loop
Il codice finale della nostra macro diventa quindi il seguente:
Public Sub PopolaTabellaDaExcel() ' ' PopolaTabellaDaExcel Macro ' ' Dim myexl As Object Dim myws As Object Dim myworkbook As Object Dim path_file_excel As String path_file_excel = "C:\Users\davis.molinari\Desktop\EsempioVBA\SorgenteDatiTabella.xlsx" If Dir(path_file_excel) = "" Then descrizione = "Errore: Impossibile trovare file excel di input " & path_file_excel Call MsgBox(descrizione, vbExclamation) Exit Sub End If Set myexl = CreateObject("Excel.Application") Set myworkbook = myexl.Workbooks.Open(path_file_excel) Set myws = myexl.Worksheets(1) Dim tbl As Table Dim s As String Dim primaCella As String primaCella = "Codice Articolo" Dim trovataWord As Boolean Dim trovataExcel As Boolean trovataWord = False trovataExcel = False r = 1 For Each tbl In ActiveDocument.Tables s = tbl.Rows(1).Cells(1).Range.Text If InStr(1, s, primaCella) Then trovataWord = True v = myws.Cells(r, 1).Value While v <> "" If v = primaCella Then trovataExcel = True r = r + 1 c = 1 Do While myws.Cells(r, c).Text <> "" tbl.Rows.Add Set newRow = tbl.Rows(tbl.Rows.Count) Do While myws.Cells(r, c).Text <> "" cellValue = myws.Cells(r, c).Text newRow.Cells(c).Range.Text = cellValue c = c + 1 Loop r = r + 1 c = 1 Loop End If r = r + 1 v = myws.Cells(r, 1).Value Wend End If Next tbl If trovataWord = False Then descrizione = "Errore: nel file Word " & path_file_excel & _ " non è stata la trovata la tabella che inizia con '" & primaCella & "'" Call MsgBox(descrizione, vbInformation, "Attenzione") Else If trovataExcel = False Then descrizione = "Errore: nel file excel " & path_file_excel & _ " non sono stati trovati i dati per la tabella '" & primaCella & "'" Call MsgBox(descrizione, vbInformation, "Attenzione") End If End If myworkbook.Close myexl.Quit Set myws = Nothing Set myworkbook = Nothing Set myexl = Nothing End Sub
Eseguendola possiamo vedere come la nostra tabella sul file Word venga correttamente popolata con i dati presenti sul file Excel.