Vba 将Access文件中的数据读取到Excel中

Vba 将Access文件中的数据读取到Excel中,vba,ms-access,Vba,Ms Access,我是一个新手,刚刚开始学习VBA。我正在尝试将Access中的表中的数据读取/导入excel电子表格中的选项卡。数据将是某些公司的名称/职位/薪酬。两个表(access和excel)中的列标题相同。当我读取数据时,逻辑是-将公司ID定位在另一个访问表中,然后从存储数据的访问表中检索数据(公司ID很重要,因为该表存储每个公司的数据,ID用于标识要精确的公司数据) 这是我从网上获得的模板: Sub DAOCopyFromRecordSet(DBFullName As String, TableNam

我是一个新手,刚刚开始学习VBA。我正在尝试将Access中的表中的数据读取/导入excel电子表格中的选项卡。数据将是某些公司的名称/职位/薪酬。两个表(access和excel)中的列标题相同。当我读取数据时,逻辑是-将公司ID定位在另一个访问表中,然后从存储数据的访问表中检索数据(公司ID很重要,因为该表存储每个公司的数据,ID用于标识要精确的公司数据)

这是我从网上获得的模板:

Sub DAOCopyFromRecordSet(DBFullName As String, TableName As String, _
    FieldName As String, TargetRange As Range)
' Example: DAOCopyFromRecordSet "C:\FolderName\DataBaseName.mdb", _
    "TableName", "FieldName", Range("C1")
Dim db As Database, rs As Recordset
Dim intColIndex As Integer
    Set TargetRange = Sheets("MIC").Cells(1, 1)
    Set db = OpenDatabase(DBFullName)
    Set rs = db.OpenRecordset(AIF_MIC, dbOpenTable) ' all records
    'Set rs = db.OpenRecordset("SELECT * FROM " & TableName & _
        " WHERE " & FieldName & _
        " = 'MyCriteria'", dbReadOnly) ' filter records
    ' write field names
    For intColIndex = 0 To rs.Fields.Count - 1
        TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
    Next
    ' write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs
    Set rs = Nothing
    db.Close
    Set db = Nothing
End Sub
这是我的实际代码:

Sub DAOCopyFromRecordSet("H:\HAPPY\Happy Folder\Happy DB.mdb", "Happy_Table","A,B,C" ,Sheets("Happy").Range("C5:M32")
Dim db As Database, rs As Recordset
Dim intColIndex As Integer
    Set TargetRange = Sheets("Happy").Cells(1, 1)
    Set db = OpenDatabase(DBFullName,false,false,";pwd=HAPPY")
    Set rs = db.OpenRecordset(Happy, dbOpenTable) ' all records
    'Set rs = db.OpenRecordset("SELECT * FROM " & Happy & _
        " WHERE " & FieldName & _
        " = 'MyCriteria'", dbReadOnly) ' filter records
    ' write field names
    For intColIndex = 0 To rs.Fields.Count - 1
        TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
    Next
    ' write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs
    Set rs = Nothing
    db.Close
    Set db = Nothing
End Sub
我不知道如何继续我的编码…我的目标细胞是C5:M32在我的电子表格“快乐”…编码如何将数据正确导入到属于不同标题名称的每个列的单元格中…我必须确保编码为我提供了正确公司的数据,因为所有公司都在access表中保存了相同的类型信息

如果我不能用很好的逻辑来解释这一点,我深表歉意。如果任何编程大师能在skype上帮助我,我也将不胜感激

很高兴加入这个社区


感谢您的帮助

此过程设计为在Excel VBA的通用模块中运行,请确保这是您真正想要的

对于初学者,子声明是错误的。这不是指定数据库、表、字段和范围的位置。看看你改编的例子。声明中有变量参数,而不是文字字符串。无法删除过程中的参数和硬代码源。由于您在过程中指定了TargetRange,因此肯定可以消除TargetRange参数

