[VBA-W] Selection.Range.Select !!!???

Selection.Range.Select !!!??? [VBA-W] - VB/VBA/VBS - Programmation

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 :

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

 
 
 
Cela peut se trouver ici :
http://groups.google.fr/group/micr [...] 16edf959b7


Message édité par Panurge le 04-03-2006 à 10:16:04
Reply

Marsh Posté le 04-03-2006 à 10:13:55   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed