Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA中的调用函数_Excel_Vba_Function_Autorun - Fatal编程技术网

Excel VBA中的调用函数

Excel VBA中的调用函数,excel,vba,function,autorun,Excel,Vba,Function,Autorun,我是VBA新手,所以我可能做了一些完全错误的事情,也可能只是一个可笑的小错误/缺乏知识。所以,如果你有一个更简单的方法来做我想做的事情(解释如下),我愿意接受任何解决方案 所以我想计算具有特定背景颜色的单元格 为此,我在一个模块中提供了: Function CountCellsByColor(rData As Range, cellRefColor As Range) As Long Dim indRefColor As Long Dim cellCurrent As Range

我是VBA新手,所以我可能做了一些完全错误的事情,也可能只是一个可笑的小错误/缺乏知识。所以,如果你有一个更简单的方法来做我想做的事情(解释如下),我愿意接受任何解决方案

所以我想计算具有特定背景颜色的单元格

为此,我在一个模块中提供了:

Function CountCellsByColor(rData As Range, cellRefColor As Range) As Long
    Dim indRefColor As Long
    Dim cellCurrent As Range
    Dim cntRes As Long
    Application.ScreenUpdating = False

    Application.Volatile
    cntRes = 0
    indRefColor = cellRefColor.Cells(1, 1).Interior.Color
    For Each cellCurrent In rData
        If indRefColor = cellCurrent.Interior.Color Then
            cntRes = cntRes + 1
        End If
    Next cellCurrent

    CountCellsByColor = cntRes
    Application.ScreenUpdating = True
End Function
它可以工作,它确实使用
=CountCellsByColor(B2:B83,H2)
计算特定的单元格(
B2:B83
是范围,
H2
是我用作该背景色示例的单元格。我也在单独的单元格中计算
C2:C83
D2:D83

但我希望它在单元格的背景颜色在给定范围内发生变化时自动执行

为此,我在工作表的代码中写下:

Public Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$2:$D$83" Then
        Application.EnableEvents = False
        Call CountCellsByColor()
        Application.EnableEvents = True
    End If
End Sub 
但是我得到一条“编译错误:参数不是可选的”错误消息

你认为我应该如何使它自动工作?如何调用此sub中的函数

范围(“I4”)。值=CountCellsByColor(范围(“B2:D83”)、范围(“H2”))


这将调用您的函数,但正如Chris Neilsen所说,我将远离更改事件。

因此,有许多小细节需要澄清

首先,
工作表_Change
函数不捕获颜色变化。如果颜色因编写的函数/子函数而改变,则应在发生改变的地方调用函数。如果更改是由用户完成的,我找到的最好的参考是


其次,if语句
if Target.Address=“$B$2:$D$83”只有在“Target”是所有这些单元格时才会返回true。如果目标函数仅包含该范围中的一个或部分单元格,则If语句将返回false。我建议使用一种更类似于以下内容的if声明:

If Not Intersect(Target, Target.Worksheet.Range("B2:D83")) Is Nothing

第三,您需要将参数添加到函数调用中,例如:

CountCellsByColor(Target.Worksheet.Range("B2:D83"),Target.Worksheet.Range("H2"))
Target。工作表
指目标所在的工作表。
.Range
指向所选工作表上的单元格,而
的“B2:D83”
是所需单元格的地址


但是,请注意,这目前不会将
CountCellsByColor
的输出分配给任何对象,因此除非将其分配给变量或工作表单元格,否则结果将丢失。

您是否可以给出一个您认为应该如何调用它的示例?我不知道你有什么问题?或者,如果您在尝试时收到错误消息,消息会说什么?@Phanti我相信
Call
正在贬值,应该是不必要的。@Mistella我尝试的:````公共子工作表`更改(ByVal Target As Range)if Target.Address=“$B$2:$D$83”然后Application.EnableEvents=False Call CountCellsByColor()Application.EnableEvents=True End If End Sub'``我得到的是一个编译错误:参数不是可选的错误消息。单元格颜色更改时不会触发工作表更改。如果是宏改变了颜色,那么调用函数there@Alex,正如您所发现的,自动响应细胞颜色变化是很困难的,并且无法通过任何方式很好地解决。您最好重新评估您的设计。如果您发布了为什么要这样做,我们可能会建议一个替代方案。