excel vba中如何获取筛选数据的正确行号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel vba中如何获取筛选数据的正确行号相关的知识,希望对你有一定的参考价值。

'获得筛选结果的行号
Sub 函数调用()
    Dim 行号 As Variant
    行号 = GetRowNum("A")
    '所得行号是一个数组,其中行号(0)未使用,如查筛选的第一行是标题的话,行号(1)是标题所在行,所以你的结果

是从行号(2)开始的。
End Sub
Function GetRowNum(Col As String) As Variant
    Dim i As Long
    Dim rng As Range
    Dim rng2 As Range
    Dim RowS()
    i = 1
    '将筛指定列的可见数据赋给rng,12是可见,2是常量,23是16+4+1+2
    Set rng = Range(Col & ":" & Col).SpecialCells(12).SpecialCells(2, 23)
    ReDim RowS(0 To rng.Count)
    For Each rng2 In rng
        RowS(i) = rng2.Row
        i = i + 1
    Next
    GetRowNum = RowS
End Function

参考技术A 我的方法是集成了多位大神的结果,解决了我的问题(我想将筛选出来的行及其后的三行一起删掉,筛选条件是宏录制的)。代码如下:
‘筛选条件,可使用宏录制,然后修改
j=rows("2:2000").specialcells(12).row ‘获取筛选的行号,“2:2000”是筛选的范围,根据需要修改
Rows(j & ":" & (j+3)).Select ’选中筛选的行及其后3行,根据需要修改
’选中后的操作,可使用宏录制,然后修改
参考技术B 这个问题中有些不好理解:筛选数据的结果往往是一批数据,它们的行号就不只一个,另外什么是正确行号,难道筛选数据还有非正确行号?
如果是要找出某数据的行号,可用:cells.find(某数据).row 代替,前提是某数据必须在表格的单元格中存在,某数据可以是文本型、数值型等,还可添加参数增加查找的限制条件。

Excel-VBA 从 Outlook AddressList 中获取筛选的集合

【中文标题】Excel-VBA 从 Outlook AddressList 中获取筛选的集合【英文标题】:Excel-VBA get filtered collection from Outlook AddressList 【发布时间】:2013-01-01 04:44:09 【问题描述】:

问题: 在我看来 AddressList 没有内置过滤器功能,例如 C# DataTable (DatTableObject.Select(filter criteria)),我正在寻找一种方法这个。

我正在访问的全球地址列表有大约一百万个条目,我需要搜索它多达 1000 次。

我正在使用交换用户名来查找人们的电子邮件,使用以下代码:

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntry = aList.AddressEntries("" + ExchangeName + "") 
            Set exUser = aEntry.GetExchangeUser

但它只检索我一个 AddressEntry,当我有几个具有相同 Exchange 名称的人时,这是一个问题 - 经常发生。

问题:当我在 Outlook 中搜索全局地址列表时,所有内容都按字母顺序排序并且速度很快,所有匹配项都以我输入的字符串开头。我怎样才能获得VBA 中的类似集合?

【问题讨论】:

某事告诉我 Outlook 地址列表应该可以使用 Windows 搜索进行查询。不确定这是否正确,或者您是否可以使用 VBA 中的 Windows 搜索查询,我必须承认。不过,如果您想看一下,基本文档位于msdn.microsoft.com/en-us/library/windows/desktop/…。不过,您需要一个 COM 处理程序来处理地址列表。 【参考方案1】:

AddressEntries 对象是AddressEntry 对象的集合。 当您直接索引到 AddressEntries 集合时,您会根据提供的 Index 参数返回一个 single AddressEntry 对象。 Index 参数可以是索引号,也可以是项目的默认属性。

由于AddressEntry 项的默认属性是.Name 属性,因此返回集合中与.Name 属性匹配的任何第一项。


如果要返回集合中与.Name 属性匹配的所有AddressEntry 对象,则需要循环遍历集合。

现在,在 .Net 中,您可以使用 For...Next 遍历集合,我相信您也可以在 VBA 中执行此操作,但我就是想不起来。 例如:

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntries = aList.AddressEntries
            For each aEntry in aEntries
                if aEntry.Name="" + ExchangeName + "" Then
                    'Do something with aEntry object
                End If
            Next

如果由于某种原因不起作用,您可以使用 GetFirstGetNext 方法遍历集合。 例如:

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntries = aList.AddressEntries
            Set aEntry = aEntries.GetFirst
            Do While Not aEntry is Nothing
                if aEntry.Name="" + ExchangeName + "" Then
                    'Do something with aEntry object
                End If
                Set aEntry = aEntries.GetNext
            Loop

至于按字母排序,请查看Sort Method。


就构建功能而言

...我会看到以我输入的字符串开头的所有匹配项。

我不确定你想如何“呈现”匹配项,或者你想在哪里输入字符串。但一般的想法是创建一个接受输入参数(例如"MatchName" As String)的函数并执行像上面这样的循环以查找该字符串上您想要查看的任何属性的所有匹配项,然后您将返回一个数组,或者您可以用来“呈现”信息的东西。

如果您想让它动态化,以便“在您键入时”更新列表,您可以从KeyPress 事件运行更新过程。为了在您输入一个单词时不遍历整个集合,您可能希望存储该数组,然后在键入每个额外的字母时,您可以遍历该数组并删除不匹配项(缩小结果)。在此之前,您可能需要进行某种检查以查看是否删除了一个字母(例如检查文本框中字符串的长度),这将告诉您的程序重新运行对 AddressEntries 集合的检查(扩大结果)。

无论如何,这是您可以做到的一种总体思路。

【讨论】:

以上是关于excel vba中如何获取筛选数据的正确行号的主要内容,如果未能解决你的问题,请参考以下文章

excle vba,如何查找一个已知值的行号和列号?

excel公式问题,获取行号列号之后,如何获取该单元格内的值。

使用Aspose.Cells如何获取Excel中的真实数据?

用VBA筛选日期区间

excel vba如何查询某单元格所在行

如何正确地从 Excel 工作表的 VBA 连接到另一个 Excel 工作表?