使用动态列

时间:2018-01-26 14:10:18

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

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

我想要一个表单,以便我的员工可以将新的定价和新的部件号导入我们的数据库,并删除旧的部件号。我只想删除旧的零件号码,如果它们不存在于新的价目表中(例外情况,稍后再看),如果我有0库存。

现在,我已经在Excel中完成了大量的VBA工作,以自动化Excel价目表的格式和标签。这在大多数情况下都能很好地工作,除非制造商对其布局进行更改。同样,现在我们制作Excel表格" fit"在我手动导入手写查询之前,我的Access数据库。

一点信息:我的所有PartNumber都是独一无二的。我手工输入的一些数据,当我更新定价和其他信息时我需要保留这些数据(例如PageNumber可能在今年的目录中有所不同,但我现有的{{1并且Description需要保持原状。)

以下是我经常遇到的问题: 我收到的价格表总是不同的。部分工作表可能包含SalePricePartNumberPrice。其他一些工作表可能包含StandardPackPartNumberPriceDescriptionUMRP。其他工作表可能包含许多不相关的数据,例如PageNumber,与我的系统无关。我需要一个表单/查询,可以将这样的动态数据导入到单个表中。

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

某些价目表可能包含需要修复的格式。这样做的问题是,有时制造商会更改他们的清单,并且我的员工无法理解VBA,如果他们需要,也可以解决这个问题。 一些数据可能会分成子类别。现在我在导入Access之前在Excel VBA中修复此问题。

小类:

enter image description here

某些价格表可能已将部件号与部件号分开,我需要为每个单独的表面处理单独的行。目前,在导入Access之前,这在Excel VBA中已得到修复,但如果制造商对其价目表进行更改,有时会中断。

单独完成列:

enter image description here

我想我最大的问题是,如何将单个表单导入可能包含不同列的Excel表单放入单个表中?是否最好在导入之前继续规范化Excel工作表?通过规范化,我是否只需要重命名现有列以适应我的表格,或者我的Excel表格是否需要在导入之前将所有库存表格列都存在?

1 个答案:

答案 0 :(得分:0)

我参与了一些类似的项目,所以我理解了你所描述的一些内容。让我首先介绍一下我尝试记住这类项目的一些原则,然后介绍一些有用的实用技巧。

首先,让我们花点时间退后一步,考虑一下我们的自动化程度。通常,自动化的目的是节省时间和/或将复杂的任务减少为可由技术不太熟的工人执行的任务。权衡是自动化需要时间和技能投资。

当我评估一个潜在的自动化项目时,我会尝试尽可能多地获得更大的图片。在这个项目中,我会问自己以下问题:

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

就像一个例子,我曾经花了几天时间构建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动态地将其作为带有列标题的链接表来执行此操作,以便您可以将处理逻辑保留在一个位置。

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

采用这种方法,您可以通过对代码进行最小程度的调整,从新供应商处添加新的定价电子表格。 (如果已经定义了匹配的别名,可能甚至没有。)

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

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

有很多选择和方法可以解决这个问题,但希望这会为你提供一些额外的想法!