Word VBA: popolare una tabella con dati presi da un foglio Excel (Parte 2)

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:

Word VBA - Controlla esistenza tabelle

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”

Word VBA - Prima cella modificata per non corrispondere

ed eseguiamo nuovamente la macro, otteniamo il seguente messaggio di errore:

Word VBA - Errore Tabella non esistente in Word

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.

Word Excel VBA - modificata cella Excel

Eseguendo la macro otteniamo un altro messaggio di errore, diverso, che ci segnala il nuovo problema:

Word VBA - valori su excel non disponibili

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.

Word VBA  risultato finale tabella popolata con dati Excel

Leave a Reply

Your email address will not be published. Required fields are marked *