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
Należy zapisać i zamknąć skoroszyt docelowy lub wybrać oryginalny skoroszyt przed ponownym włączeniem opcji situpdating.
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
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.
+1 Ta metoda jest prosta w użyciu i możesz po prostu uruchomić ją ponownie z "True" po zakończeniu kodu –
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
"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