XL 2021 Excel suffixe numérique des fenêtres, quelle structure ?

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Chez moi en Office 2021 64 bits et Office 2016 32 bits, lorsque je créé une nouvelle fenêtre (Affichage / Nouvelle fenêtre) les suffixes des fenêtres apparaissent ainsi:
<Nom du classeur>:<numéro de fenêtre>
1750682806608.png


Chez un utilisateur en Office 2016 32 bits pour qui je fais un peu de code, la structure est:
<Nom du classeur> - <numéro de fenêtre>
1750684346777.png


Qu'est-ce qui peut justifier une telle différence ?
 
Dernière édition:
Solution
Bonjour à tous,

Voici le résultat :
Code:
<WindowCaptionDetails.xlsm  -  2>

57 69 6E 64 6F 77 43 61 70 74 69 6F 6E 44 65 74    WindowCaptionDet
61 69 6C 73 2E 78 6C 73 6D 20 20 2D 20 20 32       ails.xlsm  -  2

Par contre, chez moi ta MsgBox a un souci, j'ai dû bidouiller pour trouver le résultat...
MsgBox.png


A+
re:
Par contre je comprends pas pourquoi il faut un Trim pour faire fonctionner le truc.
Le Trim retire les espaces du début et de la fin. Quand bien même il y en aurait il seraient dumpés.
Non!! pas trim mais application.trim

VB:
sub test()

msgbox application.trim("     bonjour      @dudu2   comment          va         tu         ")

End sub

ne pas confondre :
  1. trim
  2. vba.trim
  3. application.trim
je répète donc: ce que j'ai dit tout à l'heure
Code:
application.trim("   du            texte     ")
normalise la chaine a un seul caractères espace successif à l’intérieur de la chaine et supprime les espaces avant et après
 
@Dudu2 pour ta culture
Trim est une fonction native de VBA qui supprime les espaces en début et fin d’une chaîne de texte. Elle ne touche pas aux espaces multiples entre les mots. Elle est automatiquement reconnue par VBA sans avoir besoin de qualifier son nom, et c’est celle qu’on utilise le plus souvent dans les traitements courants.


