繁体   English   中英

在Excel VBA搜索记录中使用多个条件

[英]In Excel VBA Search record using multiple criteria

我搜索了许多博客,但仍然找不到有效的解决方案。 请帮我。

我有这样的工作表数据

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行一一运行。

我正在寻找一种解决方案,该解决方案使我可以通过在搜索中指定多列来搜索记录,并直接找到该单个记录,而不是扫描每一行。

在自动过滤器中,过滤器在后台运行,当宏运行时,我可以看到过滤器在运行。 我希望工作表显示所有记录。

请帮我 。

数据结构如下。

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

MS Access允许您创建索引和基于索引的搜索,目的是在有许多记录时显着提高性能。 (系统将根据索引记录进行搜索,而不需要遍历每条记录)。 如果您谈论的是具有10K记录的表,那么我怀疑Access无疑是更好的选择。

尽管我不建议这样做,但是您可以通过将ADOBE或DAO(Access使用本机DAO)添加到文件中来将Excel工作表视为数据库表。 这样,您可以使用SQL在数据表上执行所有CRUD操作。
我之所以不建议这样做,是因为Excel并不是要用RDBMS代替(例如,不支持关系数据库结构,这使得支持起来更加困难,并且需要管理参考/数据完整性)通过VBA或手动。
学习如何在Access中做一些基本的事情可能会花费您1天的时间,但是通过对所有内容进行编程(包括检查和从另一个工作表中检索数据等)来维护该系统可能会让您一辈子。

另外:
代码变慢的原因是因为我怀疑您从Excel工作表中逐行明确地读取并检查了每条记录。
如果仍然希望使用循环使此代码运行得更快,则需要将整个范围读入一个数组,并通过遍历该数组在内存中执行检查。
我怀疑代码执行是可以接受的,但是您可以通过设置计时器和显示计数器的状态栏(application.statusbar)上的进度通知来检查其性能。

使用Find方法而不是循环可能会很幸运,但是如今,我发现自己越来越多地使用Dictionary对象,尤其是对于此类任务。 您需要从“工具”菜单中启用“ Microsoft Scripting Runtime”作为参考,这很简单:

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)。 这样,您只需要循环一次。 至少,您会发现这样做的执行时间大大减少。

我想提出一些建议:1.在模块级别上将dCompare声明为Dictionary 2.在您填写字典的过程中创建dCompare的新实例:

Set dCompare = New Dictionary

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

  1. 当所有对象不再有用时,将其丢弃(引用不起作用???):

    如果不是dCompare,则设置dCompare = Nothing

5,以正确的方式声明您的论点

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

并不是:

我也喜欢使用这个非常强大的对象

为什么不使用简单的vlookup来在另一个工作表(或同一工作表中的另一个范围)中查找原料的价格(每单位)?

这意味着您只需要在一个位置更改/添加价格即可进行价格更新或添加成分。 然后甚至可以手动完成此操作,而不是借助VBA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM