简体   繁体   中英

Excel VBA no screenupdate when use Worksheet_Activate()

I have made a macro which collapses an certain number of columns based on an input sheet. The macro is running, when the user is activating the sheet(s), as seen below.

Worksheet_Activate macro:

Private Sub Worksheet_Activate()
ActiveSheet.Unprotect "mypassword"

Call collapsecolumns

ActiveSheet.Protect "mypassword"

End sub

The macro which is called:

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

However, when the sheet is activated, you seen the columns collapse (or uncollapse) depending on what you wrote in the other sheet. I've various combination and placements of ScreenUpdate=False and EntireEvents=False to mask the collapsing, but without success

Is there any way, that the user first sees the sheet, when the columns have been collapsed, when using Worksheet_Activate()?

I have added two lines of code so that the user can view when the columns get hidden

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

It will first move the excel sheet to the columns which will hide then it will wait for 1 second and then hide the columns

I hope this is what you were looking for...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM