是否可以将多个 Excel 文件链接到同一个 Access 数据库表?

Posted

技术标签:

【中文标题】是否可以将多个 Excel 文件链接到同一个 Access 数据库表?【英文标题】:Is it possible to link more than one Excel file to the same Access database table? 【发布时间】:2021-01-15 20:48:10 【问题描述】:

我们现在在我的组织中遇到了一个重要问题。到目前为止(因为它是一家小企业),他们一直在使用 Excel 启用宏的文件和一些用 VBA 编码的表格来记录销售、费用、管理库存等。虽然这不是最好的解决方案,但到目前为止它一直在做这项工作。现在,他们想实施第二台计算机来同时管理业务“数据库”。

我想到的第一件事是通过 Excel 中的旧版 Share 函数在本地共享 Workbook 并在 VBA 代码进行任何更改之前强制刷新文件以避免表中的条目重复。但是,此功能非常有限,无法随心所欲地刷新Workbook

我搜索了几天,发现了一些仅使用 Excel 和一些网络查询的“创可贴”解决方案,但这似乎注定要失败。因此,我认为可行的解决方案是将多台计算机上完全相同的 Excel 文件链接到同一个 Access 数据库,这样管理起来会容易得多。我发现 Access 提供了将 Excel 文件链接到数据库的功能,并且对原始 Excel 文件所做的任何更改都会在数据库中自动更新。然后,您还可以将所述数据库中的数据检索回 Excel,以使所有计算机上的所有内容都保持更新。我相信如果有办法将每台计算机上的 Excel 文件链接到将在本地托管的同一个 Access 数据库,然后在进行任何新更改之前更新 Excel,这可能会起作用。我的问题是,即使所有表都具有相同的名称(它们属于同一个 Excel 文件),Access 还是决定只使用一个源来管理数据库。

基本上,我想使用 Excel 启用宏的文件作为前端界面,并使用 Access 作为后端数据库。我很清楚,到目前为止,这并不是最好的解决方案,但我们还需要一段时间才能有时间和资源来使用 SQL 制作合适的数据库。我非常感谢任何解决此问题的建议。我也知道所涉及的风险,但考虑到同时连接的计算机不超过 4 台,我相信风险不会像在公司层面尝试那样高。

【问题讨论】:

您的数据进入 Access 数据库文件。将其导入数据库一次,然后归档旧的 Excel 文件。现在您可以创建新的 Excel 文件来查看数据,但这是一种单向的只读操作。不要使用 Excel 作为前端。为数据输入设计一个适当的访问 DB FE。你最终会得到 3 个文件,最少。 1、DB BE中的数据,2 FE中单独访问DB文件。 3 用户习惯在 Excel 中使用的视图。 这更像是一个软件工程和数据库设计问题。它与一段代码无关。因此,它可能会因为 Stack Overflow 的题外话而被关闭。 我建议去掉 Excel 组件。使用 Access 文件构建前端。另请注意,SQL 不是数据库,它是许多数据库平台(包括 Access)使用的语言。也许您的意思是 SQLServer 或 mysql。当数据迁移到其他平台时,Access 仍然可以作为前端。 感谢大家的建议。我特别想避免使用 Access 作为用户界面,因为从头开始编写所有表单至​​少需要几周时间,但我想没有其他办法。 @June7 你对服务器面额的看法是完全正确的。我只是试图将 SQL 称为语言,并保留选项以在将来选择合适的平台。我想我们会选择 MySQL。也感谢您的建议。 【参考方案1】:

查看下面的示例代码,随意修改任何内容以满足您的需求。

