在工作表更改时运行宏(即更改工作表,而不是工作表中的数据)

  • 本文关键字:工作 数据 运行 excel vba
  • 更新时间 :
  • 英文 :


我有一个20+工作表的工作簿。每个工作表有数据我输入,由吨列分开。我需要填写三个类别,例如"姓名"、"日期"one_answers"评论"。不再需要在每张纸上左右滚动来查找"姓名"、"日期"等信息。我正在考虑为这三个类别创建一个命名范围,当选择该工作表时。

我做不是需要触发这个namerange宏当一个单元格在一个工作表上的变化,而我需要它运行时,工作表本身的变化。(所以,我不认为Private Sub Worksheet_Change()是我想要的,我不需要监控工作表中的每个单元格。只是想知道表单本身是否发生了变化。

唯一的其他选择是使用Worksheet_Activate将代码添加到每个工作表。然而,我必须进入并添加代码到20+表,这是唯一的方法吗?我肯定我忘了什么……

宏应该是:

Private Sub Worksheet_Activate()
Dim ws as worksheet
Set ws = ActiveSheet
On Error Resume Next
' Delete the named ranges that exist, so you can reset
For Each nm In ActiveWorkbook.Names 
if nm = "Name" or nm = "Date" or nm = "Comment" Then nm.Delete 
Next nm
On Error Goto 0
ws.names.add Name:="Date", RefersTo:=ws.Range("A1")
ws.names.add Name:="Name", RefersTo:=ws.Range("KK1")
ws.names.add Name:="Comment", RefersTo:=ws.Range("ZZ1")
End Sub

所以这个想法是,当我激活一个新的工作表,它清除当前的"名称"/"日期"/"评论"命名范围,将其重置为引用活动工作表的地址。这样我就可以快速使用公式栏下拉到命名区域

除了在每个工作表中放入上述代码之外,还有什么其他想法吗?我试着把它放在ThisWorkbook,但它没有做任何事情。我没有考虑到什么?

使用Workbook_SheetActivate(ByVal Sh as object)

请看这里:https://learn.microsoft.com/en-us/office/vba/api/excel.workbook.sheetactivate

'put this sub in ThisWorkbook module (is workbook's event)
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call onActivate(Sh)
End Sub

'and this in a module
Public Sub onActivate(ws As Worksheet)
Dim nm As Excel.Name
On Error Resume Next
' Delete the named ranges that exist, so you can reset
For Each nm In ActiveWorkbook.Names
If nm = "Name" Or nm = "Date" Or nm = "Comment" Then nm.Delete
Next nm
On Error GoTo 0
ws.Names.Add Name:="Date", RefersTo:=ws.Range("A1")
ws.Names.Add Name:="Name", RefersTo:=ws.Range("KK1")
ws.Names.Add Name:="Comment", RefersTo:=ws.Range("ZZ1")
End Sub