我执行一个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)
答案 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")