首页 文章

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

提问于
浏览
-1

我有一个MS Access数据库,大约有1000个表 . 表彼此独立,即它们彼此链接 . 基本上每个表都包含特定商品的库存记录 . 每个表的名称是项目的名称,例如125克肥皂,200毫升油等,并包含以下列: -

  • 日期

  • 每日开盘股票

  • 每日销售额

  • 每日购买

  • 每日收盘股票

每天,所有商品的销售/购买都记录在会计软件中 . “结束日期”报告摘要以Excel格式生成 . 此报告是所有货物的每日销售/购买的综合报告, row-wise . Excel中的列是:

  • 日期

  • 物品名称

  • 每日开盘股票

  • 每日销售额

  • 每日购买

  • 每日收盘股票

目前,我必须手动打开Access中的每个表并从excel报告中复制粘贴相应的每日销售/购买数据 . 我想自动执行此过程,以便根据项目名称将记录自动附加到每个相应的表中 .

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

那可能吗 ?非常感谢您的帮助 .

谢谢,Thiru V. Klack

2 回答

  • 0

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

    话虽这么说,如果你需要保留你的1000个表(我真的很惊讶你没有达到Access的数据库最大阈值),有一些方法可以使它工作 . 我建议有一个查找表,将产品(如电子表格中显示的那样)与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个几乎相同的表 .

  • 1

    扎克的答案提供了一种方法来做你所要求的,但建议你做其他事情 . 我将尝试证明他推荐的内容适用于您的情况,并向您展示如何实现它 .

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

    这将显着减慢自动传输过程 - 重复写入和反复处理SQL的长循环 . 您可以在没有此设置的情况下以这种方式查看数据 . 让我们调用这个tblProductDetails

    一张 table 上有你的产品信息 - 比如产品的名称,价格是多少......另一张表有买入和卖出的进/出记录,随时记录库存情况 . 第二张表将有很多记录,因为它是每天购买和/或销售的每种产品的新记录 . 我们可以称之为tblInOut .

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

    我已经为你查了一个4 product sample schema来查询显示所有数据,另一个只显示了一个产品's history. You can use the second query exactly as is in Access'查询构建器(SQL视图),其中 '125g Soap' (在倒数第二行)在查询名称中提到了所以你知道哪个查询是哪个 .

    如果你只想使用一个查询,做同样的事情有一个例外:在倒数第二行,它说 '125g Soap'Product_Name 替换整个事物(没有引号),当你打开查询时,Access会给你一个消息框,要求您输入产品名称 .

    此功能仅在您完全键入名称时才有效,因此您可能更喜欢只构建一个表单,以便为用户提供一个组合框,用于选择确切的产品名称 .

相关问题