Per farla ancora piu' semplice, questa versione di macro importa le tabelle presenti su Word su Foglio2 compilando anche le righe delle celle unite.
- Codice: Seleziona tutto
Sub worTables()
Dim OBJWord As Object, OBJDoc As Object
Dim myFIle As String, expSh As Worksheet, LastR As Long, I As Long, J As Long
Dim nwTAB0 As Range, olInd As Long
'
myFIle = "C:\PERCORSO\NomeFile.doc" '<<< Il file Word da leggere
Set expSh = ThisWorkbook.Sheets("Foglio2") '<<< Il foglio di questo file dove importare
'
'Set OBJWord = New Word.Application 'EARLY BINDING
Set OBJWord = CreateObject("Word.Application") 'LATE BINDING
'
OBJWord.Visible = True
Set OBJDoc = OBJWord.Documents.Open(Filename:=myFIle)
For J = 1 To OBJDoc.Tables.Count 'Scan delle Tables
On Error Resume Next 'Cerca riga libera
LastR = expSh.Range("A1:O10000").Find(What:="*", After:=expSh.Range("A1"), _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
On Error GoTo 0
With OBJDoc.Tables(J)
Set nwTAB0 = Cells(LastR + 2, 1)
nwTAB0.Offset(1, 0).Value = "Wd_Table_#" & J
For I = 1 To .Columns.Count
olInd = 0
For Each aCell In .Columns(I).Cells
If aCell.RowIndex > (olInd + 1) And olInd > 0 Then 'Compila righe vuote
nwTAB0.Offset(olInd + 1, I).Resize(aCell.RowIndex - olInd - 1).Value = nwTAB0.Offset(olInd, I).Value
End If
nwTAB0.Offset(aCell.RowIndex, I).Value = Application.WorksheetFunction.Clean(.Cell(aCell.RowIndex, I).Range.Text)
olInd = aCell.RowIndex
Next aCell
If .Rows.Count > (olInd) And olInd > 0 Then 'Compila righe vuote
nwTAB0.Offset(olInd + 1, I).Resize(.Rows.Count - olInd).Value = nwTAB0.Offset(olInd, I).Value
End If
Next I
End With
Next J
'Completato:
OBJDoc.Close False
OBJWord.Quit
Set OBJWord = Nothing
End Sub
Le righe marcate <<< vanno compilate come da commento
A questo punto e' relativamente semplice confrontare le descrizioni rispetto al Codice (usare Cerca.Vert per estrarre la descrizione dalla seconda tabelle e confrontarla con la descrizione corrente); oppure codici presenti in una tabella ma non nell'altra (sempre Cerca.Vert; se risponde #N/D! vuol dire che il codice manca).
Per semplificare ulteriormente queste operazioni, a ogni tabella importata viene assegnato un "Nome" che e' quello segnato in colonna A accanto alla tabella, ed e' costituita da "Wd_Table_" + il numero di riga. Questo nome e' utilizzabile nelle formule al posto dell'intervallo della tabella; ad esempio posso scrivere
- Codice: Seleziona tutto
=Cerca.Vert(CodiceProdotto;Wd_Table_3;2;0)
la formula restituira' la seconda colonna della tabella importata (se posizionata su Riga3)
Prova e vedi dove riesci ad arrivare; se ti areni ("se ti areni", non
se non provi!) sai che siamo qui.
Ciao