excel/VBA 将工作表名称传递给函数
excel/VBA pass a sheetname to a function
我有几个 sheet,并且需要一次特定单元格 (A1) 等于“1”,一旦更改它们的值,标签颜色就会变为绿色。
我在 ThisWorkBook 中声明了以下函数:
Public Function ColorLabel(LabelName)
Set Foglio = Sheets(LabelName)
Set Target = Foglio.Range("A1")
If Target = "1" Then
Foglio.Tab.ColorIndex = 4
Else
Foglio.Tab.ColorIndex = xlNone
end if
End Function
因此,在每个 sheet 中,我定义了以下代码
Private function Worksheet_Change(ByVal Target As Range)
ColorLabel(ActiveSheet.CodeName)
end function
但我收到以下错误
Compilation error. Expected variable or routine and not form
怎么了?
有人帮帮我吗?
谢谢!
您的 Public Function ColorLabel(LabelName)
应该放在 Module
中,而不是 Sheets
或 Workbook
中的一个。通常我们将只与 Sheets
事件或 Workbook
事件相关的代码放在那里。
查看图片获取 Public Function ColorLabel(LabelName)
代码
您的 Private function Worksheet_Change(ByVal Target As Range)
应该在 Workbook_SheetChange
事件中(在 Workbook
模块中):
代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ColorLabel (Sh.Name)
End Sub
您可以通过检查 Target
是否在 [=24= 中对任何 sheet 中的任何单元格所做的每个更改不调用 ColorLabel
函数来改进您的代码],见下面的代码:
改进代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' call the ColorLabel function only if value in Cell A1 was modified
If Not Intersect(Target, Range("A1")) Is Nothing Then
ColorLabel (Sh.Name)
End If
End Sub
如果函数定义在ThisWorkbook
模块中,你应该这样调用:
ThisWorkbook.ColorLabel Me.Name
顺便说一下,ColorLabel 应该是一个 Sub 而不是函数(它没有 return 任何东西)。
但是,更好的设计应该是:
- 将sub移动到一个独立的代码模块
或
- 使用
Workbook_SheetChange
将 sub 重命名为事件处理程序
为什么你需要传递工作表的名称?只需传递对工作表本身的引用:
Public Function ColorLabel(Foglio As Worksheet)
Dim Target As Range
Set Target = Foglio.Range("A1")
If Target.Value = "1" Then
Foglio.Tab.ColorIndex = 4
Else
Foglio.Tab.ColorIndex = xlNone
End If
End Function
'If this is the event handler you want...
Private Function Worksheet_Change(ByVal Target As Range)
ColorLabel Me
End Function
'Or in ThisWorkbook:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ColorLabel Sh
End Sub
我有几个 sheet,并且需要一次特定单元格 (A1) 等于“1”,一旦更改它们的值,标签颜色就会变为绿色。
我在 ThisWorkBook 中声明了以下函数:
Public Function ColorLabel(LabelName)
Set Foglio = Sheets(LabelName)
Set Target = Foglio.Range("A1")
If Target = "1" Then
Foglio.Tab.ColorIndex = 4
Else
Foglio.Tab.ColorIndex = xlNone
end if
End Function
因此,在每个 sheet 中,我定义了以下代码
Private function Worksheet_Change(ByVal Target As Range)
ColorLabel(ActiveSheet.CodeName)
end function
但我收到以下错误
Compilation error. Expected variable or routine and not form
怎么了?
有人帮帮我吗?
谢谢!
您的 Public Function ColorLabel(LabelName)
应该放在 Module
中,而不是 Sheets
或 Workbook
中的一个。通常我们将只与 Sheets
事件或 Workbook
事件相关的代码放在那里。
查看图片获取 Public Function ColorLabel(LabelName)
代码
您的 Private function Worksheet_Change(ByVal Target As Range)
应该在 Workbook_SheetChange
事件中(在 Workbook
模块中):
代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ColorLabel (Sh.Name)
End Sub
您可以通过检查 Target
是否在 [=24= 中对任何 sheet 中的任何单元格所做的每个更改不调用 ColorLabel
函数来改进您的代码],见下面的代码:
改进代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' call the ColorLabel function only if value in Cell A1 was modified
If Not Intersect(Target, Range("A1")) Is Nothing Then
ColorLabel (Sh.Name)
End If
End Sub
如果函数定义在ThisWorkbook
模块中,你应该这样调用:
ThisWorkbook.ColorLabel Me.Name
顺便说一下,ColorLabel 应该是一个 Sub 而不是函数(它没有 return 任何东西)。
但是,更好的设计应该是:
- 将sub移动到一个独立的代码模块 或
- 使用
Workbook_SheetChange
将 sub 重命名为事件处理程序
为什么你需要传递工作表的名称?只需传递对工作表本身的引用:
Public Function ColorLabel(Foglio As Worksheet)
Dim Target As Range
Set Target = Foglio.Range("A1")
If Target.Value = "1" Then
Foglio.Tab.ColorIndex = 4
Else
Foglio.Tab.ColorIndex = xlNone
End If
End Function
'If this is the event handler you want...
Private Function Worksheet_Change(ByVal Target As Range)
ColorLabel Me
End Function
'Or in ThisWorkbook:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ColorLabel Sh
End Sub