Sub ImportDataFromExcel()
    Dim rng As Range
    Dim r As Long
    Dim conn As ADODB.Connection
    Dim strConn As String
    Dim strSQL As String

    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
        "C:\Users\Ryan\Desktop\Coding\Integrating Access and Excel and SQL Server\Access & Excel & SQL Server\" & _
        "EXCEL AND ACCESS AND SQL SERVER\Excel & Access\Select, Insert, Update & Delete\Northwind.mdb"
    Set conn = New ADODB.Connection
    conn.Open strConn
    
    With Worksheets("Sheet1")
        lastrow = .Range("A2").End(xlDown).Row
        lastcolumn = .Range("A2").End(xlToRight).Column
        Set rng = .Range(.Cells(lastrow, 1), .Cells(lastrow, lastcolumn))
    End With
        
        'therow = 1
        
        For i = 2 To lastrow
            'r = rng.Row
            'If r > 1 Then
                strSQL = "UPDATE PersonInformation SET " & _
                    "FName='" & Worksheets("Sheet1").Range("B" & i).Value & "', " & _
                    "LName='" & Worksheets("Sheet1").Range("C" & i).Value & "', " & _
                    "Address='" & Worksheets("Sheet1").Range("D" & i).Value & "', " & _
                    "Age=" & Worksheets("Sheet1").Range("E" & i).Value & " WHERE " & _
                    "ID=" & Worksheets("Sheet1").Range("A" & i).Value
                conn.Execute strSQL
            'End If
            'r = r + 1
        Next i
        
    
    conn.Close
    Set conn = Nothing
End Sub

还有……

Sub ExportDataToExcel()
   Dim conn As ADODB.Connection
   Dim myRecordset As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Users\Ryan\Desktop\Coding\Integrating Access and Excel and SQL Server\" & _
   "Access & Excel & SQL Server\EXCEL AND ACCESS AND SQL SERVER\Excel & Access\Select, Insert, Update & Delete\Northwind.mdb"

   Set myRecordset = New ADODB.Recordset

   FocusRow = ActiveCell.Row
   With myRecordset
       .Open "SELECT * FROM PersonInformation WHERE ID=" & Worksheets("Sheet1").Range("A2").Value, _
         strConn, adOpenKeyset, adLockOptimistic
         ' This assumes that ID is a number field. If it is a text field, use
         ' .Open "SELECT * FROM PersonInformation WHERE ID='" & Worksheets("Sheet1").Range("A2").Value & "'", _
         strConn, adOpenKeyset, adLockOptimistic
         
      .Fields("ID").Value = Worksheets("Sheet1").Range("A" & FocusRow).Value
      .Fields("FName").Value = Worksheets("Sheet1").Range("B" & FocusRow).Value
      .Fields("LName").Value = Worksheets("Sheet1").Range("C" & FocusRow).Value
      .Fields("Address").Value = Worksheets("Sheet1").Range("D" & FocusRow).Value
      .Fields("Age").Value = Worksheets("Sheet1").Range("E" & FocusRow).Value
      .Update
      .Close
   End With
   Set myRecordset = Nothing
   Set conn = Nothing
End Sub

现在,如果你想升级到真正的数据库,并使用 SQL Server,你可以使用下面的代码。

Sub InsertIntoSqlServer()

'Declare some variables
Dim cnn As adodb.Connection
Dim cmd As adodb.Command
Dim strSQL As String

'Create a new Connection object
Set cnn = New adodb.Connection

'Set the connection string
cnn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=Northwind;Data Source=Excel-PC\SQLEXPRESS"
'cnn.ConnectionString = "DRIVER=SQL Server;SERVER=Your_Server_Name;DATABASE=Your_Database_Name;Trusted_Connection=Yes"

'Create a new Command object
Set cmd = New adodb.Command

'Open the Connection to the database
cnn.Open

'Associate the command with the connection
cmd.ActiveConnection = cnn

'Tell the Command we are giving it a bit of SQL to run, not a stored procedure
cmd.CommandType = adCmdText

'Create the SQL
strSQL = "UPDATE TBL SET JOIN_DT = '2013-01-22' WHERE EMPID = 2"

'Pass the SQL to the Command object
cmd.CommandText = strSQL


'Execute the bit of SQL to update the database
cmd.Execute

'Close the connection again
cnn.Close

'Remove the objects
Set cmd = Nothing
Set cnn = Nothing

End Sub

【讨论】:

这太棒了,完全符合我的需求,更不用说代码非常干净且易于理解。非常感谢您的帮助! 当然。很高兴在这里为您提供帮助。

以上是关于是否可以将多个 Excel 文件链接到同一个 Access 数据库表?的主要内容,如果未能解决你的问题,请参考以下文章

怎样把多个excel文件合并到一个文件中?

如何用excel为多个word文件建立索引目录

打开excel时,提示更新链接

如何将多个excel文件合并?

所有Excel 文件打开显示“此工作簿包含一个或多个可能不安全的外部源的链接……”,怎么解决?

导入多个文本文件 Excel VBA