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...).