2012-07-06 39 views
8

Estoy trabajando en un proyecto de VBA basado en un libro de trabajo. El código abre un nuevo libro de trabajo y llama a una API externa que descarga e inserta un montón de datos en varias hojas de trabajo de este nuevo libro de trabajo. Desactivé la Actualización de pantalla (Application.Screenupdating = False), por lo que inicialmente la pantalla permanece enfocada en el libro original mientras que la API descarga datos en el otro libro en segundo plano. Sin embargo, la pantalla cambia al nuevo libro de trabajo una vez que la API inserta los datos. ¿Cómo puedo evitar que esto suceda? ¡Gracias!Ocultar el libro de trabajo activo mediante programación en Excel

Respuesta

2

O bien debe guardar y cerrar el libro de trabajo de destino o seleccionar el libro de trabajo original antes de volver a activar la actualización de pantalla.

4

Usted podría tratar de usar la función de la API ShowWindow:

Public Declare Function ShowWindow Lib "user32.dll" _ 
    (ByVal HWND As Long, ByVal nCmdShow As Long) As Long 

Const SW_HIDE as Long = 0 
Const SW_SHOW as Long = 5 

ShowWindow otherWorkbookApplication.Hwnd, SW_HIDE 

'Your code here 

ShowWindow otherWorkbookApplication.Hwnd, SW_SHOW 

O, alternativamente, la función API LockWindowUpdate (gracias al chip de Pearson, http://www.cpearson.com/excel/vbe.aspx):

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
    (ByVal ClassName As String, ByVal WindowName As String) As Long 

Private Declare Function LockWindowUpdate Lib "user32" _ 
    (ByVal hWndLock As Long) As Long 


Sub EliminateScreenFlicker() 
    Dim VBEHwnd As Long 

    On Error GoTo ErrH: 

    Application.VBE.MainWindow.Visible = False 

    VBEHwnd = FindWindow("wndclass_desked_gsk", _ 
     Application.VBE.MainWindow.Caption) 

    If VBEHwnd Then 
     LockWindowUpdate VBEHwnd 
    End If 

    ''''''''''''''''''''''''' 
    ' your code here 
    ''''''''''''''''''''''''' 

    Application.VBE.MainWindow.Visible = False 
ErrH: 
    LockWindowUpdate 0& 
End Sub 
+0

Tenga en cuenta que el código de Chip Pearson utiliza FindWindow para obtener el control del Editor de VB. Podría ignorar la parte FindWindow y simplemente usar la propiedad Hwnd del objeto de aplicación de su libro de trabajo como argumento para LockWindowUpdate. Lo dejé allí, así que tienes ambas alternativas. – mkingston

+1

API "ShowWindow" es mejor, ya que no tendrá ningún efecto secundario, se compara con "ActiveWorkbook.Windows (1). Visible = Falso". En mi prueba, una vez que un libro de trabajo se guarda con ".Windows (1) .Visible = False", necesita volver a establecer Visible en True antes de poder ver los datos. – bobyuan

16

ocultar el libro activo es posible con

ActiveWorkbook.Windows(1).Visible = False 

Es posible que debas reemplazar ActiveWorkbook con una referencia apropiada si el libro de trabajo en cuestión no es el activo y/o agregue un bucle como For i = 1 To ActiveWorkbook.Windows.Count si el libro de trabajo tiene varias ventanas.

+0

+1 Este método es simple de usar y simplemente puede ejecutarlo nuevamente con "Verdadero" una vez que el código ha terminado de ejecutarse –

Cuestiones relacionadas