Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA : bug de la confirmation des options.

2 réponses
Avatar
Mersenne
Bonsoir.

Vous êtes-vous déjà demandé pourquoi la valeur de l'option "Confirmation des
conversions" changeait indépendamment de votre volonté ?
Par hasard, n'exécutez-vous pas parfois une macro qui ouvre un fichier avec
Documents.Open en affectant au paramètre ConfirmConversion de cette méthode
une valeur autre que celle de l'option ?
Si oui, ne cherchez pas plus loin : aussi absurde que cela puisse paraître,
le seul fait d'ouvrir un fichier sans demander la conversion met l'option
sur False, de sorte qu'insidieusement, la demande de confirmation sera omise
lors des prochaines ouvertures de fichier, avec toutes les conséquences
fâcheuses que cela peut avoir.
Et même chose si l'option est sur True et que vous ouvrez un fichier avec le
paramètre sur False : l'option passe à True !!!!!!!

La macro qui suit illustre ce bug.
Elle offre en même temps une sous-routine qui ouvre un fichier sans ce bug
(autrement dit qui laisse l'option telle qu'elle était).

Il y a deux versions de cette sous-routine : l'une
(DocumentsOpenSansBug2002) fonctionne aussi bien dans le Word 2002 que dans
le Word 2003, bien que, pour le Word 2003, l'autre soit préférable, car elle
gère le paramètre XMLTransform .
La seconde sous-routine (DocumentsOpenSansBug2003) ne fonctionne que dans le
Word 2003, où, comme il vient d'être dit, elle est préférable.

On notera la syntaxe curieuse FileName:=FileName etc., qui peut sembler
curieuse mais qui me semble logique.

Comme c'est l'usage, j'avertis que je fournis cette sous-routine sans
garantie, mais dans tous mes essais, elle a eu le comportement attendu :
dénoncer comme boguée la méthode VBA et déclarer ma routine irréprochable.

Si ça dépendait de moi, le VBA offrirait au programmeur une protection
contre lui-même, un peu comme "Option Explicit" (par quoi il s'oblige à
déclarer ses variables).
Dans le système auquel je pense, le programmeur pourrait mettre en tête de
son programme, par exemple, "Prohibit Documents.Open" et toute tentative
d'appeler cette méthode boguée serait impitoyablement refusée par le
compilateur.
Le programmeur pourrait stocker en un endroit, une fois pour toutes, la
liste des fonctions et méthodes VBA prohibées. Cela aurait l'avantage que
chaque module ne serait pas encombré par une longue liste dans la zone des
déclarations.

Voici la macro de démonstration :

Option Explicit

Public Sub MAIN()

Dim QuidConversions As Boolean
Const NomDuFichier As String = "C:\TestConfirmConversions.txt"

If Dir(NomDuFichier, vbArchive + vbHidden + vbReadOnly) <> "" Then
MsgBox "Le fichier " & NomDuFichier & " existe déjà. Par prudence, la
macro ne s'exécute pas."
Exit Sub
End If

Documents.Add

QuidConversions = Options.ConfirmConversions

Options.ConfirmConversions = True

ActiveDocument.SaveAs FileName:=NomDuFichier, FileFormat:=wdFormatText
ActiveWindow.Close
Documents.Open FileName:=NomDuFichier, ConfirmConversions:=False

' Pour éviter le bug, neutraliser l'instruction qui précède et activer une
de celles-ci
' (la première pour Word2002 et la seconde pour Word2003). Si vous voulez
utiliser
' celle de 2003, décommentarisez sa définition (après l'End Sub de Sub
MAIN() :

' DocumentsOpenSansBug2002 FileName:=NomDuFichier,
ConfirmConversions:=False
' DocumentsOpenSansBug2003 FileName:=NomDuFichier,
ConfirmConversions:=False


If Options.ConfirmConversions = False Then
MsgBox "Il y a bien un bug : l'ouverture d'un fichier individuel sans
demande de conversion entraîne que, subrepticement, toutes les autres
ouvertures de fichiers se feront sans demande de confirmation."
Else
MsgBox "Pas de bug : l'option de confirmation des conversions est restée
sur True."
End If