由于代码正在声明特定类型的对象(数据库和记录集),因此需要在VBE>工具>引用>MS Office x.x Access数据库引擎对象库中设置引用。这是“早期绑定”

可能会遇到的一个问题是,如果这是覆盖单元格中已经存在的数据,则确实需要清除数据,或者如果新数据未延伸到现有行的末尾,则可能会以剩余数据结束

不知道如何获取SQL语句的筛选条件。可能会提示用户输入

我进行了测试,跟踪测试为我工作

Sub DAOCopyFromRecordSet(DBFullName As String, TableName As String, FieldName As String)
Dim db As Database, rs As Recordset
Dim intColIndex As Integer
Dim TargetRange As Range
    Set TargetRange = Sheets("Happy").Range("C5")
    Set db = OpenDatabase(DBFullName,false,false,";pwd=HAPPY")
    Set rs = db.OpenRecordset(TableName, dbOpenTable) ' all records
    'Set rs = db.OpenRecordset("SELECT * FROM " & TableName & _
        " WHERE [" & FieldName & "] = " & InputBox("Enter customer ID", , 0), dbReadOnly) ' filter records
    'clear old data
    Sheets("Happy").Range("C:M").Value = ""
    ' write field names
    For intColIndex = 0 To rs.Fields.Count - 1
        TargetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
    Next
    ' write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs
    Set rs = Nothing
    db.Close
    Set db = Nothing
End Sub
在按钮单击等事件中调用该过程

DAOCopyFROMRecordSet "H:\HAPPY\Happy Folder\Happy DB.mdb", "Happy_Table", "CustomerID"

为了更清楚地说明这一点:access表和电子表格表中都有12列……我需要确保数据可以读入正确列下的单元格……access表中也有一个loadID,指示数据指向哪个公司……您可以快速轻松地完成此操作,无需代码:@HackSlash感谢您的帮助反馈对于我的工作,我需要使用excel将数据保存到access文件中,同时,我需要在需要时从access文件中提取公司的数据。我在主工作表中设置了宏按钮。因此,这不仅仅是一步,而是一项重复性的工作。希望这有意义:(((为什么不在Excel中设置一个链接并使用代码进行刷新?是的,我提供的链接演示了如何进行此操作。也许他们不知道这是一个链接。您可以选择各种选项,以确定何时从Access刷新最新数据。哇,6月7日!感谢您为我编辑代码!我将进行测试。是的,我有Microsoft office 16.0 Access database engine对象签入VBE“References”。您好,6月7日,刚刚测试了您的代码,我想我犯了一些错误。Set db=OpenDatabase(DBFullName,false,false,“pwd=HAPPY”)我需要使用访问文件的实际路径来替换DBFullName吗?类似于:Set db=OpenDatabase(“H:\Summary\test Folder\test.mdb”,false,false,“pwd=AIF”)我应该把DAOCYFROMRecordset“H:\HAPPY\HAPPY Folder\HAPPY DB.mdb”、“HAPPY_Table”、“CustomerID”放在哪里"当我运行模块时,宏表弹出,代码没有运行。为什么?我一定是做错了。很抱歉有这么多问题。我在主工作表中设置了两个按钮。一个是将数据写入数据库,另一个是从数据库导入数据。我的电子表格有8个选项卡,1-7个选项卡正在导入数据正确ctly(这由编码的一部分处理).对于最后一个选项卡-选项卡8,它需要使用我要求你们执行导入的编码..因此我创建了一个单独的模块来测试仅针对选项卡8的导入,稍后我将希望将编码移动到我导入选项卡1-7数据的编码部分。因此,最终,当我单击一个按钮并选择公司名称时,它将为我提供所有数据对于表1-8,正如我所说,可以硬编码工作簿路径、表名和字段名,并消除参数和调用。在过程中声明和设置变量-与TargetRange相同,但字符串变量不需要设置。