Code plus fonctionnel suite à MAJ Windows?

5 réponses
Avatar
rmillerlcxl
Bonjour,

Depuis quelques jours un code qui a toujours fonctionn=C3=A9 ... ne fonctio=
nne plus. Je soup=C3=A7onne que c'est suite =C3=A0 une MAJ de Windows mais =
j'ai tent=C3=A9 de les d=C3=A9sinstaller mais sans succ=C3=A8s. J'ai aussi =
fait une r=C3=A9paration compl=C3=A8te de Office mais aussi sans succ=C3=A8=
s.

Mais Dropbox a d=C3=A9j=C3=A0 caus=C3=A9 des probl=C3=A8mes de ce types.

M=C3=AAme s'il n'y a pas d'autres fichiers Excel ouverts ... dans une autre=
instance d'Excel ... Excel consid=C3=A8re qu'il y en a d'autres. En fait l=
orsque je vais dans le projet VBA en plus de mon fichier je vois aussi les =
=C3=A9l=C3=A9ments suivants : atpvbaen.xls(ATPVBAEN.XLAM), ClFileSearch(Cla=
sseFileSearch.xla) et VbaProject(Funcres.XLAM).

Ces =C3=A9l=C3=A9ments ont toujours =C3=A9t=C3=A9 pr=C3=A9sents mais n'=C3=
=A9taient pas consid=C3=A9r=C3=A9s comme des fichiers Excel ouverts selon l=
e code ci-dessous ... mais maintenant ... oui.

Auriez-vous une id=C3=A9e du pourquoi cela arrive et/ou une suggestion de c=
ode ajust=C3=A9?

Merci =C3=A0 l'avance.


NbFileOuverts =3D 0
EnumWindows AddressOf EnumWindowsProc, 0
If NbFileOuverts >=3D 2 Then
If Feuil1.Range("CN_ValidLangue").Value <> 2 Then
MsgBox "Afin de maximiser l'efficacit=C3=A9 du processus de la mise=
=C3=A0 jour il est n=C3=A9cessaire que tous les autres fichiers Excel soie=
nt d'abord ferm=C3=A9s.", vbOK, "MAJ Exercice"
Else
MsgBox "In order to maximize the efficiency of the update process i=
t is necessary to first close all other opened workbooks.", vbOK, "Year cha=
nge"
End If
If UF_Message.Visible =3D True Then
Unload UF_Message
End If
GoTo Fin2
End If

'_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ =
_ _ _ _ _ _ _

'#If Not VBA7 Then
Declare Function GetWindowTextLength Lib "User32" Alias _
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "User32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As _
String, ByVal cch As Long) As Long
Declare Function EnumWindows Lib "User32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

