Monsieur Excel
Pour tout savoir faire sur Excel !

27 juillet 2013

Un bug dans la MAJ de dates

Pour faire la suite des articles publiés les 7, 12 et 17 juillet, nous allons parler aujourd’hui d’un troisième cas dans lequel, quand on l’exécute, une macro enregistrée donne un résultat différent de celui qui avait été – bien justement ! – obtenu lors de l’enregistrement de la macro.

Cela concerne l’enregistrement de l’opération présentée dans l’article précédent : la conversion d’une colonne de dates en appliquant le format MJA.

La macro enregistrée est la macro « Conversion » ci-dessous. Hélas, quand on l’exécute, la conversion ne s’effectue pas du tout !

En fouillant dans Internet, j’ai fini par découvrir que le problème provenait probablement de l’option « FieldInfo », qui est très mal documentée. En fait, celle-ci dépend de deux paramètres dont j’ai supposé qu’ils pouvaient prendre des valeurs de 0 à 4 mais au sujet desquels je n’ai pas trouvé d’information vraiment utile.

 
J’ai donc écrit la macro « Conversion_test », dépendant de deux cellules dans la feuille, afin de tester ce qui se passait avec les deux paramètres de FieldInfo. La seule combinaison des deux paramètres qui m’ait permis d’atteindre mon objectif initial était la combinaison A=0 et B=4.

En conclusion, la commande qui effectue la bonne conversion de dates est donc :
Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(0, 4), TrailingMinusNumbers:=True

22 juillet 2013

Un problème d'import de dates

Il m’est arrivé plusieurs fois de récupérer dans Excel des listes de dates provenant de systèmes informatiques divers. Dans ces listes, on a parfois le problème suivant : si le quantième (le n° du jour dans le mois) est  inférieur ou égal à 12, les dates sont présentées dans l’ordre MJA, sinon elles sont dans l’ordre JMA. Bien que, dans les deux cas, le format numérique utilisé soit de type JMA. Autant dire que c’est troublant et même inexploitable tel quel…

La solution consiste à sélectionner la colonne de dates et à utiliser la commande « Convertir » du ruban « Données ».

Nous voyons dans la copie d’écran ci-dessous ce que cela donne sur un exemple. Nous avons copié la colonne A puis nous l’avons collée en C. Ensuite, nous avons sélectionné la colonne C et validé les réglages du dialogue ci-dessous, c’est-à-dire en utilisant le format « MJA ».

 
Le résultat permet de constater que les conversions se sont bien faites, comme il le fallait, dans les cellules C2, C6 et C7.

17 juillet 2013

Bug dans la mise en page (b)

Dans l’article précédent, nous avons vu comment Excel 2010 enregistrait une mise en page avec 53 lignes là où 2 lignes auraient suffi et que, pire encore, la mise en page obtenue quand on exécutait la macro n’était pas du tout la mise en page prévue.

Une macro qui fonctionne bien !

La macro de mise en page suivante fonctionne parfaitement bien et, comme nous l’avions indiqué dans l’article précédent, se limite à seulement deux instructions.


Les origines du problème de la macro enregistrée

En fait, ce qui provoque le problème, c’est la présence des quatre instructions « Application.PrintCommunication = … »

Quand vous transformez ces quatre lignes en commentaires en les précédant d’une apostrophe, la macro reste bien entendu abusivement verbeuse, mais atteint enfin bien l’objectif prévu au départ pour le pied de page.

Ce qu’en dit une personne de Microsoft…

Une personne de Microsoft contactée à ce sujet nous a dit que la commande 
« Application.PrintCommunication = … » avait été ajoutée en 2010 pour éliminer des appels à l’imprimante lors de la définition des bas de page, avec l’objectif de réduire de façon significative le temps d’impression. Ce patch a donc apparemment ajouté des bugs… Si l’on élimine ces instructions, on aura le bon pied de page, mais le temps d’exécution de l’impression peut augmenter de façon très significative.

Si un lecteur ou une lectrice du blog peut nous apporter des informations supplémentaires à ce sujet, nous serons ravis de recevoir ses commentaires.

Remarque – Il semblerait qu’il y ait exactement le même problème avec les bas de page dans Word…

12 juillet 2013

Bug dans la mise en page (a)

Dans notre dernier article, nous avons décrit un bug qui survient quand on enregistre une macro dans laquelle on crée une validation par liste en utilisant plusieurs noms séparés par des « ; ».

Aujourd’hui, nous nous intéressons à un autre bug dans l’enregistrement de macro, concernant cette fois-ci la définition d’un pied de page. Nous enregistrons une macro dans laquelle nous mettons en bas de page le jour et l’heure à gauche, et le chemin et le nom du fichier à droite.

Nous voyons ci-dessous la reproduction du pied de page, tout d’abord tel que nous l’avons défini lors de l’enregistrement de la macro, puis tel qu’il est obtenu quand il est défini par la macro enregistrée.


Voici le texte de la macro enregistrée qui, encore une fois, se révèle particulièrement verbeux, avec 53 lignes là où 2 lignes suffiraient :

