Excel 使用1个电子表格更新多个MS ACCESS表

Excel 使用1个电子表格更新多个MS ACCESS表,excel,ms-access,vba,Excel,Ms Access,Vba,我有一个MS Access数据库,大约有1000个表。这些表是相互独立的,也就是说它们之间没有链接。基本上每个表都包含特定商品的库存记录。各表的名称为项目名称,例如125克肥皂、200毫升油等,并包含以下列:- 日期 每日期初库存 日销售额 日常采购 每日收盘股票 每天,所有商品的销售/购买都记录在会计软件中。日终报告摘要以Excel格式生成。此报告是所有商品每日销售/购买的合并报告,按行。Excel中的列包括: 日期 项目名称 每日期初库存 日销售额 日常采购 每日收盘股票 目前,我必须在Ac

我有一个MS Access数据库,大约有1000个表。这些表是相互独立的,也就是说它们之间没有链接。基本上每个表都包含特定商品的库存记录。各表的名称为项目名称,例如125克肥皂、200毫升油等,并包含以下列:-

  • 日期
  • 每日期初库存
  • 日销售额
  • 日常采购
  • 每日收盘股票
  • 每天,所有商品的销售/购买都记录在会计软件中。日终报告摘要以Excel格式生成。此报告是所有商品每日销售/购买的合并报告,按行。Excel中的列包括:

  • 日期
  • 项目名称
  • 每日期初库存
  • 日销售额
  • 日常采购
  • 每日收盘股票
  • 目前,我必须在Access中手动打开每个表,并从excel报告中复制粘贴相应的每日销售/采购数据。我想自动化这个过程,以便根据项目名称将记录自动附加到每个相应的表中

    总之,我想从1Ms Excel电子表格中包含的数据更新Ms Access数据库文件中的多个表

    可能吗?非常感谢你的帮助

    谢谢,
    Thiru V.Klack

    我向您提出的第一个问题是,为什么Access数据库不能与Excel电子表格的数据结构匹配?从1个电子表格更新1个Access表比您尝试执行的操作简单得多。拥有1000个具有相同数据结构的表,其中每个表都以产品命名,这对我来说似乎很可疑

    也就是说,如果您需要保留1000个表(我真的很惊讶您没有达到访问的DB最大阈值),那么有一些方法可以让它工作。我建议使用一个查找表,将产品(如电子表格所示)与它所访问的Access中的表相匹配。然后,将Excel数据导入一个暂存表,运行一些VBA代码在查找表中循环,运行查询将Excel中的所有数据追加到相应的Access表中。大概是这样的:

    private const STAGING_TABLE_NAME as string = "tDataFromExcel"
    private Const LOOKUP_TABLE_NAME as String = "tGoodsToTableNames"
    
    public sub AddData()
    
        Dim db as DAO.Database
        Dim rsItemLookup as DAO.Database
        Dim strSQL as string
        Dim GoodName as string, TableName as string
    
        set db = CurrentDB
        set rsItemLookup = db.OpenRecordset("select good_name, table_name from " & LOOKUP_TABLE_NAME)
    
        do while not rsItemLookup.EOF
            GoodName = rsItemLookup.fields("good_name").Value
            TableName = rsItemLookup.fields("table_name").value
    
            strSQL = _
                "insert into " & TableName & " (" & _
                    "[date], " & _
                    "[Daily Opening Stock], " & _
                    "[Daily Sales], " & _
                    "[Daily Purchases], " & _
                    "[Daily Closing Stock]) "
                "select " & _
                    "[date], " & _
                    "[Daily Opening Stock], " & _
                    "[Daily Sales], " & _
                    "[Daily Purchases], " & _
                    "[Daily Closing Stock]) " & _
                "from " & STAGING_TABLE_NAME & " " & _
                "where [Item Name] = """ & GoodName & """"
    
            db.Execute strSQL
    
            rsItemLookup.MoveNext
        loop
    
    end sub
    

    同样,我当然不提倡您采用这种方法:如果可以的话,我强烈建议您重构数据库,使其不包含1000个几乎相同的表。

    扎克的回答提供了一种方法来满足您的要求,但建议您做些其他事情。我将试着证明他所建议的对你的情况有效,并告诉你如何实现它

    您希望将excel电子表格中的数据传输到包含相同数据的关系数据库中—通常是为了提供更好的访问/操作。数据放在一个一天的大表中,每个产品都有一行单独的数据,您希望能够查看单个产品的整个历史记录,因此您将这些表分开

    这将大大降低自动传输过程的速度,即反复重写和处理SQL的长循环。但是,您可以在不使用此设置的情况下以这种方式查看数据。让我们称之为TBLPProductDetails

    一个表中有您的产品信息—例如产品名称、成本。。。另一个有买卖记录,随时跟踪库存。第二张表将有很多记录,因为它是每天购买和/或出售的每种产品的新记录。我们可以称之为tblInOut

    使用可保存在Access中的
    Select
    查询,您可以随时查看任何一个产品的历史记录-您甚至可以将其设置为变量,以便在打开保存的唯一查询时,它会提示您输入要查找的产品的名称

    我已经为您制作了一个模型,其中一个查询显示所有数据,另一个查询只显示一个产品的历史记录。您可以完全按照Access“查询生成器(SQL视图)”中的方式使用第二个查询,其中在查询名称中提到了
    '125g Soap'
    (在最后第二行),以便您知道哪个查询是哪个查询

    如果您只想使用一个查询,请执行相同的操作,但有一个例外:在最后一行的第二行,上面写着
    '125g Soap'
    将整个查询替换为
    Product_Name
    (不带倒逗号),当您打开查询时,Access会给您一个消息框,要求您键入产品名称


    如果您键入的名称完全正确,此功能才会起作用,因此您可能更愿意构建一个表单,以便为用户提供一个组合框,用于选择确切的产品名称。

    是的,这是可能的,但您的问题对于本论坛来说太广泛了。请帮助我缩小范围。什么样的问题才能称之为“精确”?有人能推荐一个示例sql代码或其他方法吗???嗨,扎克,谢谢你的回答。我会试着告诉你我是否也一样。但是,没有1000个相同的表。从第一天开始,每个表都与产品及其相应的销售/购买历史记录相关。大多数产品不是从第一天开始交易的,而是在随机日期推出的。此外,没有必要每天购买/销售每一种产品,因此数据内容不相等。对不起,我认为大约可以制作2000张桌子。所以我离这个数字还差得很远。excel电子表格只包含一个单一日期的销售/购买数据,而Access表格包含整个商店历史的销售/购买数据。逻辑上它们是不同的,因此不能等同。我支持@Zack,这个表结构不好。例如,您不能轻松重命名产品或生成包含销售统计信息的报告。如果您在Access中只有两个表就更好了-