Bonjour
C'est un problème avec ScreenUpdating = False depuis une mise à jour sur Excel 2013.
Le problème peut être contourné par
Code : Sélectionner tout - Visualiser dans une fenêtre à part Windows(wb.Name).WindowState = xlMinimized
Bonjour
C'est un problème avec ScreenUpdating = False depuis une mise à jour sur Excel 2013.
Le problème peut être contourné par
Code : Sélectionner tout - Visualiser dans une fenêtre à part Windows(wb.Name).WindowState = xlMinimized
Cordialement
Docmarti.
Essayer aussi avec Application.Goto (cf aide VBA), sait-on jamais …
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
En réalité, ScreenUpdating = False fonctionne correctement, c'est ScreenUpdating = True qui ne fonctionne plus !!!
Lorsque la macro s'arrête l'affichage reste sur le premier fichier ouvert après ScreenUpdating = False.
Minimiser toutes les fenêtres sauf le classeur actif est un bon palliatif, cela permet de masquer le problème.
Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub Test() Dim w1 As Workbook Dim w2 As Workbook Dim wb As Workbook Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) Set w2 = Workbooks.Add(xlWBATWorksheet) Application.ScreenUpdating = True ThisWorkbook.Activate 'ou w2.Activate For Each wb In Workbooks If Not wb Is ActiveWorkbook Then Windows(wb.Name).WindowState = xlMinimized Next wb End Sub
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
hello,
à tout hasard : et si tu mets une temporisation entre le Application.ScreenUpdating = True et le ThisWorkbook.Activate ?
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Et qu'est-ce que ça donne si tu fais tout simplement
Code : Sélectionner tout - Visualiser dans une fenêtre à part Windows(w2.Name).WindowState = xlMaximized
Cordialement
Docmarti.
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
OK. Merci.
Et si enlèves de ton code
est-ce que ton code fonctionne encore ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Application.ScreenUpdating = True
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub Test() Dim w1 As Workbook Dim w2 As Workbook Dim wb As Workbook Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) Set w2 = Workbooks.Add(xlWBATWorksheet) 'Application.ScreenUpdating = True ThisWorkbook.Activate 'ou w2.Activate For Each wb In Workbooks If Not wb Is ActiveWorkbook Then Windows(wb.Name).WindowState = xlMinimized Next wb End Sub
Cordialement
Docmarti.
Oui, ce qui me semble normal car ScreenUpdating passe automatiquement à True en fin de macro.
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
hello,
et si tu fais ceci ?
Ami calmant, J.P
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Dim w1 As Workbook Dim w2 As Workbook Sub test() application.screenupdating = false call addClasseurs() application.screenupdating = true end sub sub addClasseurs() Set w1 = Workbooks.Add(xlWBATWorksheet) Set w2 = Workbooks.Add(xlWBATWorksheet) w2.Activate end sub
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Bonjour à tous,
@jurassic pork: Le problème reste le même. (Heureusement, car je ne vois pas en quoi ce code pourrait changer quelque chose.)
@Marc-L : Application.Goto ne change rien.
Il s'agit réellement d'un Bug, on dirait que la fenêtre d'Excel n'est plus synchronisé avec le VBA
Ce que je ne comprend pas, c'est pourquoi Eriiic n'a pas le problème ! Est-ce lié à une option Win10 ???
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
Bonjour,
Par acquis de conscience j'ai retesté et je te confirme que c'est correct, enfin que ça a été correct... :-sCe que je ne comprend pas, c'est pourquoi Eriiic n'a pas le problème ! Est-ce lié à une option Win10 ???
J'ai voulu aller plus loin et essayé de reproduire le bug.
Un des test était de mettre la macro dans un module de classe (Feuille) : bingo, plus d'activation du wb voulu.
Par contre gros pb, c'est que j'avais le bug en permanence, même dans un module Standard :-s
Soupçonnant le registre j'ai supprimé les clés d'excel dans HKCU pour les recréer : à-priori il est hors de cause.
Je te passe les autres essais mais j'ai réussi à retrouver un fonctionnement normal : j'ai lancé excel en administrateur et obtenu le fonctionnement correct.
Cerise sur le gâteau : le fonctionnement correct est conservé ensuite par un lancement 'normal'.
Reste à voir si ça se confirme sur ta config
eric
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
Et le code suivant active-t-il le classeur W2 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub Test() Dim w1 As Workbook Dim w2 As Workbook Dim wb As Workbook Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) Windows(w1.Name).WindowState = xlMinimized Windows(w1.Name).WindowState = xlMaximized Set w2 = Workbooks.Add(xlWBATWorksheet) End Sub
Cordialement
Docmarti.
Non, et pense qu'il n'est pas possible de résoudre le problème à l'aide de commandes VBA classiques,
il faut probablement utiliser l'API puisque, vu de la macro tout est normal, c'est bien w2 qui est actif !
Bonjour à tous,
Je viens d'essayer ce code sans aucun succès :
Le Debug.Print donne w2 actif mais c'est w1 qui apparaît au premier plan...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 Private Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Boolean Private Declare Function ShowWindow Lib "user32" (ByVal HWND As Long, ByVal nCmdShow As Integer) As Boolean Private Const SW_HIDE As Long = 0 Private Const SW_MAXIMIZE As Long = 3 Private Const SW_MINIMIZE As Long = 6 Private Const SW_RESTORE As Long = 9 Private Const SW_SHOW As Long = 5 Private Const SW_SHOWDEFAULT As Long = 10 Private Const SW_SHOWMAXIMIZED As Long = 3 Private Const SW_SHOWMINIMIZED As Long = 2 Private Const SW_SHOWMINNOACTIVE As Long = 7 Private Const SW_SHOWNA As Long = 8 Private Const SW_SHOWNOACTIVATE As Long = 4 Private Const SW_SHOWNORMAL As Long = 1 Sub TestApi() Dim w1 As Workbook Dim w2 As Workbook Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) w1.ActiveSheet.Cells.Interior.ColorIndex = 3 w1.Saved = True Set w2 = Workbooks.Add(xlWBATWorksheet) w2.ActiveSheet.Cells.Interior.ColorIndex = 5 w2.Saved = True Application.ScreenUpdating = True Call SetForegroundWindow(Windows(w2.Name).HWND) Call ShowWindow(Windows(w2.Name).HWND, SW_SHOW) Debug.Print ActiveWorkbook.Name DoEvents End Sub
et sans les ScreenUpdating ça fonctionne (mais les fenêtres s'affichent)
Quelqu'un aurait-il une autre idée ?
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
Que w2 soit activé ne signifie pas qu'il sera nécessairement au premier plan. Par exemple si on fait
on peut quand même l'activer temporairement mais il ne restera pas le classeur actif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part w2.Windows(1).Visible = False
Le code suivant devrait contourner le problème sur Excel 2013 et 2016 et mettre w2 au premier plan.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Private Sub Test() Dim w1 As Workbook Dim w2 As Workbook Application.ScreenUpdating = False Set w1 = Workbooks.Add() Windows(w1.Name).WindowState = xlMinimized Set w2 = Workbooks.Add() 'w2.Windows(1).WindowState = xlMaximized End Sub
Cordialement
Docmarti.
Bonjour le Forum,
Comme je le disais déjà au post #23 : « Minimiser toutes les fenêtres sauf le classeur actif est un bon palliatif, cela permet de masquer le problème. ».
Mais ça ne permet pas de faire passer w1 ouvert en arrière plan derrière w2 (et w3, w4, ...) comme cela devrait être : c'est ça le problème !!!
Pour l'instant le seul moyen d'obtenir ce résultat est la suppression des ScreenUpdating=False et =True, ce qui n'est pas satisfaisant.
Peut-être existe-t-il un autre moyen de figer l'affichage sans utiliser ScreenUpdating=False ???
En attendant Madeleine ....
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
Windows 10 a peut-être quelque chose à voir parce que j'essaie de reproduire ton problème, mais en vain...
Ça fonctionne toujours bien.
Je suis sous Win7 et Office 2013
MPi²
Bonjour le Forum,
Avec l'aide du forum Microsoft Office je viens de trouver la solution.
Le problème semble lié à la nouvelle interface SDI apparue avec Excel 2013.
J'avais essayé le DoEvents mais il n'agit que sur la fenêtre active,
depuis Excel 2013, il faut en faire autant qu'il y a de fenêtres ouvertes dans l'application.
Un problème similaire se pose avec les barres d'outils incorporées aux classeurs : pour les supprimer il faut le faire dans chaque fenêtre.
Voici un code qui semble fonctionner dans tous les cas :
Encore merci à tous,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub Test() Application.ScreenUpdating = False Set w1 = Workbooks.Add(xlWBATWorksheet) Set w2 = Workbooks.Add(xlWBATWorksheet) Set w3 = Workbooks.Add(xlWBATWorksheet) Application.ScreenUpdating = True ForEachWinDoEvents w2.Activate End Sub Sub ForEachWinDoEvents() Dim win As Window For Each win In Application.Windows DoEvents Next win End Sub
Je passe en résolu
Cordialement,
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur
Bonjour,
Intéressant et merci pour le retour.
Et ils ont amélioré la gestion sur 2016 ou pas ? Vu que j'ai eu du mal à reproduire le pb sur W10 Excel2016 et que je n'ai pas réussi à le faire 2 fois.
Si quelqu'un sait...
eric
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager