In alternativa al copia ed incolla che di solito si usa per trasportare una tabella Excel in un foglio HTML presento questa soluzione che ho interpretato sulla falsariga di una risposta fornita da "ildragoncello" presente in internet.
Con la procedura da me modificata si crea o aggiorna una pagina HTML con dati provenienti da un foglio di Excel.
ATTENZIONE:
Questa pagina (la pagina di origine) non sarà quella che andremo a postare nel sito o che comunque vorremo utilizzare, ma quella che useremo per creare la pagina vera e propria. La pagina da postare nel sito, o che, comunque, dovremo usare alla fine, sarà quella generata da questa procedura ed in questa circostanza verrà chiamata tabella.html.
Per vedere il codice HTML della pagina pagina_base.html eseguite clic destro del mouse sulla pagina e dal menù di scelta rapida scegliete, a seconda del browser che usate, "Visualizza pagina sorgente" (FF) oppure "HTML" (IE) oppure "Sorgenti" (Opera) oppure "View source" (Safari).
A questo punto possiamo dedicarci al codice VBA.
Compiute le operazioni preliminari, possiamo dedicarci al codice VBA (ALT + F11 per andare in VBA)
Il lavoro che ci aspettiamo da questo codice si può sintetizzare in queste azioni.
Passiamo ora ad esaminare il codice da usare.
per aprire i due canali di comunicazione coi due files, il file di origine per la lettura, il file di destinazione per la scrittura:
per leggere dal file di origine uso:
mentre per scrivere nel file di destinazione eseguo il comando:
Ma prima di compiere questa operazione debbo eseguire un controllo.
Se in DataLine è memorizzata la stringa "<!---- Crea prima tabella --->" oppure <!---- Crea seconda tabella ---> o altre di questo genere piazzate come segnaposti nel file di origine, mi sposto sul foglio di Excel e comincio a leggere la tabella interessata ed a copiarla nel file di destinazione creandoci una tabella per ospitarvi i dati.
Questa operazione la vedremo nel listato completo.
Se in VBA ancora non esiste, inseriamo un modulo standard (clic destro nella finestra Progetto - VBAProject e scegliamo dal menù a tendina la voce: Inserisci ---> Modulo).
Nel modulo standard del VBA scriviamo queste due routines:
Sub RiscriviTabella()
Dim MiaCartella, PaginaBase, FileOut, Html_path
Dim FileNum1 As Integer, FileNum2 As Integer
Dim DataLine
Dim Intervallo As Range
' la cartella dove sto lavorando
MiaCartella = ActiveWorkbook.Path
' la cartella delle pagine HTML
Html_path = MiaCartella & "\html\"
' questa è la pagina di origine
PaginaBase = "pagina_base.html"
' questa è la pagina di destinazione
FileOut = "tabella.html"
' cerco il primo canale libero per comunicare con la pagina di origine
FileNum1 = FreeFile
' apro in lettura la pagina di origine
Open Html_path & PaginaBase For Input As FileNum1
' cerco il secondo canale di comunicazione con la pagina di destinazione
FileNum2 = FreeFile
' apro in scrittura la pagina di destinazione
Open Html_path & FileOut For Output As FileNum2
' inizio la lettura del file di origine
Do While Not EOF(FileNum1)
Line Input #FileNum1, DataLine
' qui si decide se copiare quel che è stato letto dalla pagina di origine
' o se copiare la tabella di Excel
Select Case DataLine
Case "<!---- Crea prima tabella --->"
Set Intervallo = Worksheets("Foglio2").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case "<!---- Crea seconda tabella --->"
Set Intervallo = Worksheets("Foglio1").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case "<!---- Crea terza tabella --->"
Set Intervallo = Worksheets("Foglio3").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case Else
Print #FileNum2, DataLine
End Select
Loop
' qui finisce il lavoro
Close (FileNum1)
Close (FileNum2)
FreeFile (FileNum1)
FreeFile (FileNum2)
If Err = 0 Then MsgBox "La Tabella è aggiornata ! ", vbInformation, "Tabella"
End Sub
' Questa Private Sub esegue la stampa delle tabelle se richiamata dalla routine sovrastante
' Per ogni tabella da stampare nella pagina di destinazione vengono passati, come argomenti,
' il nome della tabella ed il numero del canale di comunicazione col file di destinazione
Private Sub StampaTabella(Tabella As Range, Canale As Integer)
' si giunge a questa routine ogni volta occorra stampare la tabella
Dim MaxRighe, MaxColonne, Riga, Col, Valore
With Tabella
MaxRighe = .Rows.Count
MaxColonne = .Columns.Count
Print #Canale, "<table align=""center"" width=""90%"" border=""1"" cellspacing=""0"" cellpadding=""0"">"
For Riga = 1 To MaxRighe
Print #Canale, "<tr>";
For Col = 1 To MaxColonne
Print #Canale, "<td>";
Valore = .Cells(Riga, Col).Text
If Valore <> "" Then
Print #Canale, Valore;
Else
Print #Canale, " ";
End If
Print #Canale, "</td>"
Next
Print #Canale, "</tr>"
Next
Print #Canale, "</table>"
End With
End Sub
Perchè due routines? Semplicemente per risparmiare codice.
Ogni volta incontriamo la stringa <!---- Crea xxx tabella ---> dobbiamo spostarci sul figlio di Excel e copiare il contenuto delle celle nella pagina HTML. Le istruzioni sono molte e, se dovessimo ripeterle per ogni tabella che dobbiamo copiare, le dovremmo replicare ogni volta nella routine principale. In questo modo, invece, ogni volta che dobbiamo copiare una tabella è sufficiente recarci alla Private Sub StampaTabella(Tabella As Range, Canale As Integer) portando come argomenti il nome della tabella ed il numero del canale per scrivere nella pagina HTML, come si vede in questo frammento di codice:
Case "<!---- Crea prima tabella --->"
Set Intervallo = Worksheets("Foglio2").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Una nota sul metodo usato con Istruzione Print #
In tutta la serie di istruzioni Print # usata nella Private Sub StampaTabella(Tabella As Range, Canale As Integer) noterete che alcune finiscono col ; (punto e virgola) altre senza alcuna punteggiatura.
Questo perchè l'istruzione Print # segue queste regole:
Quindi, quando vogliamo che il testo da scrivere successivamente vada a capo, viene omessa la punteggiatura alla fine dell'istruzione, e quando vogliamo che il testo da scrivere successivamente rimanga sulla stessa riga, useremo la virgola o il punto e virgola a seconda dei casi.
Qui di seguito potrete scaricare il file usato per questo tutorial
(dimensione file 29 KB)