'#Else
'Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias _
'"GetWindowTextLengthA" (ByVal hwnd As LongPtr) As Long
'Declare PtrSafe Function GetWindowText Lib "user32" Alias _
'"GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As _
'String, ByVal cch As Long) As Long
'Declare PtrSafe Function EnumWindows Lib "user32" _
'(ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
'#End If
Public NbFileOuverts As Long

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) A=
s Long
Dim Slength As Long, Buffer As String, NomFichier As String, X As Long
Dim Elt As Variant
'D=C3=A9termine la longueur du texte de la barre de titre de l'applicatio=
n
Slength =3D GetWindowTextLength(hwnd) + 1 ' get length of title bar text
If Slength > 1 Then ' if return value refers to non-empty string
'cr=C3=A9e l'espace que va demander le titre de l'application
'pour la variable Buffer
Buffer =3D Space(Slength)
'Obtient dans la variable Buffer, la valeur de la barre
'de titre de l'application
GetWindowText hwnd, Buffer, Slength
'Teste si la cha=C3=AEne " - Excel" est pr=C3=A9sente dans la barre
'de titre de l'application
For Each Elt In Array(" - Excel", " - Microsoft Excel", "Microsoft Ex=
cel -")
X =3D InStr(1, Trim(Buffer), Elt, vbTextCompare)
If X > 0 Then
NbFileOuverts =3D NbFileOuverts + 1
End If
Next
End If
'processus r=C3=A9cursif qui va boucle si elle vaut 1
EnumWindowsProc =3D 1
End Function

5 réponses

Avatar
News.aioe.org
Bonjour,
Lorsque tu vois dans la fenêtre VBA (éditeur de code vba) ces 2 fichiers
atpvbaen.xls(ATPVBAEN.XLAM) et VbaProject(Funcres.XLAM) dans la liste des
projets ouverts, c'est que tu (ou quelqu'un autre) as coché dans : Interface
de calcul / fichiers / options / Compléments / dans le bas de la page de
gauche / Gérer : Compléments Excel - clic sur le bouton atteindre / et tu
peux voir les compléments qui sont cochés : "Analysis Toolpak" et "Analysis
toolpak-VBA".
Ces classeurs de macros complémentaires ".xlam" ne sont pas visibles
habituellement dans l'interface de calcul.
Lorsqu'un projet vba d'un fichier .xlam n'est pas verrouillé , en affichant
les propriétés du thisWorkbook du fichier de macros complémentaires, la
propriété "Isaddin = true" permet de rendre le fichier visible avec ses
feuilles de calcul.
A ) J'ai testé le code que tu as publié. Il donne un résultat "OK" correct
selon le nombre de fichiers ouverts. Cependant, pour calculer le nombre de
classeurs ouverts dans une même instance, il y a plus facile comme code :
Msgbox Workbooks.Count
B ) Ton code compte aussi le nombre de classeurs qui serait ouvert dans une
autre instance d'Excel.
Le gestionnaire de tâche ( Ctrl + Alt + Del) affiche le nombre
d'instances de l'exécutable Excel.exe.
C ) Es-tu certain qu'il n'y a pas de classeur masqué dans ton instance
d'Excel où tu travailles?
Pour vérifier cela : Barre des menus du ruban / affichage / "Afficher"
(cette commande est désactivée si aucun fichier n'est masqué).
MichD
a écrit dans le message de groupe de discussion :
Bonjour,
Depuis quelques jours un code qui a toujours fonctionné ... ne fonctionne
plus. Je soupçonne que c'est suite à une MAJ de Windows mais j'ai tenté de
les désinstaller mais sans succès. J'ai aussi fait une réparation complète
de Office mais aussi sans succès.
Mais Dropbox a déjà causé des problèmes de ce types.
Même s'il n'y a pas d'autres fichiers Excel ouverts ... dans une autre
instance d'Excel ... Excel considère qu'il y en a d'autres. En fait lorsque
je vais dans le projet VBA en plus de mon fichier je vois aussi les éléments
suivants : atpvbaen.xls(ATPVBAEN.XLAM), ClFileSearch(ClasseFileSearch.xla)
et VbaProject(Funcres.XLAM).
Ces éléments ont toujours été présents mais n'étaient pas considérés comme
des fichiers Excel ouverts selon le code ci-dessous ... mais maintenant ...
oui.
Auriez-vous une idée du pourquoi cela arrive et/ou une suggestion de code
ajusté?
Merci à l'avance.
NbFileOuverts = 0
EnumWindows AddressOf EnumWindowsProc, 0
If NbFileOuverts >= 2 Then
If Feuil1.Range("CN_ValidLangue").Value <> 2 Then
MsgBox "Afin de maximiser l'efficacité du processus de la mise à
jour il est nécessaire que tous les autres fichiers Excel soient d'abord
fermés.", vbOK, "MAJ Exercice"
Else
MsgBox "In order to maximize the efficiency of the update process it
is necessary to first close all other opened workbooks.", vbOK, "Year
change"
End If
If UF_Message.Visible = True Then
Unload UF_Message
End If
GoTo Fin2
End If
'_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _
'#If Not VBA7 Then
Declare Function GetWindowTextLength Lib "User32" Alias _
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "User32" Alias _
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As _
String, ByVal cch As Long) As Long
Declare Function EnumWindows Lib "User32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'#Else
'Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias _
'"GetWindowTextLengthA" (ByVal hwnd As LongPtr) As Long
'Declare PtrSafe Function GetWindowText Lib "user32" Alias _
'"GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As _
'String, ByVal cch As Long) As Long
'Declare PtrSafe Function EnumWindows Lib "user32" _
'(ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
'#End If
Public NbFileOuverts As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As
Long
Dim Slength As Long, Buffer As String, NomFichier As String, X As Long
Dim Elt As Variant
'Détermine la longueur du texte de la barre de titre de l'application
Slength = GetWindowTextLength(hwnd) + 1 ' get length of title bar text
If Slength > 1 Then ' if return value refers to non-empty string
'crée l'espace que va demander le titre de l'application
'pour la variable Buffer
Buffer = Space(Slength)
'Obtient dans la variable Buffer, la valeur de la barre
'de titre de l'application
GetWindowText hwnd, Buffer, Slength
'Teste si la chaîne " - Excel" est présente dans la barre
'de titre de l'application
For Each Elt In Array(" - Excel", " - Microsoft Excel", "Microsoft
Excel -")
X = InStr(1, Trim(Buffer), Elt, vbTextCompare)
If X > 0 Then
NbFileOuverts = NbFileOuverts + 1
End If
Next
End If
'processus récursif qui va boucle si elle vaut 1
EnumWindowsProc = 1
End Function
Avatar
rmillerlcxl
Bonjour à nouveau,
En réponse … à votre suggestion … je suis aller d ans le menu Affichage et Afficher n’est pas accessible. Aussi dans le gestionnaire de tâches … il n’y a qu’une in stance d’Excel.
Merci.
Avatar
News.aioe.org
Bonjour,
Au lieu de désinstaller Dropbox, pourquoi ne par prendre l'habitude de
télécharger le ou les fichiers sur le disque dur de l'ordinateur avant de
l'ouvrir? Durant ce week-end, je ferai un petit test à partir de Dropbox.
N.B. Est-ce que tout fonctionne bien lorsque lesdits fichiers ont été
téléchargés sur le disque dur de l'ordinateur?
MichD
a écrit dans le message de groupe de discussion :
Bonjour à nouveau,
En réponse … à votre suggestion … je suis aller dans le menu Affichage et
Afficher n’est pas accessible. Aussi dans le gestionnaire de tâches … il n’y
a qu’une instance d’Excel.
Merci.
Avatar
News.aioe.org
Bonjour,
Pour l'historique des mises à jour de Windows,
Dans la zone de recherche à côté du bouton "démarrer"
Tu inscris : Mise à jour Windows. Tu pourras afficher l'historique.
Je ne connais pas Microsoft office 365, mais sur cette page tu devrais
trouver des informations pour t'aider :
https://support.office.com/fr-fr/article/Office-365-pour-les-entreprises-Aide-de-l-administrateur-17d3ff3f-3601-466e-b5a1-482b31cfb791?ui=fr-FR&rs=fr-FR&ad=FR
Est-ce que tous les usagers ont Microsoft Office 365?
Ceci te donne le nombre d'instances d'Excel ouvertes.
S'il y en a plus d'une, tu informes l'usager et tu lui demandes
de les fermer!
'-----------------------------------------------
Sub test()
MsgBox Nb_Instance_Excel_Ouvert("Excel.exe")
End Sub
'-----------------------------------------------
Function Nb_Instance_Excel_Ouvert(App As String)
Dim Compteur As Long
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" & strComputer & "rootcimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = '" & App & "'")
For Each objProcess In colProcessList
Compteur = Compteur + 1
Next
Nb_Instance_Excel_Ouvert = Compteur
End Function
'-----------------------------------------------
MichD
a écrit dans le message de groupe de discussion :
Bonjour à nouveau,
Un grand merci encore.
Oui mais ... je ne peux demander ceci à mes usagers.
Mais de toute façon j'ai du nouveau.
J'ai fait une restauration système à une date antérieure. Entres autres cela
a remis une version moins récente de Office 365. Pourtant je ne voyais pas
dans l'historique des mises à jour qu'il y avait eu une mise à jour de mon
Office. J'imagine que dans Windows Update ... ce sont seulement des mises à
jour reliées à Windows mais qui peuvent toucher Office.
Mais alors comment avoir l'historique des mises à jour de Office?
La restauration (20 août) à remis la version "Microsoft Office 365
Business - fr -fr 16.0.8229.2086". Il semble qu'avant la restauration
j'avais la version "Microsoft Office 365 Business fr - fr 16.0.8326.2087
selon l'info de la restauration.
Ça m'indique dans mon Office que j'ai maintenant des mises à jour à faire.
J'ai refait tout ceci car la 1ère fois que je l'ai fait ... j'ai ensuite
fait les mises à jour recommandées et à nouveau ça ne fonctionnait plus
alors qu'avait de faire les mises à jour ça fonctionnait. Après avoir refait
le tout et sans avoir refait (une 2ème fois) les mises à jour ... ça
fonctionne à nouveau.
J'en déduit que ce sont ces mises à jour qui occasionnent ensuite le
problème.
Donc ça n'aurait rien à voir avec Dropbox.
Mais alors ... y a t'il une façon autrement que de faire une restauration
système ... pour revenir dans la version précédente de Office ... afin que
je puisse recommander ceci à mes usagers ... jusqu'à ce que le problème soit
réglé?
Aussi comment puis-je informer Microsoft de ceci ... au cas ou ... ils ne
savent pas? (bon endroit)
Ou ... est-il préférable de modifier le code ... si cela est possible?
Merci à l'avance.
Avatar
News.aioe.org
Bonjour,
Voici un fichier exemple qui ferme tous les classeurs de toutes les
instances d'Excel sauf le classeur dans lequel le code est inséré. Il ne
touche pas au fichier de macros complémentaires (.xlam)... Je suppose qu'il
doit aussi fermer le classeur de macros personnelles s'il existe.
Je n'ai plus l'adresse du site où une bonne partie du code émane!
Ce code a été testé sur Microsoft Office 2016. Reste à voir s'il est
compatible avec toutes les versions d'Excel.
Prends de lire le code avant de tester, tu peux désirer modifier une ou deux
choses!
http://www.cjoint.com/c/GHAoxqBawlv
MichD