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 中,而不是 SheetsWorkbook 中的一个。通常我们将只与 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