| 
BUG: VB Hangs While Automating Excel Using OLE Control
ID: Q181889
 
 | 
The information in this article applies to:
- 
Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, versions  5.0, 6.0
- 
Microsoft Office 2000 Developer
- 
Microsoft Excel  2000
- 
Microsoft Excel  97 for Windows
SYMPTOMS
Your application hangs while automating Microsoft Excel 97 or Excel 2000 via the OLE
control.
CAUSE
This problem occurs while automating an Excel 97 or Excel 2000 object that is
using in-place activation in an OLE control. The problem does not occur
with all methods or properties. This problem has been reported with the
following method/properties in the Microsoft Excel object library:
   PrintOut
   Delete
   Dialog.Show
RESOLUTION
A workaround is to not activate the object while running the automation
code. However, if you need to activate the object, do so in a separate
window instead of using in-place activation. For example, this line
activates the object in a separate window:
   
OLE1.DoVerb vbOLEOpen 
Another workaround is to deactivate the object before calling the
automation code that causes Visual Basic to hang. For example, the PrintOut
and Delete methods cause this problem to occur. Before using these methods,
you can deactivate the object prior to calling the method, then optionally
reactivate the object after calling the method. See the MORE INFORMATION
section later in this article for an example.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article. 
MORE INFORMATION
Steps to Reproduce Behavior
- Start a new Standard EXE project in Visual Basic. Form1 is created by
   default.
- On the Project menu, click References, and then select the Microsoft
   Excel 8.0 object library. For Excel 2000, select the version 9.0 object library.
- Place an OLE control on Form1 and create a new Microsoft Excel
   worksheet. The OLE control properties should be:
 
 | Property | Value | 
|---|
 | Name | OLE1 |  | Class | Excel.Sheet.8 |  
 
- Place a CommandButton on Form1.
- Copy the following code to the Code Window of Form1:
      Private Sub Command1_Click()
         Dim xlBook As Excel.Workbook
         Set xlBook = OLE1.object
         OLE1.DoVerb vbOLEShow 'or OLE1.DoVerb vbOLEUIActivate
         xlBook.Worksheets("Sheet1").Range("A1").Value = "Hello"
         xlBook.Worksheets("Sheet1").PrintOut
         Set xlBook = Nothing
      End Sub 
- On the Run menu, click Start, or press the F5 key to start the program.
- Click the CommandButton. Visual Basic hangs after it encounters the
   PrintOut method. The object will be correctly printed, but Visual Basic
   stops responding. You must select End Task in the task list (by
   pressing the CTRL+ALT+DEL keys) to end the Visual Basic project and
   Excel. Repeat until both Excel and the Visual Basic project are removed
   from the task list.
- Repeat the steps again with the code modified as follows:
      Private Sub Command1_Click()
         Dim xlBook As Excel.Workbook
         Set xlBook = OLE1.object
         OLE1.DoVerb vbOLEShow 'or OLE1.DoVerb vbOLEUIActivate
         xlBook.Worksheets("Sheet1").Range("A1").Value = "Hello"
         Command1.SetFocus 'causes deactivation of object
         xlBook.Worksheets("Sheet1").PrintOut
         OLE1.DoVerb vbOLEShow 'optional: reactivates object
         Set xlBook = Nothing
      End Sub 
 
The problem is avoided by deactivating the object before calling the
PrintOut method. Setting focus to any control on the form will deactivate
the OLE control object.
Additional query words: 
locks freezes crashes 
Keywords          : kbCtrl kbVBp kbVBp500bug kbVBp600bug kbGrpDSO kbOffice2000 kbExcel97 kbexcel2000 
Version           : WINDOWS:2000,5.0,6.0,97; :
Platform          : WINDOWS 
Issue type        : kbbug