VBA.Trim est exactement la même fonction que Trim, mais appelée de manière qualifiée, c’est-à-dire en précisant qu’elle provient de la bibliothèque VBA. Cela peut être utile pour lever des ambiguïtés si une autre fonction Trim (comme celle d’un objet ou d'une autre bibliothèque) est accessible dans le même contexte. VBA.Trim est donc une forme explicite de Trim.


Application.Trim fait référence à la méthode Trim de l’objet Application, qui applique le comportement d’Excel : elle supprime tous les espaces inutiles, y compris les doubles espaces à l’intérieur du texte. Par exemple, elle transforme [SIZE=5]" Bonjour le monde "[/SIZE] en "Bonjour le monde", ce que Trim ou VBA.Trim ne font pas. Elle est donc plus agressive et utile pour normaliser des chaînes issues de cellules Excel.
 
normalise la chaine a un seul caractères espace successif à l’intérieur de la chaine et supprime les espaces avant et après
Ok mais alors ça met en échec total le DumpHexa si on commence par remplacer dans la chaine à dumper les espaces multiples ceux et aux limites. Le but c'est d'avoir la représentation hexadécimale de la chaine telle quelle, pas préalablement modifiée.

Il y a un autre problème qui donne ce résultat et que je ne comprends pas. J'ai eu la même chose avec l'utilisateur pour qui je fais ça.

Chez moi quand je fais ça:
VB:
Sub WindowCaptionDetails()
    Dim S As String
    Dim H As String
   
    'S = ActiveWindow.Caption
    S = "WindowCaptionDetails.xlsm  -  2"
    H = HexDump(S)
   
    Msg.SetPromptFontName ("Courier New")
    Msg.Box "<" & S & ">" & vbCrLf & vbCrLf & _
            H
End Sub

J'ai bien ça:
1750754978049.png


Et pas ça:
1750755064226.png
 
Dernière édition:
Il semble que ceux qui ont le tiret en séparateur soient les seuls à avoir ce problème.
C'est pour ça que j'aimerais que @mromain essaie de diagnotisquer ce qui se passe:
- quelle bidouille il a fait pour faire fonctionner le truc
- ré-essayer en remplaçant le Msg.Box par un simple MsgBox
 
re
kado:
VB:
Option Explicit

Sub WindowCaptionDetails()
    Dim S As String
    Dim H As String
    
    S = ActiveWindow.Caption
   MsgBox StrToHexArray(S)
End Sub

Function StrToHexArray(ByVal txt As String)
    Dim b() As Byte
    Dim hexArray() As String
    Dim i As Long
    StrToHexArray = "<<" & txt & ">>" & vbCrLf & vbCrLf
   
    ' conversion en tableau de BITouille de la chaine
    b = StrConv(txt, vbFromUnicode)
    
    ' on cré un tableau variant de même taille que le tableau de BITouille
    ReDim hexArray(0 To UBound(b))
    
    ' transfere des Bits au même endroit dans le tableau variant en hexa
    For i = 0 To UBound(b)
        hexArray(i) = Right$("0" & Hex(b(i)), 2)
    Next
    
    ' compilation de la chaine de nombre en hexa
    StrToHexArray = StrToHexArray & Join(hexArray, Chr(32))
End Function
 
Re bonjour,

quelle bidouille as-tu fais pour faire fonctionner le truc ?
Je suis allé voir dans le VBA quelle valeur tu affichais dans le TextBoxPrompt du formulaire en mettant un point d'arrêt.
peux-tu ré-essayer en remplaçant le Msg.Box par un simple MsgBox STP ?
Aucun souci avec une simple MsgBox

En re-regardant, là la MsgBox s'est bien affichée.
Je me suis aperçu que :
  • Si la fenêtre est sur mon écran principal, ta MsgBox s'affiche bien (même sans Application.Trim).
  • Si elle est sur mon écran secondaire (affichage étendu), là elle apparait ratatinée (comme sur mon screenshot) sur le bord de mon écran principal.

A+
 
au punaise ca marche au gaz au petrol a l'électricité reuni ce truc
de ce que j'ai compris le width est imposé par lemax (calcul nombre de bouton )ou le width du textbox pour le height pareil
et comme ces calcul sont fait avec l'usine active window pan etc...je crains fort qu'il y ai une erreur dans son algo qu'il n'avais pas envisagé

c'est la dessus que nous sommes jamais tombé d'accords avec @Dudu2 son calcul pour la position peut être est ce utile (sous reserve)pour les width et position centrale l'application est en point le userform est en point tout est en point disponible et accessible ,je vois vraiment pas pourquoi aller chercher une conversion p to px et inversement si les données n’étaient pas dispo je comprendrais mais là ce n'est pas le cas

j'avais fait un tout petit code à lolote83 pour switcher l'application de l'ecran 1 à l'ecran 2 dans ce code je n'utilise qu'une seule api c'est le getsytemmetrics @Dudu2 pourrais se rapprocher de @Lolote83 et avoir une copie de ce code

quand au width du faux msgbox un simple wordwrap false et autosize (comparer au max de ce que l'on souhaite )suffirait pour dimentionner le message et pour le height pareil
on fait sauter ainsi l'usine gaz et petrol on garde que la central nucléaire electrique
si ca pète c'est de la faute a dudu j'y suis pour rien moi j'etais à la pêche tout les gobies peuvent en témoigner
 
Ce formulaire de "Custom MsgBox" je l'utilise partout et c'est très pratique pour des tas de raisons que je ne vais pas énumérer.
Ici, on a besoin d'une Font Courier New pour aligner les caractères et c'est l'un des paramétrages possibles.

Par contre:
Si elle est sur mon écran secondaire (affichage étendu), là elle apparait ratatinée (comme sur mon screenshot) sur le bord de mon écran principal.
@mromain, tu sembles avoir identifié l'origine du problème que je vais m'empresser de reproduire et tenter de corriger.
Car mon "utilisateur" utilise aussi des moniteurs multiples ce qui confirme la source probable du problème.

Finalement j'ai appris 2 trucs:
- J'ai un bug à corriger (ok ça doit pouvoir se faire)
Edit: je pense que la récupération ou l'utilisation des MonitorInfo doit déraper quelque part.

- Le séparateur de suffixe numérique d'une fenêtre peut être x'3A' ou x'20 20 2D 20 20'
Perso je ne comprends pas que MS ait utilisé le 2ème qui contrairement au 1er peut faire partie d'un nom de classeur quand le suffixe numérique est présent. Exemple: "MonClasseur - 2.xlsx". C'est pas très malin.

Alors merci tout le monde !
 
Dernière édition:
@Dudu2 chez moi
si j utilise les api pour capter l’écran ou est l'application et que par exemple elle est sur l'ecran 2 et maximisée on retrouve un léger bord a droite dans l'ecran 1 de l'application du coup donc son point(0,0) est l’écran 1 c'est pour cela que dans mes algo je test un point de celule pour etre sur d'être dans le bon écran
reste bien sur une fenêtre medzo medzo sur deux écran mais ça c'est un autre problème qui est sommes toute de ce fait insoluble ou l’écran de gauche tout simplement
en fait je ne m'ennuie pas je fait 6 test a 6 points différents et n’obtient 6 ecrans ceux qui sont identique a l'ecran du point (0,0)(ecran principal) sont eliminés du coup j'ai mes écrans leur position (geographique si je puis m'exprimer ainsi)et le areawork bien sur ça tu connais
 
Bonjour,

Effectivement, bug ! Je ne tenais pas compte du Left et Top de la rcWork du moniteur dans certains calculs de position.

J'ai corrigé la ressource du Msg.Box et juste pour le fun le fichier bugué/corrigé qui a permis à nos amis multi-moniteurs de détecter ce problème.

Edit: @patricktoulon, avec l'API GetMonitorInfo(), la structure obtenue semble très précise pour le rcMonitor et le rcWork qui sont des RECT en pixels. J'utilise le rcWork puisqu'il exclut la TaskBar. Sachant que la Handle du Moniteur s'obtient facilement avec l'API MonitorFromWindow().
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour