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
如果由于某种原因不起作用,您可以使用 GetFirst
和 GetNext
方法遍历集合。
例如:
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中如何获取筛选数据的正确行号的主要内容,如果未能解决你的问题,请参考以下文章
excel公式问题,获取行号列号之后,如何获取该单元格内的值。