如何在不使用循环的情况下返回VBA中的一系列单元格?

比方说,我有一个像下面这样的Excel电子表格:

 col1 col2
 ------------
狗1狗
狗2狗
狗3狗
狗4狗
猫1猫
猫2猫
猫3猫

我想基于“狗”或“猫”来返回一系列单元格(dog1,dog2,dog3,dog4)或(cat1,cat2,cat3)

我知道我可以循环检查一个接一个,但是在VBA中有没有其他的方法,所以我可以一次性“过滤”结果?

也许Range.Find(XXX)可以帮助,但我只看到一个单元格的例子不是一个单元格的范围。

请指教

问候

以下是有关使用logging集来返回范围的注意事项。

Sub GetRange() Dim cn As Object Dim rs As Object Dim strcn, strFile, strPos1, strPos2 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") strFile = ActiveWorkbook.FullName strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & strFile & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';" cn.Open strcn rs.Open "SELECT * FROM [Sheet1$]", cn, 3 'adOpenStatic' rs.Find "Col2='cat'" strPos1 = rs.AbsolutePosition + 1 rs.MoveLast If Trim(rs!Col2 & "") <> "cat" Then rs.Find "Col2='cat'", , -1 'adSearchBackward' strPos2 = rs.AbsolutePosition + 1 Else strPos2 = rs.AbsolutePosition + 1 End If Range("A" & strPos1, "B" & strPos2).Select End Sub 

这家伙有一个很好的FindAllfunction:

http://www.cpearson.com/excel/findall.aspx

忘记另一个XL2007function:高级过滤。 如果你想在VBA中,我从一个logging的macros得到这个:

 Range("A1:A1000000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:= Range("F1"), Unique:=True 

我在0.35秒的时间内计时

无可否认,如果你没有2007年,那么用处不大。

谢谢DJ。

FindAll解决scheme仍然使用VBA循环来完成任务。

我试图find一种方式,而不使用用户级别的循环来过滤excel VBA中的范围。

这里我find了一个解决scheme 它利用优秀的内置引擎来完成这项工作。

(1)使用worksheetfunction.CountIf(“Cat”)来获得“猫”单元的数量

(2)使用。查找(“猫”)得到“猫”的第一行

与行数和第一行,我可以得到“猫”范围已经。

这个解决scheme的好处是:没有用户级循环,如果范围很大,这可能会提高性能。

Excel支持ODBC协议。 我知道您可以从Access数据库连接到Excel电子表格并进行查询。 我没有做到这一点,但也许有一种方法可以从Excel内部使用ODBC查询电子表格。

除非你使用veeeery旧机器,或者你有一个bazillion行的XL2007工作表,否则一个循环将会很快。 诚实!

不要相信我? 看这个。 我用这个随机字母填充了一百万行的范围:

 =CHAR(RANDBETWEEN(65,90)) 

然后我编写了这个函数,并使用Control-Shift-Enter从26个单元格范围中调用它:

 =TRANSPOSE(UniqueChars(A1:A1000000)) 

下面是几分钟内我非常优化的VBAfunction:

 Option Explicit Public Function UniqueChars(rng As Range) Dim dict As New Dictionary Dim vals Dim row As Long Dim started As Single started = Timer vals = rng.Value2 For row = LBound(vals, 1) To UBound(vals, 1) If dict.Exists(vals(row, 1)) Then Else dict.Add vals(row, 1), vals(row, 1) End If Next UniqueChars = dict.Items Debug.Print Timer - started End Function 

在我一年之久的Core 2 Duo T7300(2GHz)笔记本电脑上,耗时0.58秒。