将VBA阵列添加到新Access DB

时间:2015-04-28 12:32:15

标签: arrays excel vba excel-vba ms-access

我非常精通VBA,但我对Access几乎一无所知!我正在使用VBA中的Arrrays运行复杂的模拟,我想将结果存储在某个地方。由于模拟的结果非常大(内存大约1GB),我想将它存储在Access而不是Excel中。

我目前有大量的阵列填充了我的数据,但我不知道如何将这些数据写入数据库,甚至不知道如何使用VBA创建。这就是我需要做的事情,简而言之,就是VBA:

  • 创建新的Access数据库
  • 创建一个新的访问表(数据库将只是一个表)
  • 以编程方式创建~1200个字段
  • 将数组中的结果复制到新的Access表中。

我在这里看了很多答案,但他们似乎都没有完全回答我的问题。例如,Adding field to MS Access Table using VBA讨论了向数据库添加字段的问题。但我没有看到这里列出的双打。我的大多数阵列都是双打。这会有问题吗?

编辑:

以下是有关该项目的更多详细信息:

我正在运行网络设计模拟。因此,我开始生成~15万个独特的网络。然后,我运行了很多计算(不,这些不能简化为查询不幸!)网络的特征。每个可能的网络(唯一记录)最终约为1200。因此,我想将它们存储在Access数据库中。每条记录都是一个独特的网络,每个字段都是与该网络相关的特定特征。

几乎所有的字段(此时的数组!)都是双打的。

1 个答案:

答案 0 :(得分:1)

你(差不多?)从不想要一个带有一个表的数据库。您也可以将其存储在文本文件中。数据库的主要好处之一是将数据与不同的表格相关联,而使用一个表格则不需要它。

幸运的是,您需要多个表,数据库可能是最佳选择。您(几乎)永远不需要在代码中创建永久表(临时表,当然,但不是永久表)。如果您的字段名称是可变的,则需要更改设计。当数据是可变的时,它进入数据库的数据部分。当它被修复时,它可以是一个表或一个字段。根据你所说的,我认为你需要这个:

在Access中创建一个名为tblNetworks的表格,其中包含这些字段

NetworkID    AutoNumber
NetworkName  Short Text

然后使用这些字段创建另一个名为tblCalculations的表格

CalcID       Autonumber
NetworkID    Long           (Relates to tblNetworks, one to many)
CalcDesc     Short Text
Result       Number (Double)

您要在Access表中为字段命名的将是CalcDesc数据。您将使用ADODB执行INSERT INTO sql语句,将数据放入表中。

您将以tblNetworks结束150k条记录和tblCalculations,大约1,200 x 150k记录。当你的桌子变得越来越长而且随着事情的变化而变得越来越大时,这是一个很好的指示,你设计得恰到好处。

如果您真的不熟悉Access,我建议您学习如何创建表格,设置关系以及参照完整性。如果您不了解SQL,请搜索INSERT INTO。如果您以前在Excel中没有使用过ADO,请搜索ADODB Connections和Execute方法。

<强>更新

你绝对可以使用CSV。就像你说的那样,它的开销非常低。文本文件或数据库是否正确答案可能更多地取决于您将如何使用数据以及使用频率。

如果您要将此内容多次插入Excel中,请执行一些排序或过滤器,可能是数据透视表,那么您从CSV中获得的任何性能影响都不会是那么不好。如果您只需要一次处理一部分数据,则可以使用ADO读取文本文件,并仅在此时提取所需的数据,从而进一步减轻排序和过滤150k行的速度。更不用说如果你有一些内存,150k x 1,200可能一点也不差。

如果您发现CSV的性能因为您的硬件不能完成任务而发臭,您必须经常访问它,或者您对数据进行了大量不同的查询,它可能是您的有利于使用数据库。如果字段的结构与您说的一样,您可能会受益于更多表格。您仍然拥有网络表和计算表,但您还拥有市场,广告位和特征表。然后你的Calc表看起来像:

CalcID
CalcDesc
NetworkID
MarketID
SlotID
CharacteristicID
Result

如果您多次查找数据并且需要快速完成,那么您不会比这些表上的一堆INNER JOIN和一个限制您想要的WHERE子句做得更好。

但只有您可以决定是否值得使用数据库的所有设置和开销。因此,我将开始CSV路径,直到改变的原因出现。我会设计我的代码的方式是从CSV切换到数据库只涉及一些程序(比如使用类模块),这样改变不会影响任何已经测试的业务逻辑。