【问题标题】:VBA Search & Compare Code for multiple Excel worksheets(Dynamic Number of Rows), in 1 WorkbookVBA 搜索和比较多个 Excel 工作表的代码(动态行数),在 1 个工作簿中
【发布时间】:2016-10-29 16:20:55
【问题描述】:

我在 12 个工作表(每月 1 个)中包含未知数量的条目(行)。这些行跟踪交付数据。我想解析每一行,每张纸并执行以下操作:

统计从 A 到 B 的交货数量。 计算从 A 到 B 的件数。 计算从 A 到 B 的交货成本。 计算从 A 到 B 的总货物重量。

这些计数需要输出到摘要工作表,并且需要同时是每月和年初至今。

示例列和单个数据行如下:

Date&Time PU     | Date&Time Del    |PU Loc. Name |PU Street        |PUCityStateZip       |DEL Loc.  Name|DEL Street        |DELCityStateZip        |Number of Pieces|Weight     |TotalAmt

01/01/2016 05:30 | 01/01/2016 07:30 | Warehouse A | 123 Nowhere St. | Toronto, ON P3L 3M0 | Hospital A   | 321 Made-up Ave. | Stratford, ON T45 6H8 | 6              | 240 Lbs   | $245.00
02/01/2016 06:30 | 02/01/2016 07:30 | Warehouse B | 123 Lost Road   | Hamilton, ON P3X 3Z0| Hospital A   | 321 Made-up Ave. | Stratford, ON T4P 6H8 | 3              | 240 Lbs   | $245.00
01/01/2016 09:30 | 02/01/2016 11:30 | Warehouse A | 123 Nowhere St. | Toronto, ON P3L 3M0 | Hospital B   | 123 Boul Fake.   | Montreal, QC T4Y 6J8  | 1              | 24 Lbs    | $45.00
04/01/2016 05:30 | 04/01/2016 07:30 | Warehouse A | 123 Nowhere St. | Toronto, ON P3L 3M0 | Hospital A   | 321 Made-up Ave. | Stratford, ON T4P 6H8 | 4              | 160 Lbs   | $145.00

Using the sample data above we would have(for total number of deliveries):
2 Deliveries from Warehouse A to Hospital A
1 Delivery from Warehouse B to Hospital A
1 Delivery from Warehouse A to Hospital B

我知道如何循环浏览不同的工作表。我也知道如何循环到最后一行的末尾,行数未知。

我不知道整理我的数据和比较取货和送货地点的最佳方式。 IE。我需要能够查看数据以确定仓库 A 在 1 月份交付给医院 B 7 次,2 月份 15 次...... 12 月份 10 次等等。我没有完成此代码,在这一点上,因为我在想象如何最好地解决这个问题时遇到了问题。

这一定是一个 VBA 解决方案——我可以在很久以前手工完成,但我想要一个“自动化”的 VBA 解决方案。

感谢任何帮助。

【问题讨论】:

  • 如果您的“位置”数量有限(例如,您可能知道所涉及的仓库/医院不会超过 100 个),我将为每个位置分配一个编号,并创建一个数组标注为(100, 100, 12),其中第一个维度表示“从”,第二个维度表示“到”,第三个维度表示月份。然后在处理每个月的工作表时将值存储到数组中。
  • 这是个好主意。然而,虽然我知道经常出现的地点,但从技术上讲,地点的数量可能是无限的。当新位置出现在该月的统计数据中时,以这种方式编制索引可能会留下漏洞。
  • 我认为我需要每月扫描交货地点名称列并为每个列出的唯一名称创建一个数组条目。然后,交叉引用该列表以防止重复并相应地增加。这似乎掩盖了“未知”的位置并进行了计数。但是,我仍然对解决此问题的最佳方法有些模糊。
  • 1.加载数组中的第一条记录(每次都必须发生,因为数组为空。2.查看下一个交付名称,如果与数组中的第一条记录相同,则增加第一条记录中的相应值,否则添加一个新记录到数组。3.在最后一行停止检查/加载并输出到摘要表。
  • 对最有效的编码方式的建议表示赞赏。当我有工作时,我也会在这里发布。

标签: vba excel macros


【解决方案1】:

您可以使用以下 SQL 语句打开记录集:

SELECT Year([Date&Time Del]), Month([Date&Time Del]), [PU Loc. Name], [DEL Loc.  Name]
    COUNT(*) AS CountOfDeliveries
FROM [SheetName$]
GROUP BY Year([Date&Time Del]), Month([Date&Time Del]), [PU Loc. Name], [DEL Loc.  Name]

并使用CopyRecordset 将结果粘贴到输出工作表中。

如果您想按年而不是按月分组(从问题中不太清楚),请使用以下 SQL 语句:

SELECT Year([Date&Time Del]), [PU Loc. Name], [DEL Loc.  Name]
    COUNT(*) AS CountOfDeliveries
FROM [SheetName$]
GROUP BY Year([Date&Time Del]), [PU Loc. Name], [DEL Loc.  Name]

请参阅here 了解类似情况。

【讨论】:

  • 感谢您的建议。我明天会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2021-04-03
相关资源
最近更新 更多