【问题标题】:Import to Specific Excel Sheet from Access via VBA通过 VBA 从 Access 导入特定的 Excel 工作表
【发布时间】:2018-08-31 01:22:26
【问题描述】:

我试图弄清楚如何从 Access 表中获取要导入 Excel 的数据,以导入特定的工作表(称为 Sheet 2 或 Access Data 的工作表)。我有以下代码来获取数据并在导入后按照我想要的方式对其进行格式化,但我无法将其导入到特定的工作表中。我可以得到帮助吗?这是我所拥有的:

用分辨率更新代码:

Sub getAccessData()

Dim DBFullName As String
Dim Connect As String, Source As String
Dim Connection As ADODB.Connection
Dim Recordset As ADODB.Recordset
Dim Col As Integer
Dim lngLastColumn As Long
Dim lngLastRow As Long
Dim OXLSheet As Worksheet

Set OXLSheet = Worksheets("WorksheetName")

Worksheets("WorksheetName").Cells.Clear

'Datebase path info
DBFullName = "C:\Users\myname\Desktop\Database Backups\database.accdb"

'Open the connection for the database
Set Connection = New ADODB.Connection
Connect = "Provider=Microsoft.ACE.OLEDB.12.0;"
Connect = Connect & "Data Source=" & DBFullName & ";"
Connection.Open ConnectionString:=Connect


'Create RecordSet
Set Recordset = New ADODB.Recordset
With Recordset

    'Data Filter
    Source = "SELECT * FROM tblRetirements WHERE [AllowEnteredInPayroll] Is Null AND ApplicationCancelled = 'No'"
    .Open Source:=Source, ActiveConnection:=Connection


    'Write field Names
    For Col = 0 To Recordset.Fields.Count - 1
        Worksheets("WorksheetName").Range("A5").Offset(0, Col).Value = Recordset.Fields(Col).Name
    Next

    'Write Recordset
    Worksheets("WorksheetName").Range("A5").Offset(1, 0).CopyFromRecordset Recordset
End With
ActiveSheet.Columns.AutoFit
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing



With OXLSheet
    lngLastColumn = .Cells(5, .Columns.Count).End(xlToLeft).Column
    lngLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    .ListObjects.Add(xlSrcRange, .Range(.Cells(5, 1), .Cells(lngLastRow, lngLastColumn)), , xlYes).Name = "Table1"

    ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleMedium16"
End With

End Sub

谢谢。

【问题讨论】:

    标签: excel vba ms-access


    【解决方案1】:

    有一个错字,SELECT*FROM,应该是SELECT * FROM

    如果要导入到特定的工作表,名称output,请尝试替换:

    1. Range("A5").Offset(0, Col).Value = Recordset.Fields(Col).NameWorksheets("output").Range("A5").Offset(0, Col).Value = Recordset.Fields(Col).Name
    2. Range("A5").Offset(1, 0).CopyFromRecordset RecordsetWorksheets("output").Range("A5").Offset(1, 0).CopyFromRecordset Recordset

    【讨论】:

    • 为什么?我现在的导入代码按预期工作。我遇到的问题是它会清除当前活动工作表上的所有内容,而不是我要指定数据的工作表上的所有内容。
    • 为了简单起见,我删除了原始的 SELECT 条件并用“*”替换它,并打错了字。但是,我需要帮助的问题仍然悬而未决。你能帮我解决这个问题吗?
    • 代码没有错误。我需要帮助的是如何指定数据导入的工作表。目前,数据导入到当前工作表中,但我需要能够从一个按钮触发代码,该按钮将驻留在与我需要数据去的地方不同的工作表上。
    • 我修改了答案。
    • 我还必须更改其他几行,以确保活动工作表上的格式没有改变,但这很好用!谢谢!我真的很感激帮助。我将“Set OXLSheet = ActiveSheet”更改为“Set OXLSheet = Worksheets("Sheet6")”,将“Cells.Clear”更改为“Worksheets("Sheet6").Cells.Clear”。现在一切都按预期工作。再次感谢您。
    【解决方案2】:

    如果您想将数据复制到特定工作表中,例如名为Sheet2

    ' Declare a worksheet object
    Dim objSheet As Worksheet
    
    ' initialize it
    Set objSheet = ActiveWorkbook.Sheets("Sheet2")
    
    'Write field Names
    For Col = 0 To Recordset.Fields.Count - 1
        objSheet.Range("A5").Offset(0, Col).Value = Recordset.Fields(Col).Name
    Next
    
    'Write Recordset
    objSheet.Range("A5").Offset(1, 0).CopyFromRecordset Recordset
    

    【讨论】:

      【解决方案3】:

      这是从位于单个文件夹中的所有 EXCEL 文件(所有文件中的工作表名称相同)中的特定工作表导入数据的通用代码。具有相同工作表名称的所有 EXCEL 文件的工作表必须具有相同布局和格式的数据。

      Sub TryThis()
      
      Dim strPathFile As String, strFile As String, strPath As String
      Dim blnHasFieldNames As Boolean
      Dim intWorksheets As Integer
      
      ' Replace 3 with the number of worksheets to be imported
      ' from each EXCEL file
      Dim strWorksheets(1 To 3) As String
      
      ' Replace 3 with the number of worksheets to be imported
      ' from each EXCEL file (this code assumes that each worksheet
      ' with the same name is being imported into a separate table
      ' for that specific worksheet name)
      Dim strTables(1 To 3) As String
      
      ' Replace generic worksheet names with the real worksheet names;
      ' add / delete code lines so that there is one code line for
      ' each worksheet that is to be imported from each workbook file
      strWorksheets(1) = "GenericWorksheetName1"
      strWorksheets(2) = "GenericWorksheetName2"
      strWorksheets(3) = "GenericWorksheetName3"
      
      ' Replace generic table names with the real table names;
      ' add / delete code lines so that there is one code line for
      ' each worksheet that is to be imported from each workbook file
      strTables(1) = "GenericTableName1"
      strTables(2) = "GenericTableName2"
      strTables(3) = "GenericTableName3"
      
      ' Change this next line to True if the first row in EXCEL worksheet
      ' has field names
      blnHasFieldNames = False
      
      ' Replace C:\Documents\ with the real path to the folder that
      ' contains the EXCEL files
      strPath = "C:\Documents\"
      
      ' Replace 3 with the number of worksheets to be imported
      ' from each EXCEL file
      For intWorksheets = 1 To 3
      
            strFile = Dir(strPath & "*.xls")
            Do While Len(strFile) > 0
                  strPathFile = strPath & strFile
                  DoCmd.TransferSpreadsheet acImport, _
                        acSpreadsheetTypeExcel9, strTables(intWorksheets), _
                        strPathFile, blnHasFieldNames, _
                        strWorksheets(intWorksheets) & "$"
                  strFile = Dir()
            Loop
      
      Next intWorksheets
      
      End Sub
      

      【讨论】:

      • 这不是我要找的,但感谢您回答我的问题。
      猜你喜欢
      • 2017-06-15
      • 2011-11-16
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多