【问题标题】:excel/VBA pass a sheetname to a functionexcel/VBA 将工作表名称传递给函数
【发布时间】:2016-12-05 14:10:06
【问题描述】:

我的工作表很少,需要一个特定单元格 (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

但我收到以下错误

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

怎么了?

有人帮帮我吗?

谢谢!

【问题讨论】:

  • 你应该插入一个new 模块并将你的代码放在那里,而不是ThisWorkbook 模块

标签: excel vba macros basic


【解决方案1】:

您的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是否在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

【讨论】:

    【解决方案2】:

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

        ThisWorkbook.ColorLabel Me.Name
    

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

    但是,更好的设计应该是:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2021-04-17
        • 2017-07-30
        相关资源
        最近更新 更多