On me demandait récemment comment ordonner les onglets sous Excel. Mon premier réflexe de chercher sur un moteur de recherche ordonner les onglets sous Excel. Je recopie ici le code trouver sur le site de Microsoft : Comment trier les onglets d'un classeur
Pour s'en servir, il suffit de recopier ce code dans l'éditeur VBA qui apparaît dès qu'on utilise la combinaison ALT+F11. Il faut le recopier dans la fenêtre associée à l'intitulé ThisWorkbook.
J'avais besoin de créer un tableau avec une ligne de couleur différente pour chaque jour de la semaine. J'ai d'abord essayé de me passer de programmation en VBA car je me suis dit que c'est le genre de choses que je pourrais trouver sans un menu quelconque. J'ai commencé à chercher dans les styles personnalisés, puis sur Internet mais j'ai finalement abandonné. Je suis passé au VBA et ça m'a pris une dizaine de minutes. J'ai utilisé la première ligne pour les couleurs que je souhaitais (j'ai fait ça très vite, ce n'est pas du meilleur goût) puis j'ai composé le tableau, une première colonne pour les dates, une seconde qui contient le jour de la semaine (obtenu par formule). C'est ce numéro qui indiquera la couleur.
Puis j'ai écrit la macro suivante :
Le programme que vous trouverez plus bas résoud les sudoku. Je ne suis pas sûr qu'il faille rappeler les régles de ce jeu mais comme elles sont simples :
Et le programme Excel que j'ai fait se présente sous la forme :
C'est un TD que je donnais à l'ENSAE il y a quelques années. Mais le VBA n'a pas trop changé depuis cette époque, tout du moins comparé à d'autres langages. L'équation différentielle stochastique de Black et Scholes apparaît souvent lorsqu'on parle de finance :
Avec :
Le code suivant convertit un tableau Excel au format HTML puis stocke le résultat dans le presse-papier (il suffit donc de faire CTRC+V pour le coller où on veut). La macro convertit la zone sélectionnée au format HTML. Voici ce qu'elle donne :
objectif | Python | VBA |
test | if / else | if .. Then / else / end if |
boucle | for .. in .. | for .. = .. to .. / next |
fonction | def | fonction / end function |
Le code de la fonction doit être copié/collé dans un module (ALT+F11 pour voir le code VBA associé à la feuille). Je n'ai pas implémenté beaucoup de styles mais la fonction est facilement modifiable.
' code à copier dans la feuille Excel Function ColorToHtml(ByVal value As String) As String Dim scolor As String scolor = Trim(Hex(value)) While Len(scolor) < 6 scolor = "0" + scolor Wend scolor = Mid(scolor, 3, 4) + Mid(scolor, 1, 2) ColorToHtml = "#" + scolor End Function Sub range_html_to_cliboard() Set rge = Selection Dim res, line, ce As String res = "<table>" + Chr(10) For i = 1 To rge.Rows.Count line = "<tr>" For j = 1 To rge.Columns.Count ce = "<td style=""" If rge(i, j).Interior.color Then ce = ce + "background-color:" + ColorToHtml(rge(i, j).Interior.color) + ";" End If If rge(i, j).Font.color Then ce = ce + "color:" + ColorToHtml(rge(i, j).Font.color) + ";" End If If rge(i, j).Font.Bold Then ce = ce + "font-weight:bold;" End If ce = ce + """>" ce = ce + rge(i, j).Text + "</td>" line = line + ce Next line = line + "</tr>" res = res + line + Chr(10) Next res = res + "</table>" + Chr(10) ClipBoard_SetData (res) End Sub
La fonction ne marche pas tel quel sur les tableaux créés avec des styles, ni même avec une liste filtrée. Pour cela, il faut copier la zone désirée puis faire deux collages spéciaux, le formatting et les valeurs, au même endroit. On sélectionne ensuite la zone collée puis on appelle la macro décrite ci-dessus.
On cherche à compter le nombre de cellules d'une couleur spécifique sous Excel dans une plage de données. On peut considérer l'exemple suivant qui fait apparaître un rectangle contenant des cases de couleurs différentes. La première ligne contient toutes les couleurs une seule fois, la seconde ligne contient le nombre de cellules dans le rectangle de la même couleur que la case du dessus.
On veut pouvoir écrire une formule du type :
=NbColorSameAs($B$6:$D$11;B1)Il n'est pas possible de s'en sortir sans programmer soit même cette fonction. Pour cela, il faut :
Function NbColor(ByRef Plage As Range, Couleur As Byte) As Long Dim c As Range Dim nb As Long nb = 0 For Each c In Plage If c.Interior.ColorIndex = Couleur Then nb = nb + 1 End If Next c NbColor = nb End Function Function NbColorSameAs(ByRef Plage As Range, ByRef Cellule As Range) As Long NbColorSameAs = NbColor(Plage, Cellule.Interior.ColorIndex) End FunctionLe document Excel est maintenant prêt, il suffit d'insérer la première formule insérée plus haut dans ce blog (vous pourrez trouver un exemple ici).