ActiveWindow.Close

Options.ConfirmConversions = False


Documents.Open FileName:=NomDuFichier, ConfirmConversions:=True

' Pour éviter le bug, neutraliser l'instruction qui précède et activer une
de celles-ci
' (la première pour Word2002 et la seconde pour Word2003). Si vous voulez
utiliser
' celle de 2003, décommentarisez sa définition (après l'End Sub de Sub
MAIN() :

' DocumentsOpenSansBug2002 FileName:=NomDuFichier, ConfirmConversions:=True
' DocumentsOpenSansBug2003 FileName:=NomDuFichier, ConfirmConversions:=True


If Options.ConfirmConversions = True Then
MsgBox "Il y a bien un bug : l'ouverture d'un fichier individuel avec
demande de conversion entraîne que toutes les autres ouvertures de fichiers
se feront avec demande de confirmation."
Else
MsgBox "Pas de bug : l'option de confirmation des conversions est restée
sur False."
End If


Options.ConfirmConversions = QuidConversions
ActiveWindow.Close
Kill NomDuFichier
End Sub

'Private Sub DocumentsOpenSansBug2003(FileName As Variant, Optional
ConfirmConversions As Variant, Optional ReadOnly As Variant, Optional
AddToRecentFiles As Variant, Optional PasswordDocument As Variant, Optional
PasswordTemplate As Variant, Optional Format As Variant, Optional Encoding
As Variant, Optional Visible As Variant, Optional OpenAndRepair As Variant,
Optional DocumentDirection As Variant, Optional NoEncodingDialog As Variant,
Optional XMLTransform As Variant)
'' A n'utiliser qu'avec un Word d'à partir de 2003.
'Dim QuidConversions As Boolean

'QuidConversions = Options.ConfirmConversions
'Documents.Open FileName:=FileName,
ConfirmConversions:=ConfirmConversions, ReadOnly:=ReadOnly,
AddToRecentFiles:=AddToRecentFiles, PasswordDocument:=PasswordDocument,
PasswordTemplate:=PasswordTemplate, Format:=Format, Encoding:=Encoding,
Visible:=Visible, OpenAndRepair:=OpenAndRepair,
DocumentDirection:=DocumentDirection, NoEncodingDialog:=NoEncodingDialog,
XMLTransform:=XMLTransform
'Options.ConfirmConversions = QuidConversions

'End Sub

Private Sub DocumentsOpenSansBug2002(FileName As Variant, Optional
ConfirmConversions As Variant, Optional ReadOnly As Variant, Optional
AddToRecentFiles As Variant, Optional PasswordDocument As Variant, Optional
PasswordTemplate As Variant, Optional Format As Variant, Optional Encoding
As Variant, Optional Visible As Variant, Optional OpenAndRepair As Variant,
Optional DocumentDirection As Variant, Optional NoEncodingDialog As Variant)
Dim QuidConversions As Boolean

QuidConversions = Options.ConfirmConversions
Documents.Open FileName:=FileName, ConfirmConversions:=ConfirmConversions,
ReadOnly:=ReadOnly, AddToRecentFiles:=AddToRecentFiles,
PasswordDocument:=PasswordDocument, PasswordTemplate:=PasswordTemplate,
Format:=Format, Encoding:=Encoding, Visible:=Visible,
OpenAndRepair:=OpenAndRepair, DocumentDirection:=DocumentDirection,
NoEncodingDialog:=NoEncodingDialog
Options.ConfirmConversions = QuidConversions

End Sub

2 réponses

Avatar
Mersenne
Erratum :

Au lieu de
"Et même chose si l'option est sur True et que vous ouvrez un fichier avec
le
paramètre sur False : l'option passe à True !!!!!!!
"
il faut évidemment lire :
"Et même chose si l'option est sur False et que vous ouvrez un fichier avec
le
paramètre sur True : l'option passe à True !!!!!!!
"
Avatar
Mersenne
Erratum pour le titre du message, aussi :
VBA : bug de la confirmation des conversions.