将MS Access表拆分为零件并使用VBA导出到Excel

时间:2016-03-31 11:16:00

标签: vba excel-vba ms-access access-vba excel

我有一个大约50000条记录的Access表,我需要将这些记录拆分成3个部分,并使用VBA将这些部分导出到单独的excel文件或表格中。

我需要这个,因为这些Excel文件用于其他地方,文件中的最大记录数只能是大约20000条记录。

我玩过docmd.transferspreadsheet方法,但似乎无法拆分它们。

任何想法或帮助表示赞赏。

编辑:我正在使用的这个表由列组成:部件号(由各种不同的字符组成),描述,价格,注释。它没有ID号,从1到50000每个与记录有关。

3 个答案:

答案 0 :(得分:3)

由于您可能在表格中有一个唯一的数字 Id ,请创建这三个查询并逐个导出:

 Select * From YourTable Where Id Mod 3 = 0

 Select * From YourTable Where Id Mod 3 = 1

 Select * From YourTable Where Id Mod 3 = 2

选项:添加虚拟行号:

创建一个像这样的查询:

SELECT RowCounter([ProductKey],False) AS Id, *
FROM YourTable
WHERE (RowCounter([ProductKey],False) <> RowCounter("",True));

使用以下功能。然后调整三个查询以使用新查询。

Public Function RowCounter( _
  ByVal strKey As String, _
  ByVal booReset As Boolean, _
  Optional ByVal strGroupKey As String) _
  As Long

' Builds consecutive RowIDs in select, append or create query
' with the possibility of automatic reset.
' Optionally a grouping key can be passed to reset the row count
' for every group key.
'
' Usage (typical select query):
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True));
'
' Usage (with group key):
'   SELECT RowCounter(CStr([ID]),False,CStr[GroupID])) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter(CStr([ID]),False) <> RowCounter("",True));
'
' The Where statement resets the counter when the query is run
' and is needed for browsing a select query.
'
' Usage (typical append query, manual reset):
' 1. Reset counter manually:
'   Call RowCounter(vbNullString, False)
' 2. Run query:
'   INSERT INTO tblTemp ( RowID )
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable;
'
' Usage (typical append query, automatic reset):
'   INSERT INTO tblTemp ( RowID )
'   SELECT RowCounter(CStr([ID]),False) AS RowID, *
'   FROM tblSomeTable
'   WHERE (RowCounter("",True)=0);
'
' 2002-04-13. Cactus Data ApS. CPH
' 2002-09-09. Str() sometimes fails. Replaced with CStr().
' 2005-10-21. Str(col.Count + 1) reduced to col.Count + 1.
' 2008-02-27. Optional group parameter added.
' 2010-08-04. Corrected that group key missed first row in group.

  Static col      As New Collection
  Static strGroup As String

  On Error GoTo Err_RowCounter

  If booReset = True Then
    Set col = Nothing
  ElseIf strGroup <> strGroupKey Then
    Set col = Nothing
    strGroup = strGroupKey
    col.Add 1, strKey
  Else
    col.Add col.Count + 1, strKey
  End If

  RowCounter = col(strKey)

Exit_RowCounter:
  Exit Function

Err_RowCounter:
  Select Case Err
    Case 457
      ' Key is present.
      Resume Next
    Case Else
      ' Some other error.
      Resume Exit_RowCounter
  End Select

End Function

答案 1 :(得分:3)

试试这个:

Sub ExportChunks()
Dim rs As Recordset
Dim ssql As String
Dim maxnum As Long
Dim numChunks As Integer

Dim qdef As QueryDef

ssql = "SELECT COUNT(Id) FROM BigTable"
Set rs = CurrentDb.OpenRecordset(ssql)

maxnum = rs.Fields(0).Value  'total number of records

'add 0.5 so you always round up:
numChunks = Round((maxnum / 20000) + 0.5, 0)

On Error Resume Next 'don't break if Chunk_1 not yet in QueryDefs

ssql = "SELECT TOP 20000 * FROM BigTable"
CurrentDb.QueryDefs.Delete "Chunk"
Set qdef = New QueryDef
qdef.SQL = ssql
qdef.Name = "Chunk"
CurrentDb.QueryDefs.Append qdef
CurrentDb.QueryDefs.Refresh
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "Chunk_1", "C:\00_Projekte_temp\Chunk_1.xlsx"

For i = 2 To numChunks
    ssql = "SELECT TOP 20000 * FROM BigTable WHERE ID NOT IN (SELECT TOP " & (i - 1) * 20000 & " ID FROM BigTable)"
    Set qdef = CurrentDb.QueryDefs("Chunk")
    qdef.SQL = ssql
    CurrentDb.QueryDefs.Refresh
    Set qdef = CurrentDb.QueryDefs("Chunk_" & i)
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, qdef.Name, "C:\00_Projekte_temp\" & qdef.Name & ".xlsx"
Next i

End Sub

它做什么?首先,它计算您需要多少块,然后创建将占用前20,000条记录的查询,然后创建下一条等等,最后将每个分块查询导出到Excel文件。

编辑:修改为onyl会创建一个在每次迭代中被覆盖并导出到新Excel文件的查询。

答案 2 :(得分:2)

如果您有一个标准,您可以分配数据,通过查询,查询集或参数化查询完成此分区,您可以使用查询的SQL属性替换参数代码和VBA Replace()功能。

如果没有条件,请在临时表中创建一个:

  1. 将表中的所有数据插入临时表,添加布尔字段Exported,默认值False;

  2. 使用特定订单创建查询MyQuery (可能在主键上),以便您拥有一个包含您要使用的所有数据的对象:

    SELECT TOP 20000 * FROM TempTable WHERE Exported = FALSE ORDER BY [Part Number]
    
  3. MyQuery中的数据导出到Excel;

  4. MyQuery中的记录设置为TRUE

    UPDATE MyQuery SET Exported = TRUE
    
  5. MyQuery为空之前,请删除TempTable或其内容。