功能没有实现

时间:2011-08-18 23:24:37

标签: vba excel-vba excel

我执行一个VBA代码,它接受数据库,对其进行处理并将其导出到工作表中。这工作正常。但是,我有一张工作表,根据特定工作表中的数据生成图表。数据没有实现。我必须进入单元格并单击Enter以实现它。我很确定有一种更简单的方法可以做到这一点。计算设置为自动,但似乎没有任何改变。

在我的单元格中,我有自己的vba函数,需要在报告完成后进行更新。当我单击单元格然后输入时,结果会更新,但我希望自动完成此操作。我希望这更清楚!

提前致谢,

Etienne NOEL

HEre是我的功能代码

   Public Function number_of_appearances(term As String, sheet As String, column As Integer) As Integer


Application.Volatile
    Dim number_of_rows As Integer
    Dim appearances As Integer
    Dim row As Integer

    appearances = 0
    row = 1
    number_of_rows = Worksheets(sheet).UsedRange.Rows.Count

    Do While row <= number_of_rows
        If Worksheets(sheet).Cells(row, column).Value = term Then
            appearances = appearances + 1
        End If
         row = row + 1
    Loop


    number_of_appearances = appearances

End Function
  

函数

的用户的单元格示例
=number_of_appearances('test';'sheet1'; 3)

1 个答案:

答案 0 :(得分:3)

听起来您的UDF可能不依赖于处理数据库时更改值的任何单元格 见This MSDN Link

发布您的UDF(或者如果您愿意,只发布它的标题)及其使用示例...

编辑:
是的,UDF的参数都不是单元格引用,因此当shet上的数据发生更改时,不会触发UDF重新计算。

您有两种选择:
1.重写UDF以包含引用在处理DB时更改值的单元格的参数 2.制作你的UDF volitile(在UDF代码中加入Application.Volatile警告:这可能是非常低效的,这取决于UDF的使用时间和计算密集程度

编辑2:
使用上面提到的第一个选项继承你的udf的重构:

Public Function number_of_appearances(term As String, rng As Range) As Integer
    Dim v As Variant
    Dim i As Long, j As Long
    Dim appearances As Long

    v = Intersect(rng, rng.Worksheet.UsedRange)
    For j = LBound(v, 2) To UBound(v, 2)
    For i = LBound(v, 1) To UBound(v, 1)
        If v(i, j) = term Then
            appearances = appearances + 1
        End If
    Next i, j
    number_of_appearances = appearances

End Function

使用喜欢     =number_of_appearances("test";Sheet1!C:C)

编辑3:
如果您所做的只是计算某个范围内字符串的出现次数,请考虑使用
    =COUNTIF(Sheet1!C:C;"test")