Citation :
Selection.Range.Select comme parade contre un bug. Bonsoir. J'ai écrit la macro qui suit comme une sorte de petit didacticiel pour prémunir les programmeurs novices contre une vision trop naïve de "Len(Selection.Text)". En exécutant cette macro, j'ai été confronté à un bug que j'ai déjà rencontré souvent : un MsgBox qui normalement doit s'afficher après que la sélection soit mise en surbrillance s'affiche avant. Dans certains cas semblables, j'avais essayé Application.ScreenRefresh, qui tantôt avait le résultat voulu et tantôt ne l'avait pas. J'ai fini par trouver une autre parade, qui, dans tous mes essais, a réussi à coup sûr : Selection.Range.Select. Comme vous pourrez le constater, si vous neutralisez cette instruction à sa seconde occurrence dans la macro ci-dessous, le MsgBox correspondant apparaît avant la surbrillance. Evidemment, rien n'empêche, pour toute sûreté, de coupler cette parade avec Application.ScreenRefresh. "Selection.Range.Select", ça me semble vraiment exquis. Je n'ai pas résisté au plaisir de le partager avec vous. Et voici la macro en question : Option Explicit Public Sub MAIN() Dim LeMessage As String If Dir("C:\TestLenSelectionText.txt", vbReadOnly + vbHidden + vbSystem) <> "" Then MsgBox "Le fichier C:\TestLenSelectionText.txt existe déjà. Par prudence, la macro ne s'exécute pas." Exit Sub End If Documents.Add DocumentType:=wdNewBlankDocument Selection.TypeText Text:="abc" Selection.TypeParagraph Selection.TypeText Text:="def" MsgBox "Voici un nouveau document que nous venons de créer. Nous allons l'enregistrer comme txt CR/LF, puis le rouvrir." ActiveDocument.SaveAs FileName:="C:\TestLenSelectionText.txt", FileFormat:= _ wdFormatText, Encoding:=1252, LineEnding:=wdCRLF ActiveWindow.Close Documents.Open FileName:="C:\TestLenSelectionText.txt", ConfirmConversions:= _ False, Format:=wdOpenFormatText, Encoding:=1252 Selection.MoveRight Unit:=wdCharacter, Count:=3 Selection.MoveRight Extend:=wdExtend LeMessage = "Appliquée à une marque de paragraphe qui se trouve déjà dans un document qu'on vient d'ouvrir" LeMessage = LeMessage & " et qui avait été préalablement enregistré comme txt CR/LF puis fermé," LeMessage = LeMessage & " Len(Selection.Text) renvoie " & Len(Selection.Text) ' Le problème de synchronisation (MsgBox s'affichant alors que la sélection n'est pas encore en surbrillance) ' ne se produit pas ici, ou pas chaque fois. ' Pour plus de sûreté, mettons Selection.Range.Select MsgBox LeMessage ' renvoie 2 pour cette marque de paragraphe, parce que, dans une existence antérieure, le document d'écran ' a été enregistré comme txt CR/LF (puis fermé). Selection.HomeKey Unit:=wdStory Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeParagraph Selection.MoveLeft Extend:=wdExtend ' Si on passe directement au MsgBox qui suit, il s'affiche avant que la sélection ne soit en surbrillance. ' Essayons cette parade : Selection.Range.Select ' Cela marche ! On pourrait peut-être mettre aussi : Application.ScreenRefresh LeMessage = "Nous avons simplement créé une nouvelle marque de paragraphe dans le même document." & Chr(13) LeMessage = LeMessage & "Appliquée à cette nouvelle marque de paragraphe, Len(Selection.Text) renvoie maintenant " LeMessage = LeMessage & Len(Selection.Text) MsgBox LeMessage ' Ici, Len(Selection.Text) renvoie 1 ActiveDocument.SaveAs FileName:="TestLenSelectionText.txt", FileFormat:= _ wdFormatText, Encoding:=1252, LineEnding:=wdCRLF MsgBox "Après enregistrement comme txt CR/LF mais sans fermeture, Len(Selection.Text), appliquée à la marque de paragraphe que nous avons créée après la dernière ouverture, renvoie encore " & Len(Selection.Text) ' Ici, renvoie 1. ' Il ne suffit donc pas que le document ait été enregistré comme txt CR/LF pour que ' Len(Selection.Text) renvoie 2, il faut encore que le document ait été fermé après ' l'enregistrement. Selection.Collapse (wdCollapseEnd) Selection.MoveRight , Count:=2 Selection.MoveRight Extend:=wdExtend ' Le MsgBox qui suit risque de s'afficher avant que la sélection n'apparaisse. ' Essayons cette parade : Selection.Range.Select ' Cela marche ! On pourrait peut-être mettre aussi : Application.ScreenRefresh MsgBox "Et pour l'autre marque de paragraphe, Len(Selection.Text) renvoie toujours " & Len(Selection.Text) ActiveWindow.Close Kill "C:\TestLenSelectionText.txt" End Sub
|