访问 - Excel集成

时间:2010-09-08 16:41:23

标签: excel ms-access integration

嘿所有人,一直致力于设计一个新的工作数据库。他们一直在使用Excel进行日常报告,所有数据都存储在那里,因此我决定在Access中使用数据库的后端,在Excel中使用前端,因此任何分析工作都可以轻松执行。数据已导入Excel。

现在我对VBA很新,慢慢习惯使用它,编写了一些代码将其中一个计算表从Access传输到Excel:

Option Explicit

Public Const DataLocation As String = "C:\Documents and Settings\Alice\Desktop\Database\TestDatabase21.accdb"

Sub Market_Update()
    Call ImportFromAccessTable(DataLocation, "Final_Table", Worksheets(2).Range("A5"))
End Sub

Sub ImportFromAccessTable(DBFullName As String, TableName As String, TargetRange As Range)

    Dim cn As ADODB.Connection, rs As ADODB.Recordset, intColIndex As Integer

    Set TargetRange = TargetRange.Cells(1, 1)
    ' open the database
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DBFullName & ";"
    Set rs = New ADODB.Recordset
    With rs
        ' open the recordset
        ' .Open TableName, cn, adOpenStatic, adLockOptimistic, adCmdTable

        ' all records
        .Open "SELECT * FROM Final_Table", cn, , , adCmdText
        ' filter records

        For intColIndex = 0 To rs.Fields.count - 1 ' the field names
            TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
        Next
        TargetRange.Offset(1, 0).CopyFromRecordset rs ' the recordset data

    End With
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Sub Company_Information()

   Dim companyName As String

On Error GoTo gotoError

   companyName = Application.InputBox(Prompt:="Enter Company Name", _
                           Title:="Company Name", Type:=2)                  

    Exit Sub 'Don't execute errorhandler at end of routine

gotoError:
    MsgBox "An error has occurred"

End Sub

上面的代码工作正常,并提取所需的计算表并将其放在Excel中的右侧单元格中。

我有两个问题,我遇到了麻烦;首先,我已经为要将数据粘贴到Excel中的单元格进行了一些单元格格式化;我希望它一旦粘贴到Excel中就将格式应用于值。

其次;我有一个Excel附加组件,可以更新一些每日股市价值;这些值需要在每个工作日结束时转移到Access中,以保持数据库的维护,我尝试了一些代码但是在运行时遇到了一些问题。

此部分的代码如下:

Sub UPDATE()

   Dim cnt As ADODB.Connection
   Dim stSQL As String, stCon As String, DataLocation As String
   Dim stSQL2 As String

   'database path - currently same as this workbook
   DataLocation = ThisWorkbook.Path & DataLocation
   stCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & DataLocation & ";"
   'SQL code for GL Insert to Access
   stSQL = "INSERT INTO Historical_Stock_Data SELECT * FROM [Portfolio] IN '" _
   & ThisWorkbook.FullName & "' 'Excel 8.0;'"

   'set connection variable
   Set cnt = New ADODB.Connection
   'open connection to Access db and run the SQL
   With cnt
        .Open stCon
        .CursorLocation = adUseServer
        .Execute (stSQL)
   End With
   'close connection
   cnt.Close

   'release object from memory
   Set cnt = Nothing

End Sub

我收到以下错误。

Run-time Error '-2147467259 (80004005)'

The Microsoft Jet database engine cannot open the file 'Cocuments and Settings\Alice\Desktop\Database'. It is already opened exclusively by another user or you need permission to view its data.

我对数据库,VBA和Access都很陌生,所以任何帮助都会非常感激。

我也被告知上面建议使用Excel前端和Access后端的方法,但是他们进行的很多分析都是通过Excel完成的,而Excel中的图表功能要比Access好得多根据我的经验至少;这也是该项目的要求之一。

谢谢你提前!

3 个答案:

答案 0 :(得分:2)

在Access中进行数据输入/更新/审阅。 Access的优势之一是使用允许您在没有任何代码的情况下更新表的表单。然后允许用户轻松地将数据导出到Excel,例如通过单击某些命令按钮。

Modules: Sample Excel Automation - 逐个单元格缓慢

Modules: Transferring Records to Excel with Automation

答案 1 :(得分:2)

解决您的第一个问题:
很抱歉成为坏消息的承担者,但你的整个第一个模块是不必要的。相反,尝试:

  1. 转到数据 - >导入外部数据 - >导入数据,选择您的访问文件,选择您的表格,然后再预览!完成了!
  2. 右键单击新的“外部数据范围”以查看许多选项,其中一些与格式相关。您甚至可以保留原始单元格格式,只需更新值。我一直这样做。
  3. 要稍后更新Excel数据表,有一个“外部数据范围”工具栏,允许您刷新它以及“全部刷新”选项以刷新Excel文件中的每个表。 (你也可以自动执行这个代码。它需要一些试验和错误,但你肯定能胜任这个任务)
  4. 关于你的第二个问题
    我从来没有使用它,但也有一个“新的Web查询”选项。我认为它可以用同样的方式进行操作和更新。

    最后
    您选择的Excel前端和Access后端听起来非常适合您的需求。它将数据以他们熟悉的介质(Excel)提供给分析人员,同时保持计算不受Access影响。从技术上讲,您可以尝试将所有计算放在Excel中,但这可能会使Excel文件更大,更慢。

    alt text

答案 2 :(得分:0)

原则上与excel / access配对没有任何问题。我不熟悉ADO(我使用DAO),但是你的错误信息似乎表明数据源的路径没有完全形成;或者你已经打开它,因此将其锁定。