VBA创建/更新任意数量的访问表

时间:2012-01-04 16:27:18

标签: ms-access access-vba

我目前正在一家公司实习,我的雇主要求我为他们所在的新市场建立一个传输,收费,信用等数据库。我创建了一个小程序130个带有数据的CSV,有些是空的,有些则没有。然后程序删除空的程序。

他们在Access中完成了大部分工作,我正在快速学习,但这不是我的强项。我为他们的销售人员和自动化编写了一些VBA程序/脚本,现在我想在这个Access数据库中添加代码,我正在以编程方式更新它。

问题是,我可以看到使用我下载的数据制作/更新这些表的唯一方法是单独构建所有130个,并为每个单独的报告单独构建SELECT和INSERT查询。但是,因为表可能有也可能没有给定日期范围的数据,我需要构造所有表和查询。

来自编程背景,我希望能有一个高水平的抽象,我可以做这样的事情

For each file f in Directory d
    Get report title
    If there is a table with the same report title
         Insert any unique values into that table
    If there isn't a table with that report title
         Create it, and then insert unique values into that table
End

但是,看起来我不能做这样的事情。

我正在考虑另一种方法,我

  1. 将报告写入仅包含订单项(无标题)的新csv文件
  2. 为这些报告设置链接表
  3. 使用向导
  4. 创建一组预制导入

    我离这家公司还有几个星期的时间,所以我在找到解决方案之间挣扎,或者是务实的,只是为应该始终拥有数据的核心报告集设置逻辑。任何帮助/建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

你可以最肯定地做你的高级总结汤姆,这些是你需要的领域:

FileSystemObject(这可以遍历文件夹中的文件并提供文件名)

TableDefs(可以从数据库中提取表名)

我建议使用FileSystemObject将文件加载到临时表中,然后可以使用TableDefs属性来确认相关表是否存在。如果是这样,那么您可以使用Remou提供的SQL来仅插入那些尚未存在的行。如果您的表不存在,那么您只需使用以下SQL来创建包含数据的新表:

SELECT * INTO NewTableName FROM TempTableName

我还没有足够的时间继续写出这个程序,但这两个属性应该让你朝着正确的方向前进,如果你遇到它们就再次发布。

祝你好运:)

答案 1 :(得分:0)

使用Access,您可以包含内联连接,例如:

scn = "[Text;FMT=Delimited;HDR=Yes;DATABASE=Z:\Docs\TXT_CSV]"

ssql = "SELECT * FROM TestTable " _
& "WHERE ID Not In (SELECT ID FROM " & scn & ".[TestIn.CSV])"

ssql = "SELECT * FROM " & scn & ".[TestIn.CSV]  " _
& "WHERE ID Not In (SELECT ID FROM TestTable)"

这意味着只要您有一个唯一的字段/列(列/ s),就可以只插入以前不容易插入的记录。