2012-10-01 68 views
0

我搜索了很多博客,但我仍然不能有效找到一个解决方案多个条件。 请帮帮我。在Excel VBA搜索记录使用

我有这样

Recipie Ingredient  No of Grams  Ingredient Cost 
A10  OREGANO   0.25 gr  10 
A10  OSTUR   60.00 gr  11 
A10  SÓSA   65.50 gr  14 
Á10  HAKK   38.00 gr  18 

我想为配方,如果已经存在的成分,以更新材料费的工作表数据。 否则我需要插入一条新记录。

我可以用一个简单的for循环做到这一点,并检查匹配配方,然后将该配方和更新中搜索成分。我试过这个,这工作正常。 我的问题是,当没有行增加到10K,然后搜索将运行所有的10K行一个接一个。

我要寻找的解决方案,让我通过搜索指定多个列,可以检索记录,发现一个记录,而不是直接扫描每行。

在自动筛选过滤器在后台发生的事情,当宏运行时,我能够看到 该过滤器正在发生的事情。我想要工作表来显示所有记录。

请帮帮我。

数据结构给出如下。

+1

就像一个旁注:这是一个典型的例子,其中使用Access将允许您以最简单的方式以最简单的方式获得最快的查询结果,并且最少的VBA代码需要以及稍后进行修改的问题最少。 – Trace

+0

你在哪里得到你的配料成本?不同的配方对于相同的配料会有不同的成本吗? – SeanC

回答

0

正如我在上面的评论中提到的,这是一个典型的功能,您应该可以访问(即使您更喜欢使用Excel作为前端)。我在上面看到的是一个表格结构,食物在被送到电子表格之前被要求查询。

MS Access允许您根据指数,其目的明显地增加你的表现,当你有很多的记录创建索引和搜索。 (系统将根据索引记录进行搜索,而不需要遍历每条记录)。如果你正在谈论一张拥有10K记录的桌子,我怀疑Access是毫无疑问更好的选择。

虽然我不建议这样做,你可以把你的Excel工作表的使用ADODB或DAO(Access使用原生DAO)加入库引用该文件的数据库表。 通过这种方式,您可以使用SQL在数据表中执行所有CRUD操作。
为什么我不建议这样做的原因,是因为Excel并不意味着由RDBMS来代替(如不支持关系数据库结构,这使得它难以支持并使得你需要管理你的参考/通过VBA或手动数据的完整性。
学习如何做一些基本的东西在访问可能需要1天,但通过编程的一切维护这个系统(包括支票和从另一片表等检索数据...)可能需要你永远

此外:
为什么代码将是缓慢的原因是因为我怀疑你阅读,并从Excel工作表中明确线路检查每行每一条记录
。如果您仍想使用循环更快地运行此代码,则需要将整个范围读入数组并通过循环数组来执行内存中的检查。
我怀疑执行代码是可接受的,但可以通过设置一个计时器检查它的性能,并且对显示计数器状态栏(application.statusbar)进展的附加通知。

0

使用Find方法代替循环可能有很多运气,但现在我发现自己越来越多地使用Dictionary对象,特别是对于像这样的任务。你需要有“Microsoft脚本运行时”为从工具菜单中的引用启用,那么很简单,如:

Dim dCompare As New Dictionary 
.... 
For i = 2 To bottomRow 
    dCompare.Add (Worksheets("...").Range("L" & i).value & Worksheets("...").Range("I" & i).value), i 
Next i 

基本上可以填满它,你怎么想,但我只是串联,我需要为工作表值按键并将行号作为值。那么对于检索:

Function findCorrelate(ByVal value1, value2 As String) As Long 
Dim oppositeRow As Long 
    oppositeRow = dCompare.Item(value1 & value2) 
findCorrelate = oppositeRow 
End Function 

你把你需要寻找(其中一起是关键),它会吐出行号的你,如果它存在,作为值的数值。否则它将返回0(但你可能更喜欢-1)。这样你只需要循环一次。至少,你会看到这样做的执行时间显着减少。

0

我想提出一些建议:1。 在模块级 2.申报dCompare如字典在你的字典填写过程中创建dCompare的新实例:

Set dCompare = New Dictionary 

3。作为转换字符串组成KEY CStr(Value1)所有值,...

  1. 丢弃所有的对象时,他们是没有用的了(引号不工作???):

    如果不dCompare是Nothing然后设置dCompare =无

5.Declare你的论点的正确方法:

findCorrelate(ByVal value1 As String, ByVal value2 As String) As Long 

,而不是:

我喜欢用这个功能非常强大object too

0

为什么不使用简单的方法来查找另一个工件中成分的价格(每单位) et(或同一工作表上的其他范围)?

这意味着您需要在一个位置修改/添加某个价格更新或配料。这甚至可以手动完成,而不是通过VBA。