excel / VBA将一个sheetname传递给一个函数

我有几张纸,需要一次特定的单元格(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 

所以,在每一张我定义下面的代码

 Private function Worksheet_Change(ByVal Target As Range) ColorLabel(ActiveSheet.CodeName) end function 

但我得到以下错误

编译错误。 预期的variables或例程,而不是forms

怎么了?

谁来帮帮我?

谢谢!

如果函数在ThisWorkbook模块中定义,则应该这样调用它:

  ThisWorkbook.ColorLabel Me.Name 

顺便说一下,正如它写的,ColorLabel应该是一个Sub不是一个函数(它不会返回任何东西)。

但是,更好的devise将是:

  • 移动子到一个独立的代码模块或
  • 使用Workbook_SheetChange将sub重命名为事件处理程序

您的Public Function ColorLabel(LabelName)应放置在一个Module ,而不是在SheetsWorkbook 。 Usualy我们在那里放置仅与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是否在Range("A1") ,你可以改善你的代码,通过不对任何表格中的任何单元格所做的每一个改变调用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 

为什么你需要传递工作表的名字? 只需传递对工作表本身的引用:

 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