Une macro VBA qui recopie tous les onglets d'un classeur en HTML

(Internet Explorer seulement)
On peut facilement transformer un tableau Excel en page html (soit directement par "Fichier / Enregistrer au format HTML", soit en VBA); on peut aussi transformer une page graphique ou un tableau Excel en image (gif ou jpg).
La macro VBA décrite ici permet de présenter d'une manière plus agréable sur une page Web toutes les feuilles d'un classeur Excel en conservant le principe des onglets et en laissant visibles les formules Excel.

La macro utilise de multiples éléments qu'il est intéressant de décomposer :

- Il faut d'abord choisir le classeur Excel à recopier en HTML.
Donc lister les classeurs ouverts en les balayant par une boucle For each fichier In Workbooks et ajouter le nom de chacun dans une listbox (préalablement insérée dans un userform) par ListBox1.AddItem (fichier.Name).
En prenant soin de ne pas inclure le fichier contenant la macro et d'ajouter une entrée vers les fichiers non ouverts, cela donne :
For Each fichier In Workbooks
If fichier.FullName <> ThisWorkbook.FullName Then ListBox1.AddItem (fichier.Name)
Next fichier
ListBox1.AddItem ("classeur non ouvert")

La liste se présente comme suit :   
La valeur sélectionnée est récupérée, après interception de l'évenement ListBox1_MouseUp ou ListBox1_Click par quelque chose comme :
If ListBox1.Text <> "classeur non ouvert" Then Windows(ListBox1.Text).Activate

Si le classeur n'est pas ouvert, il faut proposer son ouverture en utilisant Application.Dialogs(xlDialogOpen) (qui présente la boîte de dialogue "ouvrir" puis ouvre le fichier sélectionné), ou mieux Application.GetOpenFilename qui présente la même boîte de dialogue mais laisse à la macro le soin d'ouvrir (ou de ne pas ouvrir).
nomf = Application.GetOpenFilename va ouvrir la boîte de dialogue puis renvoyer dans la variable nomf le nom complet (avec chemin d'accès) du fichier sélectionné (ou bien False si l'utilisateur n'a rien sélectionné).

- Il faut ensuite créer une (ou plutôt des) page(s) html, c'est à dire des fichiers textes enregistrés avec l'extension .html :
Open "c:\rep\index.html" For Output As #2 va créer un fichier texte nommé index.html avec le numéro 2, dans le répertoire c:\rep.
Pour écrire dans ce fichier, on utilise print :
Print #2, "<HTML><BODY>" va inscrire les entêtes HTML dans le fichier.
(une fois toutes les données inscrites dans le fichier, ne pas oublier de le refermer par Close #2).
Une combinaison de plusieurs pages html générées par cette technique permet de créer une page Web avec des frames et du javascript pour simuler la structure avec onglets du classeur Excel.

- Pour les pages Excel contenant des tableaux, il faut d'abord déterminer la plage utile.
On peut utiliser UsedRange, mais on risque de prendre en compte une plage trop grande si la zone utile contient des cellules vides mais avec un format particulier.
Il est préférable de rechercher la dernière ligne et la dernière colonne non vides.
L'utilisation de Find pour rechercher le premier caractère (représenté par le caractère joker "*") à partir de la fin (recherche par ligne et par colonne) permet de parfaitement cerner la zone qui nous intéresse :
derlin = feuil.Cells.Find("*", , , , , xlPrevious).Row
dercol = feuil.Cells.Find("*", , , , xlByColumns, xlPrevious).Column

(feuil est le nom de l'objet page Excel, provenant par exemple d'une boucle parcourant toutes les pages : For each feuil in ActiveWorkbook.Worksheets).
Il suffit alors de balayer les cellules de chaque ligne et d'inscrire dans la page html devant recevoir le tableau (la page #1 dans notre exemple) leur valeur entre les balises adéquates :
Print #1, "<BR><TABLE>" For lin = 1 To derlin
Print #1, "<TR>" For col = 1 To dercol
Print #1, "<TD>" & feuil.Cells(lin, col).Text & "</TD>"
Next col
Print #1, "</TR>"
Next lin
Print #1, "</TABLE>"

Le code ci-dessus se contente de recopier dans la table html le texte de chaque cellule de la plage utile. Dans la macro proposée en téléchargement; le texte des formules est également enregistré (pour restitution par JavaScript lors du survol des cellules HTML par la souris).
Il suffit pour cela d'inclure le code JavaScript dans la balise HTML :
Print #1, "<TD onmouseover=" & Chr(34) & "javascript:affiche('" & feuil.Cells(lin, col).FormulaLocal & "')" & Chr(34) & " onmouseout=" & Chr(34) & "javascript:affiche(' ')" & Chr(34) & ">" & feuil.Cells(lin, col).Text & "</TD>"

Ce qui donnera dans la page html :
<TD onmouseover="javascript:affiche('=4*50')" onmouseout="javascript:affiche(' ')">200</TD>

La fonction affiche() est bien entendu la fonction JavaScript qui va permettre de rendre visibles les formules.

- Pour les pages graphiques, il suffit de les transformer en image par la fonction VBA Export en choisissant le bon format d'image :
ActiveWorkbook.Charts(feuil.Name).Export "c:\rep\" & feuil.Name & ".gif", "GIF"

La page graphique feuil est enregistrée au format gif dans le répertoire c:\rep.

- il suffit maintenant d'afficher la page Excel en utilisant FollowHyperlink et en prenant soin de l'afficher dans une nouvelle fenêtre :
ThisWorkbook.FollowHyperlink "c:\rep\index.html", , True


Un exemple est présenté ici (cliquez).
La macro "classeur_html.xls" à télécharger est très simple à utiliser :
A l'ouverture du fichier Excel, la macro propose de choisir un fichier (dans les fichiers ouverts ou non). Une fois le fichier choisi, la macro génére son image HTML qu'elle affiche à l'écran. (La macro à télécharger est sous forme de fichier zip de 19 ko).
Toutes les pages html constituant l'image html du classeur Excel sont placées dans un nouveau dossier qui peut être directement utilisé sur le Web.
(NB : la macro ne prend pas en compte les images ou graphiques insérés dans une feuille Excel, ni les cellules fusionnées, ni les couleurs de police ou de fond...).