2012-07-06 23 views
8

Pracuję nad projektem VBA opartym na skoroszycie. Kod otwiera nowy skoroszyt i wywołuje zewnętrzny interfejs API, który pobiera i wstawia kilka danych do wielu arkuszy tego nowego skoroszytu. Dezaktywuję aktualizację ekranu (Application.Screenupdating = False), więc początkowo ekran pozostaje skupiony na oryginalnym skoroszycie, podczas gdy interfejs API pobiera dane z drugiego skoroszytu w tle. Jednak ekran przełącza się do nowego skoroszytu, gdy interfejs API wstawi dane. Jak mogę temu zapobiec? Dzięki!Ukrywanie aktywnego skoroszytu programowo w programie Excel

Odpowiedz

2

Należy zapisać i zamknąć skoroszyt docelowy lub wybrać oryginalny skoroszyt przed ponownym włączeniem opcji situpdating.

4

można spróbować przy użyciu funkcji ShowWindow API:

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 

lub alternatywnie, funkcja LockWindowUpdate API (dzięki Chip 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

Należy zauważyć, że kod Chipa Pearsona używa FindWindow do uzyskania uchwytu edytora VB. Możesz zignorować część FindWindow i po prostu użyć właściwości Hwnd obiektu aplikacji swojego skoroszytu docelowego jako argumentu dla LockWindowUpdate. Zostawiłem to tam, więc masz obie alternatywy. – mkingston

+1

"ShowWindow" API jest lepszy, ponieważ nie będzie miał żadnych skutków ubocznych, porównaj z "ActiveWorkbook.Windows (1) .Visible = False". W moim teście, po zapisaniu skoroszytu z ".Windows (1) .Visible = False", musisz ustawić Visible back na True, zanim będziesz mógł przeglądać dane. – bobyuan

16

Ukrywanie aktywny skoroszyt jest możliwe

ActiveWorkbook.Windows(1).Visible = False 

Być może trzeba będzie wymienić ActiveWorkbook z odpowiednim odwołaniem, jeśli dany skoroszyt nie jest aktywny i/lub dodaje pętlę podobną do For i = 1 To ActiveWorkbook.Windows.Count, jeśli skoroszyt ma wiele okien.

+0

+1 Ta metoda jest prosta w użyciu i możesz po prostu uruchomić ją ponownie z "True" po zakończeniu kodu –

Powiązane problemy