【问题标题】:Automating Excel import to Access with dynamic columns使用动态列自动将 Excel 导入到 Access
【发布时间】:2018-01-26 14:10:18
【问题描述】:

我维护了一个包含许多不同制造商的商品的库存/价格数据库。当我们获得价格更新时,制造商会发送一个新的 Excel 文档。不幸的是,这些 Excel 文档因制造商而异,并且它们的工作表没有标准化的标签和格式(即使来自同一制造商)。

我想要一个表格,以便我的员工可以将新定价和新零件编号导入我们的数据库,并删除旧零件编号。我只希望在新的价目表中不存在旧部件号(有例外,请稍后查看)并且我的库存为 0 时删除旧部件号。

现在我已经在 Excel 中完成了大量的 VBA 工作,以自动对 Excel 价目表进行格式化和标记。这在大多数情况下都非常有效,除非制造商对其布局进行了更改。尽管如此,现在我们让 Excel 工作表“适合”我的 Access 数据库,然后再通过手写查询手动导入。

一点信息:我所有的PartNumbers 都是独一无二的。我有的一些数据是手工录入的,我在更新定价和其他信息时需要保留这些数据(例如PageNumber可能在今年的目录中有所不同,但我现有的DescriptionSalePrice需要保持机智。)

以下是我经常遇到的问题: 我收到的价目表总是不同的。有些工作表可能有PartNumberPriceStandardPack。其他一些工作表可能有PartNumberPriceDescriptionUMRPPageNumber。其他工作表可能有很多不相关的数据,例如Weight,这些数据与我的系统无关。我需要一个可以将这样的动态数据导入单个表的表单/查询。

一些制造商有不同的价格表。我有一个DealerNet 定价列表以及Description PageNumber 等其他信息。然后我有一个单独的覆盖表,其中包含SalesDeal 价格和StandardPack 我们大量购买的物品的信息。由于我无法解释的原因,这两个价目表将具有完全不同的格式和列标签。这是一个例外,当我只是更新我的SalesDeals 时,我不希望删除该制造商的其他部件号。这可以通过 MsgBox 弹出窗口来完成。

某些价目表的格式可能需要修正。问题是,有时制造商会更改他们的列表,而我的员工无法充分理解 VBA 以在需要时解决此问题。 一些数据可能被分成子类别。现在我在导入 Access 之前在 Excel VBA 中修复了这个问题。

子类别:

某些价目表的饰面可能与部件号分开,我需要为每个单独的饰面单独一行。目前,在导入 Access 之前,此问题已在 Excel VBA 中修复,但有时如果制造商更改其价目表,它会中断。

单独的完成栏:

我想我最大的问题是,如何将可能具有不同列的 Excel 工作表导入单个表格?导入前是否最好继续规范化我的 Excel 工作表?通过规范化,我是否只需要重命名现有列以适合我的表格,还是我的 Excel 工作表需要在导入之前显示我的所有 Inventory 表格列?

【问题讨论】:

    标签: excel ms-access vba import-from-excel


    【解决方案1】:

    我从事过一些类似的项目,所以我对您所描述的内容有所了解。让我从我在此类项目中尝试牢记的一些原则开始,然后是一些您可能会发现有用的实用技巧。

    首先,让我们花一点时间退后一步,考虑一下我们正在自动化什么。通常,自动化的目的是节省时间和/或将复杂的任务简化为可以由技能较低的工人执行的任务。权衡是自动化需要时间和技能投资。

    当我评估一个潜在的自动化项目时,我会尽可能多地了解全局。在这个项目中,我会问自己以下问题:

    • 我们多久收到一次定价更新?
    • 我与多少供应商合作?
    • 哪些元素(数据列)在供应商中最一致?
    • 我可以在供应商之间重用/共享多少导入逻辑?
    • 我对收到的数据的可靠性有多大信心?
    • 我添加/删除供应商的频率如何?
    • 我估计需要多少时间和精力才能实现自动化?

    就像一个例子,我曾经花了几天时间构建 VBA 逻辑,该逻辑将解析 pdf 页面中的文本和对象,通过坐标位置和顺序确定字段。真的很复杂!但在那种情况下,我们导入了数万页有价值的数据,所以这是有道理的。对于一个较小的项目,花这么多时间在上面是荒谬的。 :-)

    然后基于此分析,我将尝试确定以最低开发复杂性实现最大流程自动化的最佳方法。对于某些供应商,您可能需要在 Excel 中进行一些初始清理/重组,但您可以导入大部分其他供应商,而无需在 Excel 中进行任何额外的手动编辑。您只需要决定适合您的平衡点。

    实用方法

    我对这个项目的建议是专注于 VBA 中的一个通用导入例程,该例程将解析和导入定价文件。我将为列标题创建别名选项,使您可以直接从供应商处使用文件。这可以通过 VBA 中的 Select Case 语句(下面的示例)或通过别名查找表来完成。

    For Each Col In rst.Columns
        Select Case Col.Name
            Case "Price", "Pricing", "Cost"
                strPriceCol = Col.Name
            Case "ID", "Code", "SKU"
                strIDCol = Col.Name
            ' etc...
    Next Col
    

    查找表的优点是您(或其他用户)可以添加列名等效项,而无需更改任何 VBA 代码。这是否有意义取决于您需要多久编辑一次别名。

    在您的导入表单中,您要做的第一件事是链接到 Excel 电子表格。我会通过 VBA 作为带有列标题的链接表动态地执行此操作,这样您就可以将处理逻辑保存在一个地方。

    当您遍历供应商定价记录集中的记录时,您可以将新的定价记录添加到主列表、更新现有的或删除未使用的记录。使用大量 cmets 在 VBA 中保留该逻辑可以让您(或其他人)轻松理解正在发生的事情。 (与仅适用于特定供应商的追加、更新和删除查询列表相比。)

    采用这种方法,您可以添加来自新供应商的新定价电子表格,而只需对代码进行最少的调整。 (如果您已经定义了匹配的别名,甚至可能没有。)

    如果您有特定于供应商的处理,例如包含不同类型产品的部分(例如上面的子类别图片),您可以让用户选择供应商作为导入的一部分,或者找到一些始终如一的独特之处文件布局,可让您自动确定。

    为了使事情更加稳健,您可能需要进行一些健全性检查。例如,您可以将定价解析为一个中间表,将其链接到您当前的定价,并向用户呈现一份报告,以预览将要发生的定价变化。这将使他们有机会在进行更新之前确认更改。

    有很多选项和方法可以解决这个问题,但希望这会给你一些额外的想法,因为你继续前进!

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2011-05-02
      • 2021-02-25
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多