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
,而不是在Sheets
或Workbook
。 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