Excel VBA без обновления экрана при использовании Worksheet_Activate () - PullRequest
0 голосов
/ 16 октября 2018

Я создал макрос, который сворачивает определенное количество столбцов на основе входного листа.Макрос работает, когда пользователь активирует лист (ы), как показано ниже.

Worksheet_Activate macro:

Private Sub Worksheet_Activate()
ActiveSheet.Unprotect "mypassword"

Call collapsecolumns

ActiveSheet.Protect "mypassword"

End sub

Макрос, который называется:

Public Sub collapsecolumns()

Dim ws1 As Worksheet: Set ws1 = Sheets("inputSheet")
Dim ws2 As Worksheet: Set ws2 = ActiveSheet
Dim sheetNo As Integer, colToCollapse As Integer

'number in sheet name define range for counting columns to collapse
sheetNo = Right(ws2.Name, 1) 

'input range differs depending on which sheet is chosen
colToCollapse = Application.WorksheetFunction.CountA(ws1.Range("J" & ((6 * sheetNo) - 4) & ":J" & ((6 * sheetNo) + 1)))

ws2.Range(Cells(1, 1), Cells(1, 35)).EntireColumn.Hidden = False

If colToCollapse = 0 Then
    Exit Sub
End If

ws2.Range(Cells(1, colToCollapse * 6), Cells(1, 35)).EntireColumn.Hidden = True

End Sub

Однако, когда лист активирован, вы видели, как столбцы сворачивались (или разворачивались) в зависимости от того, что вы написали на другом листе.У меня есть различные комбинации и размещения ScreenUpdate = False и CompleteEvents = False для маскировки свертывания, но безуспешно

Есть ли способ, когда пользователь впервые видит лист, когда столбцы свернуты, когдаиспользование Worksheet_Activate ()?

1 Ответ

0 голосов
/ 19 октября 2018

Я добавил две строки кода, чтобы пользователь мог видеть, когда столбцы скрыты

Public Sub collapsecolumns()

    Dim ws1 As Worksheet: Set ws1 = Sheets("inputSheet")
    Dim ws2 As Worksheet: Set ws2 = ActiveSheet
    Dim sheetNo As Integer, colToCollapse As Integer

    'number in sheet name define range for counting columns to collapse
    sheetNo = Right(ws2.Name, 1)

    'input range differs depending on which sheet is chosen
    colToCollapse = Application.WorksheetFunction.CountA(ws1.Range("J" & ((6 * sheetNo) - 4) & ":J" & ((6 * sheetNo) + 1)))

    ws2.Range(Cells(1, 1), Cells(1, 35)).EntireColumn.Hidden = False

    If colToCollapse = 0 Then
        Exit Sub
    End If

    ActiveWindow.ScrollColumn = 32
    Application.Wait (Now + TimeValue("0:00:1"))
    ws2.Range(Cells(1, colToCollapse * 6), Cells(1, 35)).EntireColumn.Hidden = True

End Sub

Сначала он переместит лист Excel в столбцы, которые будут скрыты, затем он будет ждать 1 секунду.а затем скрыть столбцы

Я надеюсь, что это то, что вы искали ...

...