On lit sur les newsgroups de Microsoft un exemple d'utilisation de Selection.Range.Select. A priori, j'aurais cru qu'il n'était pas nécessaire de sélectionner la sélection... Quelqu'un peut-il me dire si c'est bien logique ou si c'est un expédient qui réussit par hasard ?
Voici le message du newsgroup de Microsoft :
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
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 "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)
Marsh Posté le 04-03-2006 à 10:13:55
Bonjour.
On lit sur les newsgroups de Microsoft un exemple d'utilisation de Selection.Range.Select.
A priori, j'aurais cru qu'il n'était pas nécessaire de sélectionner la sélection...
Quelqu'un peut-il me dire si c'est bien logique ou si c'est un expédient qui réussit par hasard ?
Voici le message du newsgroup de Microsoft :
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
Cela peut se trouver ici :
http://groups.google.fr/group/micr [...] 16edf959b7
Message édité par Panurge le 04-03-2006 à 10:16:04