web-dev-qa-db-fra.com

Réactiver le focus dans la fenêtre de l'application après avoir affiché userform

Lors de l'affichage d'un formulaire utilisateur (en utilisant sa méthode Show), il ne s'affiche pas seulement à l'écran mais prend également le focus (la destination, par exemple, des frappes au clavier).

Dites, le userform est une barre d'outils faite sur commande. Sa Show est déclenchée dans Workbook_Open() mais le formulaire lui-même est utilisé relativement rarement, nous voulons donc que le focus revienne à la fenêtre principale de l'application juste après son apparition.

Malheureusement, il semble que la méthode SetFocus n'est pas valide pour les objets d'application.

Alors, comment cela se fait-il?

Je suppose que la solution pour mon exemple vient après

Private Sub Workbook_Open()
    [...]
    UserForm1.Show
6
Greenberet

j'utilise celui-ci:

AppActivate Application.caption

cela réinitialise le focus d'un userform sur votre feuille Excel.

15
Patrick Lepelletier

C'est un peu délicat, mais c'est ce que l'on peut faire.

Dans la sous-routine “Private Sub UserForm_Initialize ()”, ajoutez ceci comme dernière ligne:

Private Sub UserForm_Initialize()
    . . . . . . . . . . 
    Application.OnTime Now(), "MoveFocusToWorksheet"
End Sub

Dans l'un des modules de code généraux (ajoutez-en un si vous n'en avez pas), déclarez une fonction API:

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Dans n'importe lequel des modules de code généraux (éventuellement celui avec la déclaration de l'API), ajoutez ce sous-programme:

Public Sub MoveFocusToWorksheet()
    Dim Dummy As Long

    ThisWorkbook.Worksheets("Sheet1").Activate
    ' "Sheet1" here is the tab name of the sheet you want to move focus to. _
        Or simply use then: With shtABC.Activate _
        where "shtABC" being the worksheet's CodeName, _
        same as ThisWorkbook.Worksheets("Sheet1").CodeName, _
        same as the sheets module name showing in the Project Explorer panel.
    Dummy = SetForegroundWindow(Application.hwnd)
End Sub
3
Gene Skuratovsky

Pour moi

AppActivate ThisWorkbook.Application

juste après la déclaration Show semble fonctionner correctement.

Dans d'autres cas

AppActivate "Microsoft Excel"

peut aussi être ok.

2
Greenberet

Ajoutez un formulaire factice et ajoutez les codes ci-dessous:

Private Sub SomeButton_Click()

    frm_Dummy.Show vbModeless
    Unload frm_Dummy

End Sub

OR

Sub SomeSub()

    frm_Some.Show vbModeless
    frm_Dummy.Show vbModeless
    Unload frm_Dummy

End Sub
0
Fen

Je crée un objet pour l'application, par exemple. Outlook, puis réglez le paramètre WindowSate sur Maximized (OlMaximized), puis, lorsque je souhaite supprimer le focus, je le réduit (olMinimized)

Set OutlookObj = GetObject(, "Outlook.Application")
OutlookObj.ActiveExplorer.WindowState = olMinimized
OutlookObj.ActiveExplorer.WindowState = olMaximized

Ou vous modifiez l'état depuis l'application, vous pouvez également modifier son emplacement, sa taille, etc. Pour plus d'informations, voir: https://msdn.Microsoft.com/en-us/library/office/ff838577.aspx

Application.WindowState = xlMaximized
0
Andrew J Martin

En guise de note de bas de page de cette excellente discussion, dans certaines circonstances, vous pouvez éviter le problème de la mise au point en ignorant l'appel au .Show, de sorte que la mise au point ne soit jamais déplacée. Par exemple, avec Word , si vous mettez à jour un formulaire ou une boîte de dialogue non modale, mettez à jour simplement la zone requise et omettez l’appel à .Show, par exemple:

Sub ShowProblems(ByVal ProbLoc)
    EditBox2.TextBox.Text = "Here is the problem location: " & ProbLoc
    ' not needed: EditBox2.Show vbModeless
End Sub
0
CODE-REaD

J'ai créé un menu flottant avec un formulaire utilisateur et j'utilise ce code pour que mon curseur quitte le formulaire utilisateur et retourne à la feuille de calcul. Cela fonctionne à la fin de chaque code de bouton de commande et avec le code d'initiation du formulaire utilisateur.

AppActivate ThisWorkbook.Application

Il suffit de placer la ligne de code ci-dessus avant la ligne "End Sub" de tout code de bouton de commande et du code de formulaire utilisateur show initial.

0
Geo Matrix
Private Sub UserForm_Activate()
    RefRangeIn.SetFocus
End Sub

ça marche pour moi, dans Excel 2013 VBA

0
Carlosmuerto

Une autre forme est:

AppActivate ThisWorkbook.Name
0