【发布时间】:2017-09-22 01:22:39
【问题描述】:
我在这里摸不着头脑,真的希望有人能指出我正确的方向。
我正在尝试创建一个 VBA 函数来计算某个范围内文本的唯一出现次数,并使用网上找到的代码变体来实现这一点。
基本上代码(如下)执行以下操作:
- 创建临时工作簿
- 将删除重复的文本列表复制到该工作簿中
- 计算等于多少行。
这是我目前的代码:
Public Function TestingMe() As Long
Dim numrows As Long
Dim rng As Range
Dim tempwb As Workbook, origwb As Workbook
Set origwb = ActiveWorkbook
Set tempwb = Workbooks.Add
Set rng = tempwb.Sheets(1).Range("A1")
origwb.Worksheets("data").Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rng, Unique:=True
numrows = tempwb.Application.WorksheetFunction.CountA(tempwb.Sheets(1).Range("A:A").EntireColumn)
tempwb.Close (False)
Set origwb = Nothing
Set tempwb = Nothing
Debug.Print (numrows)
TestingMe = numrows
End Function
通过代码编辑器的“即时”窗口运行时,代码运行良好,但当用作工作表中的函数时,“COUNTA”函数正在查看 origwb 的第一张工作表,而不是临时工作簿所在的位置重复数据已复制到。
这似乎是一个参考/范围问题,但正如您所见,我已尝试在代码中专门引用所有内容以尝试解决该问题,但没有任何乐趣。
任何指针都将不胜感激。
提前致谢 马丁
【问题讨论】:
-
接受的答案中的代码对您有帮助吗? stackoverflow.com/questions/1676068/… 或者您应该将
Set rng = tempwb.Sheets(1).Range("A1")更改为Set rng = tempwb.Sheets(1).Range("A:A")? -
从单元格调用的 UDF 无法添加新工作簿,也无法执行高级过滤。
-
@Rory - 混蛋,谢谢。看来我需要尝试另一种方法。
-
@RCaetano - 它有帮助,但不幸的是,它在处理更大的数据集时速度非常慢,所以如果可能的话,我正在寻找一种更快的机制
-
你只是在设置一个范围,据我所知,即使使用更大的数据集也不应该花这么长时间:)