Search code examples
vbams-worduserform

UserForm word vba, no icon in icanbar


hello i have a following code: when i run it everything works fine so. UserForm1 is opened (word file is running in the background but is not visible) when I close UserForm1, everything closes.

The problem is that I don't have an icon at the bottom of my taskbar where I can click on UserForm1 when it is in the background. How can I solve this? would appreciate some code

My UserForm1 code:

Private Sub CommandButton1_Click()
UserForm1.Hide
Application.Visible = True
End Sub    

Private Sub UserForm_Terminate()
Dim appWord As Object
Set appWord = Application
ThisDocument.Save
ThisDocument.Close
End Sub

My Doc module code:

Sub AutoOpen()

    Application.Visible = False

    UserForm1.Hide
    UserForm1.Show vbModeless
End Sub

Solution

  • VBA doesn't provide anything for that out of the box. You need to use Windows API functions for getting the job done. For example, here is the sample code which you can use for changing the window styles (see the AppTasklist sub):

    Option Explicit
    
    'API functions
    Private Declare Function GetWindowLong Lib "user32" _
                                           Alias "GetWindowLongA" _
                                          (ByVal hwnd As Long, _
                                            ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" _
                                           Alias "SetWindowLongA" _
                                           (ByVal hwnd As Long, _
                                            ByVal nIndex As Long, _
                                            ByVal dwNewLong As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" _
                                          (ByVal hwnd As Long, _
                                           ByVal hWndInsertAfter As Long, _
                                           ByVal X As Long, _
                                           ByVal Y As Long, _
                                           ByVal cx As Long, _
                                           ByVal cy As Long, _
                                           ByVal wFlags As Long) As Long
    Private Declare Function FindWindow Lib "user32" _
                                        Alias "FindWindowA" _
                                        (ByVal lpClassName As String, _
                                         ByVal lpWindowName As String) As Long
    Private Declare Function GetActiveWindow Lib "user32.dll" _
                                             () As Long
    Private Declare Function SendMessage Lib "user32" _
                                         Alias "SendMessageA" _
                                         (ByVal hwnd As Long, _
                                          ByVal wMsg As Long, _
                                          ByVal wParam As Long, _
                                          lParam As Any) As Long
    Private Declare Function DrawMenuBar Lib "user32" _
                                         (ByVal hwnd As Long) As Long
    
    
    
    'Constants
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const GWL_EXSTYLE = (-20)
    Private Const HWND_TOP = 0
    Private Const SWP_NOACTIVATE = &H10
    Private Const SWP_HIDEWINDOW = &H80
    Private Const SWP_SHOWWINDOW = &H40
    Private Const WS_EX_APPWINDOW = &H40000
    Private Const GWL_STYLE = (-16)
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const SWP_FRAMECHANGED = &H20
    Private Const WM_SETICON = &H80
    Private Const ICON_SMALL = 0&
    Private Const ICON_BIG = 1&
    
    Private Sub AppTasklist(myForm)
    
    'Add this userform into the Task bar
        Dim WStyle As Long
        Dim Result As Long
        Dim hwnd As Long
        hwnd = FindWindow(vbNullString, myForm.Caption)
        WStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
        WStyle = WStyle Or WS_EX_APPWINDOW
        Result = SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, _
                              SWP_NOMOVE Or _
                              SWP_NOSIZE Or _
                              SWP_NOACTIVATE Or _
                              SWP_HIDEWINDOW)
        Result = SetWindowLong(hwnd, GWL_EXSTYLE, WStyle)
        Result = SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, _
                              SWP_NOMOVE Or _
                              SWP_NOSIZE Or _
                              SWP_NOACTIVATE Or _
                              SWP_SHOWWINDOW)
    
    End Sub
    
    Private Sub UserForm_Activate()
    
      Application.Visible = False
      Application.VBE.MainWindow.Visible = False
      AppTaskList Me
    
    End Sub
    
    Private Sub UserForm_Terminate()
    
      Application.Visible = True
    
    End Sub 
    

    See Excel Useform: How to hide application but have icon in the taskbar for more information.

    Also you may find the sample code helpful - Display Userform in TaskBar with custom Icon and Hide Excel (mimicking a standalone application) .