找回密码
 加入
搜索
查看: 4794|回复: 5

[效率算法] 绝境求助Excel搜索问题。

[复制链接]
发表于 2010-8-19 20:31:35 | 显示全部楼层 |阅读模式
怎么实现Excel搜索字符问题?
搜索到指定字符还回行号和列号。

我用两个循环先搜索 一行一列 读取该行字符 判断字符里是否含有指定字符。再一行二列。。。搜索完一行后再自增一行循环查找第二行。。。。。

表格比较小的搜索很快,可是表格行数或列数上了100后就要近1秒。上1000后更慢。更大的表格需要更久的时间。

大家有没有什么好的办法啊? 有没有直接调用Excel的搜索功能的啊?Excel自己的搜索快极了。
发表于 2010-8-19 21:55:06 | 显示全部楼层
本帖最后由 weiyun 于 2010-8-19 21:58 编辑

Excel有帮助
Excel 开发人员参考
Range.Find 方法
在区域中查找特定信息。
语法

表达式.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

表达式   一个代表 Range 对象的变量。

参数

名称 必选/可选 数据类型 说明
What 必选 Variant 要搜索的数据。可为字符串或任意 Microsoft Excel 数据类型。
After 可选 Variant 表示搜索过程将从其之后开始进行的单元格。此单元格对应于从用户界面搜索时的活动单元格的位置。请注意:After 必须是区域中的单个单元格。要记住搜索是从该单元格之后开始的;直到此方法绕回到此单元格时,才对其进行搜索。如果不指定该参数,搜索将从区域的左上角的单元格之后开始。
LookIn 可选 Variant 信息类型。
LookAt 可选 Variant 可为以下 XlLookAt 常量之一:xlWhole 或 xlPart。
SearchOrder 可选 Variant 可为以下 XlSearchOrder 常量之一:xlByRows 或 xlByColumns。
SearchDirection 可选 XlSearchDirection 搜索的方向。
MatchCase 可选 Variant 如果为 True,则搜索区分大小写。默认值为 False。
MatchByte 可选 Variant 只在已经选择或安装了双字节语言支持时适用。如果为 True,则双字节字符只与双字节字符匹配。如果为 False,则双字节字符可与其对等的单字节字符匹配。
SearchFormat 可选 Variant 搜索的格式。

返回值
一个 Range 对象,它代表第一个在其中找到该信息的单元格。

说明


如果未发现匹配项,则返回 Nothing。Find 方法不影响选定区域或当前活动的单元格。

每次使用此方法后,参数 LookIn、LookAt、SearchOrder 和 MatchByte 的设置都将被保存。如果下次调用此方法时不指定这些参数的值,就使用保存的值。设置这些参数将更改“查找”对话框中的设置,如果省略这些参数,更改“查找”对话框中的设置将更改使用的保存值。要避免出现这一问题,每次使用此方法时请明确设置这些参数。

使用 FindNext 和 FindPrevious 方法可重复搜索。

当搜索到指定查找区域的末尾时,此方法将绕回到区域的开始位置继续搜索。发生绕回后,要停止搜索,可保存第一个找到的单元格地址,然后测试后面找到的每个单元格地址是否与其相同。

若要对单元格进行模式更为复杂的搜索,请结合使用 For Each...Next 语句和 Like 运算符。例如,下列代码在单元格区域 A1:C5 中搜索字体名称以“Cour”开始的单元格。当 Microsoft Excel 找到匹配单元格以后,就将其字体改为 Times New Roman。

For Each c In [A1:C5] If c.Font.Name Like "Cour*" Then c.Font.Name = "Times New Roman" End If Next



示例


本示例在第一个工作表的单元格区域 A1:A500 中查找包含值 2 的所有单元格,并将这些单元格的值更改为 5。
Visual Basic for Applications 
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Excel 开发人员参考
Range.FindNext 方法
继续由 Find 方法开始的搜索。查找匹配相同条件的下一个单元格,并返回表示该单元格的 Range 对象。该操作不影响选定内容和活动单元格。
语法

表达式.FindNext(After)

表达式   一个代表 Range 对象的变量。

参数

名称 必选/可选 数据类型 说明
After 可选 Variant 指定一个单元格,查找将从该单元格之后开始。此单元格对应于从用户界面搜索时的活动单元格位置。注意,After 必须是查找区域中的单个单元格。注意,搜索是从该单元格之后开始的;直到本方法环绕到此单元格时,才检测其内容。如果未指定本参数,查找将从区域的左上角单元格之后开始。

返回值
Range

说明


当查找到指定查找区域的末尾时,本方法将环绕至区域的开始继续搜索。发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同。


示例


本示例在单元格区域 A1:A500 中查找值为 2 的单元格,并将这些单元格的值变为 5。
Visual Basic for Applications 
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With 
Excel 开发人员参考
Range.FindPrevious 方法
继续由 Find 方法开始的搜索。查找匹配相同条件的上一个单元格,并返回代表该单元格的 Range 对象。该操作不影响选定内容和活动单元格。
语法

表达式.FindPrevious(After)

表达式   一个代表 Range 对象的变量。

参数

名称 必选/可选 数据类型 说明
After 可选 Variant 指定一个单元格,查找将从该单元格之前开始。此单元格对应于从用户界面搜索时的活动单元格的位置。请注意:After 必须是区域中的单个单元格。注意,搜索是从该单元格之前开始的;直到本方法环绕到此单元格时,才检测其内容。如果未指定本参数,查找将从区域的左上角单元格之前开始。

返回值
Range

说明


当查找到指定查找区域的起始位置时,本方法将环绕至区域的末尾继续搜索。发生绕回后,要停止搜索,可保存第一个找到的单元格地址,然后测试后面找到的每个单元格地址是否与其相同。


示例


本示例演示 FindPrevious 方法如何与 Find 方法和 FindNext 方法一起使用。运行本示例之前,请确保工作表 Sheet1 的 B 列中至少出现过两次“Phoenix”单词。
Visual Basic for Applications 
Sub FindTest()
    Dim fc As Range
    Set fc = Worksheets("Sheet1").Columns("B").Find(what:="Phoenix")
    MsgBox "The first occurrence is in cell " & fc.Address
    Set fc = Worksheets("Sheet1").Columns("B").FindNext(after:=fc)
    MsgBox "The next occurrence is in cell " & fc.Address
    Set fc = Worksheets("Sheet1").Columns("B").FindPrevious(after:=fc)
    MsgBox "The previous occurrence is in cell " & fc.Address
End Sub 
 楼主| 发表于 2010-8-19 22:50:39 | 显示全部楼层
还是不知道怎么在AU3中使用Range.Find 函数。能给个AU3的Range.Find 例子吗?返回查找含有指定字符串的表格的行数和列数?
 楼主| 发表于 2010-8-19 23:22:25 | 显示全部楼层
Excel.au3到现在还没有Excel搜索的UDF。大家一起讨论讨论啊。
 楼主| 发表于 2010-8-23 19:56:32 | 显示全部楼层
怎么是无解啊?是高人就该现现身了啊。
发表于 2010-8-23 20:05:15 | 显示全部楼层
我觉得程序自带是搜索和外部搜索是两回事。
程序自身 如 Excel 等程序 自身获取文本和文本定位是非常容易的,再一正则就出结果了。
而我们3方对其进行搜索麻烦就麻烦在获取文本和定位上,需要一个一个的去比对,效率太低了。

人家是一篇文本直接正则出结果,咱们是一行一列的去比对,你说能不慢吗?
我觉得要提高效率就得先解决这个问题。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 07:24 , Processed in 0.080528 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表