0

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

我有这样的工作表数据

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

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

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

请帮我 。

数据结构如下。

4

4 回答 4

0

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

Set dCompare = New Dictionary

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

  1. 当它们不再有用时丢弃所有对象(引号不起作用???):

    If Not dCompare Is Nothing 然后设置 dCompare = Nothing

5.以正确的方式声明你的论点:

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

并不是:

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

于 2013-12-09T23:45:49.990 回答
0

使用该方法而不是循环您可能会很幸运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)。这样你只需要循环一次。至少,您会看到这样做的执行时间显着减少。

于 2013-04-08T18:48:52.947 回答
0

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

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

虽然我不建议这样做,但您可以通过添加对文件的库引用,使用 ADODB 或 DAO(Access 使用本机 DAO)将 Excel 工作表视为数据库表。通过这种方式,您可以使用 SQL 对数据表执行所有 CRUD 操作。
我不推荐它的原因是因为 Excel 并不打算被 RDBMS 取代(例如,不支持关系数据库结构,这使得它更难支持,并且你需要管理你的引用/数据完整性通过 VBA 或手动。
学习如何在 Access 中做一些基本的事情可能需要你 1 天的时间,但是通过对所有内容进行编程(包括检查和从另一个工作表中检索数据等)来维护这个系统可能需要你永远。

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

于 2012-10-01T09:44:17.940 回答
0

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

这意味着对于价格更新或成分添加,您只需要在一个位置更改/添加一些东西。然后甚至可以手动完成,而不是通过 VBA。

于 2014-09-09T14:49:38.287 回答