Excel 我想修改代码,以便在打开工作簿时立即运行宏

Excel 我想修改代码,以便在打开工作簿时立即运行宏,excel,vba,Excel,Vba,宏的作用是锁定包含所有日期的列,但包含今天日期的列除外。我在每一张纸上都对它进行了编码,并且在所有的纸上都是完全相似的。宏在任何单元格中的数据更改时运行。但我希望在打开工作簿时运行宏 我试图在“此工作簿”中编写代码,但我不知道如何编写。我也试着在“模块”中这样做,但没有成功 Private Sub Worksheet_Change(ByVal Target As Excel.Range) 'vps Dim x As Long x = 7 ThisWorkbook.ActiveS

宏的作用是锁定包含所有日期的列,但包含今天日期的列除外。我在每一张纸上都对它进行了编码,并且在所有的纸上都是完全相似的。宏在任何单元格中的数据更改时运行。但我希望在打开工作簿时运行宏

我试图在“此工作簿”中编写代码,但我不知道如何编写。我也试着在“模块”中这样做,但没有成功

 Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  'vps
  Dim x As Long
  x = 7
  ThisWorkbook.ActiveSheet.Unprotect Password:="123456"
  ThisWorkbook.ActiveSheet.Cells.Locked = False
  Do Until IsEmpty(Cells(5, x))
    If Cells(5, x) <> Date Then
      Columns(x).Locked = True
    End If
    x = x + 1
  Loop
  ThisWorkbook.ActiveSheet.Protect Password:="123456"
  End Sub
Private子工作表\u更改(ByVal目标为Excel.Range)
“副总裁
暗x等长
x=7
ThisWorkbook.ActiveSheet.Unprotect密码:=“123456”
ThisWorkbook.ActiveSheet.Cells.Locked=False
直到空为止(单元格(5,x))
如果单元格(5,x)为日期,则
列(x).Locked=True
如果结束
x=x+1
环
ThisWorkbook.ActiveSheet.Protect密码:=“123456”
端接头
我希望宏在工作簿打开时运行,而不仅仅是在单元格中的数据更改时运行。

锁定工作簿上的单元格打开 特征
  • 要在工作簿打开时运行以下(或任何)宏,您必须 要使用其工作簿,请单击“打开”事件。在VBA中双击此工作簿。在里面 第一个下拉菜单选择工作簿,第二个下拉菜单选择打开
  • 对于工作簿中包含此宏的每个工作表,取消保护 它会打开并解锁所有单元格。然后检查指定的行范围中的日期 并锁定未找到今天日期的整列单元格。 最后保护工作表
  • 此外,室内颜色将在以下单元格中有所不同: 找到了今天的日期
链接

代码 标准模块,例如模块1

Sub ProtectPrevious()

    Const cRow As Long = 5        ' Date Row Number
    Const cFirstC As Variant = 7  ' First Column Letter/Number e.g. 7 or "G"
    Const cToday As Long = 6      ' Today Cell ColorIndex e.g. 6 is Yellow
    Const cDays As Long = 15      ' Other Days ColorIndex e.g. 15 is some Gray

    Dim ws As Worksheet   ' Current Worksheet
    Dim LastC As Long     ' Last Column Number
    Dim j As Integer      ' Column Counter

    For Each ws In ThisWorkbook.Worksheets
        With ws
            ' Prepare for processing.
            .Unprotect Password:="123456"
            .Cells.Locked = False
            ' When there is no data in Date Row, continue with next worksheet.
            If .Rows(cRow).Find("*", .Cells(cRow, _
                    .Columns.Count), -4123, , 1) Is Nothing Then Exit For
            ' Calculate Last Column Number
            LastC = .Rows(cRow).Find("*", , -4123, , 1, 2).Column
            ' Remove formatting from other day(s) in Date Row.
            With .Range(.Cells(cRow, cFirstC), .Cells(cRow, LastC))
                .Interior.ColorIndex = cDays
            End With
            ' Loop through columns: from First Column to Last Column.
            For j = cFirstC To LastC
                If .Cells(cRow, j) <> Date Then
                    .Columns(j).Locked = True
                  Else
                    ' Apply formatting to 'today' in Date Row.
                    With .Cells(cRow, j)
                        .Interior.ColorIndex = cToday
                    End With
                End If
            Next
            .Protect Password:="123456"
        End With
    Next

End Sub

您是否尝试将其放入此工作簿中的工作簿\u Open()事件中?此代码有效。但当我打开excel文件时,似乎所有的工作表都是先处理好的,屏幕在稳定之前就好像出了什么问题(第一个工作表打开然后关闭,第二个工作表打开然后关闭等等)。在我保存它并再次打开文件之后,就没有这样的问题了。我能知道发生这种情况的原因吗。@Ashul garg:它可能与屏幕更新有关,您可以通过在For Each循环之前添加Application.screenUpdated=False,并在For Each循环之后使用Application.screenUpdated=True来抑制屏幕更新。
Private Sub Workbook_Open()
    ProtectPrevious
End Sub