13

ワークブックに基づく VBA プロジェクトに取り組んでいます。コードは新しいワークブックを開き、この新しいワークブックの複数のワークシートに大量のデータをダウンロードして挿入する外部 API を呼び出します。画面の更新 ( ) を無効にApplication.Screenupdating = Falseしたため、最初は画面が元のワークブックにフォーカスしたままになり、API はバックグラウンドで他のワークブックのデータをダウンロードします。ただし、API がデータを挿入すると、画面は新しいワークブックに切り替わります。どうすればこれを防ぐことができますか? ありがとう!

4

3 に答える 3

27

アクティブなワークブックを非表示にすることは可能です

ActiveWorkbook.Windows(1).Visible = False

ActiveWorkbook問題のワークブックがアクティブでない場合は、適切な参照に置き換えるFor i = 1 To ActiveWorkbook.Windows.Countか、ワークブックに複数のウィンドウがある場合のようにループを追加する必要がある場合があります。

于 2012-07-06T07:15:57.553 に答える
5

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

または、LockWindowUpdate API 関数 (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
于 2012-07-06T01:54:40.470 に答える