XL5: How to Display Hourglass Pointer Running Macro in Dialog

ID: Q147301

The information in this article applies to:

SUMMARY

In Microsoft Excel version 5.0, the mouse pointer is normally displayed as an hourglass when you run a macro. The exception to this is when you run a macro from a control in a custom dialog box. In this case, the mouse pointer continues to be displayed as an arrow, and does not give you an indication that the macro (event procedure) is running. This article demonstrates how to change the mouse pointer in Microsoft Excel for Windows version 5.0 while displaying a dialog box from a Visual Basic for Applications macro in Microsoft Excel version 5.0.

NOTE: In Microsoft Excel version 7.0 you can change the mouse pointer to an hourglass.

For additional information, please see the following article in the Microsoft Knowledge Base:

   ARTICLE-ID: Q130044
   TITLE     : XL: Controlling Appearance of Mouse Pointer Within Macro

MORE INFORMATION

Microsoft Excel version 5.0 does not have a Cursor object; therefore, you cannot change the mouse pointer to an hourglass from a Visual Basic for Applications statement in the macro.

The example below demonstrates how to change the mouse pointer in Microsoft Excel for Windows version 5.0 while displaying a dialog box from a Visual Basic for Applications macro in Microsoft Excel version 5.0.

Microsoft provides examples of Visual Basic for Applications procedures for illustration only, without warranty either expressed or implied, including, but not limited to the implied warranties of merchantability and/or fitness for a particular purpose. The Visual Basic procedures in this article are provided 'as is' and Microsoft does not guarantee that they can be used in all situations. While Microsoft Product Support Services (PSS) professionals can help explain the functionality of a particular macro, they will not modify these examples to provide added functionality, nor will they help you construct macros to meet your specific needs. If you have limited programming experience, you may want to consult one of the Microsoft Solution Providers. Solution Providers offer a wide range of fee-based services, including creating custom macros. For more information about Microsoft Solution Providers, call Microsoft Customer Information Service at (800) 426-9400.

Visual Basic Code Example

'This example requires two dialog sheets.
'Dialog #1: "Maindialog" (without the quotation marks)
'Dialog #2: "WaitDialog" (without the quotation marks)

'On Dialog #1, place a button and assign the procedure, "showWaitDialog,"
'(without quotation marks)to the button.
'Set the DismissButton property for the button.

'On Dialog #2, "WaitDialog," assign the frame to the procedure,
'"WaitDialog," (without the quotation marks).

'Run the procedure "main" from a worksheet.
'The procedure "main" will display a dialog box with a button that is
'assigned to the procedure "showWaitDialog" (without the quotation marks).
'Click the button. This will run the procedure "showWaitDialog." When
"WaitDialog" shows, the procedure assigned to the frame will run. The
'procedure "WaitDialog" will run and show the dialog box "WaitDialog." The
'macro assigned to its frame "showWaitDialog" will run, changing the mouse
'pointer and showing the dialog box "WaitDialog."

'Code starts here:

   Option Explicit

   'Declaration for APIs.
   Private Declare Function loadCursor Lib "USER" _
   (ByVal hInstance As Integer, ByVal lpCursorName As Any) _
    As Integer

   Private Declare Function SetCursor Lib "USER" _
   (ByVal hCursor As Integer) As Integer

   'Standard Cursor IDs.
   Private Const IDC_ARROW = 32512&
   Private Const IDC_IBEAM = 32513&
   Private Const IDC_WAIT = 32514&
   Private Const IDC_CROSS = 32515&
   Private Const IDC_UPARROW = 32516&
   Private Const IDC_SIZE = 32640&
   Private Const IDC_ICON = 32641&
   Private Const IDC_SIZENWSE = 32642&
   Private Const IDC_SIZENESW = 32643&
   Private Const IDC_SIZEWE = 32644&
   Private Const IDC_SIZENS = 32645&

   Private oldcursor%, fWaitCursorSet As Boolean

   'This is the main subroutine.
   'This dialog has a button assigned to the procedure "showWaitDialog."
   Sub main()
       Application.DialogSheets("MainDialog").Show
   End Sub

   'This procedure should be assigned to the button on the Dialogsheet
   '"WaitDialog" (without quotation marks).
   Sub showWaitDialog()
     Application.DialogSheets("WaitDialog").Show
   End Sub

   'This sub uses APIs to change the mouse pointer.
   Sub SetWait(fSetWaitCursor As Boolean)
    'If they have not set the cursor to wait, do not try to un-set it.
    If fSetWaitCursor Then
      oldcursor% = SetCursor(loadCursor(0, IDC_WAIT))
       fWaitCursorSet = True
     ElseIf Not fSetWaitCursor And fWaitCursorSet Then
       SetCursor oldcursor%
       fWaitCursorSet = False
      End If
   End Sub

   'Assign this procedure to the frame of the Dialogsheet "WaitDialog"
   '(without the quotation marks).

   Sub WaitDialog()
     Application.SendKeys ("~")
    MsgBox "This does not show"

   'This line changes the mouse pointer to an Hour Glass.
    SetWait (IDC_WAIT)

    'Put your procedure here in place of TestLoop.
    TestLoop
    SetWait (IDC_ARROW)
    Application.DialogSheets("WaitDialog").Hide
    End Sub

   Sub TestLoop()
   Dim x As Integer
     For x = 1 To 200
     ActiveCell.Value = x
     ActiveCell.Offset(1, 0).Select
     Next x
   End Sub

Additional query words: 5.00
Keywords          :  
Version           : 5.00
Platform          : WINDOWS

Last Reviewed: May 19, 1999