excel / VBA将工作表名称传递给函数

时间:2016-12-05 14:10:07

标签: excel vba macros basic

我的纸张很少,并且需要一次特定的单元格(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

但是我收到以下错误

  

编译错误。预期的变量或例程而非形式

出了什么问题?

有人帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您的Public Function ColorLabel(LabelName)应放在Module内,而不是SheetsWorkbook中的Sheets。我们通常会将代码与Workbook个事件或Public Function ColorLabel(LabelName)事件相关联。

查看Private function Worksheet_Change(ByVal Target As Range)代码的图片

enter image description here

您的Workbook_SheetChange应该在Workbook事件中(在Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ColorLabel (Sh.Name) End Sub 模块中):

enter image description here

<强>代码:

ColorLabel

您可以通过检查Target是否在Range("A1")内是否在对任何工作表中的任何单元格所做的每次更改时调用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 函数来改进您的代码,请参阅下面的代码:

改进代码:

fl=name:display_name

答案 1 :(得分:0)

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

    ThisWorkbook.ColorLabel Me.Name

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

然而,更好的设计将是:

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

答案 2 :(得分:0)

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

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