Sub Pied_page()
'
' Pied_page Macro
'
    Application.CutCopyMode = False 
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = "" 
    End With 
    Application.PrintCommunication = True 
    ActiveSheet.PageSetup.PrintArea = "" 
    Application.PrintCommunication = False 
    With ActiveSheet.PageSetup 
        .LeftHeader = "" 
        .CenterHeader = "" 
        .RightHeader = "" 
        .LeftFooter = "&D&T" 
        .CenterFooter = "" 
        .RightFooter = "&Z&F" 
        .LeftMargin = Application.InchesToPoints(0.708661417322835) 
        .RightMargin = Application.InchesToPoints(0.708661417322835) 
        .TopMargin = Application.InchesToPoints(0.748031496062992) 
        .BottomMargin = Application.InchesToPoints(0.748031496062992) 
        .HeaderMargin = Application.InchesToPoints(0.31496062992126) 
        .FooterMargin = Application.InchesToPoints(0.31496062992126) 
        .PrintHeadings = False 
        .PrintGridlines = False 
        .PrintComments = xlPrintNoComments 
        .CenterHorizontally = False 
        .CenterVertically = False 
        .Orientation = xlPortrait 
        .Draft = False 
        .PaperSize = xlPaperA4 
        .FirstPageNumber = xlAutomatic 
        .Order = xlDownThenOver 
        .BlackAndWhite = False 
        .Zoom = 100 
        .PrintErrors = xlPrintErrorsDisplayed 
        .OddAndEvenPagesHeaderFooter = False 
        .DifferentFirstPageHeaderFooter = False 
        .ScaleWithDocHeaderFooter = True 
        .AlignMarginsHeaderFooter = True 
        .EvenPage.LeftHeader.Text = "" 
        .EvenPage.CenterHeader.Text = "" 
        .EvenPage.RightHeader.Text = "" 
        .EvenPage.LeftFooter.Text = "" 
        .EvenPage.CenterFooter.Text = "" 
        .EvenPage.RightFooter.Text = "" 
        .FirstPage.LeftHeader.Text = "" 
        .FirstPage.CenterHeader.Text = "" 
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""       
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    Application.PrintCommunication = True
End Sub

Le drame, c’est que la macro – quand on l’exécute – nous donne un bas de page totalement différent de notre objectif, comme on peut le voir dans la seconde image ci-dessus, avec une partie droite vide et une partie gauche comprenant un code qu’Excel lui-même est incapable d’interpréter.

Remarque – Ce bug est apparu avec la version 2010 d’Excel. S’il demeure avec la version 2013, merci de bien vouloir m’en informer.

Dans le prochain article, nous vous montrerons comment résoudre ce problème.

07 juillet 2013

Bug de la validation par liste

Nous avons déjà eu plusieurs fois l’occasion dans ce blog de dire du mal de l’enregistrement des macros. Quand on enregistre une macro, certaines actions ne sont tout simplement pas enregistrées. Pire encore, certaines actions semblent s’enregistrer parfairement, on obtient bien du code mais, quand on exécute la macro, on constate que le résultat obtenu est totalement différent de l’objectif poursuivi.

C’est le cas en particulier de macros liées à la commande « Convertir » et de certaines macros liées à la commande « Trier ». Un très bel exemple de dysfonctionnement de l’enregistrement de macro vous a déjà été fourni dans l’article « ″Convertir en plage″ en VBA » du 26 octobre 2009.

Aujourd’hui, nous allons chercher à enregistrer une commande toute simple, la définition de la cellule active via la commande « Validation des données ».

Nous voyons ci-dessous le dialogue de validation ainsi que la macro enregistrée. Nous notons, une fois de plus, le caractère particulièrement verbeux de l’enregistrement de macro : nous avons dans cette macro onze lignes de commandes, alors qu’une ligne unique effectuerait le même travail :
Selection.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="Auto;Vélo;Avion"


Remarque – La seule autre commande que l’on aurait pu garder, au cas où la cellule aurait pu contenir une validation antérieure à détruire, aurait été Selection.Validation.Delete.

Le problème est que, quand on exécute la macro enregistrée, au lieu d’obtenir une liste de validation avec les trois options, on obtient une liste avec l’unique option « Auto;Vélo;Avion », ce qui n’a rien à voir avec notre objectif.

Le remède consiste à donner un nom, par exemple « Véhicule » à une liste de nos trois options, et à utiliser dans la macro la commande :
Selection.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="=Véhicule"

01 juillet 2013

Création d'un « waterfall »

Durant les deux derniers articles, nous vous avons montré comment créer vous-même votre graphe en waterfall.

Certes, tout cela prend quand même du temps à construire, même quand vous savez exactement ce que vous devez faire. C’est pourquoi nous avons créé – dans le cadre de la société Finance 3.1 – un add-in (complément) Excel qui permet, entres autres fonctionnalités, de créer un waterfall en un seul clic.

Pour en savoir plus sur cet add-in, lisez donc nos quatre articles sur UpSlide des 6, 10, 14 et 18 mai 2011. Vous pouvez aussi aller consulter le site http://upslide.fr/fr/ … ou, si vous préférez la version en anglais : http://upslide.fr/uk/.

En attendant que vous ayez acquis une licence UpSlide, vous pouvez toujours aller visiter le site suivant, dans lequel vous pourrez obtenir gratuitement un graphe en waterfall correspondant à vos données :