【问题标题】:Retrieve Recordset Populate Array and Output onto Worksheet检索记录集填充数组并输出到工作表
【发布时间】:2021-09-28 06:04:45
【问题描述】:

这么多年过去了,我看到了几个问题,询问如何使用 Recordset 填充数组,但没有一个问题涉及如何在一个过程中将输出写入工作表。因此,我决定提出这个问题,以便提供我随着时间的推移得出的答案。

【问题讨论】:

  • 只是想检查一下您是否知道Range.CopyFromRecordset 方法?当记录集可以直接写入范围时,是否需要创建数组的步骤?

标签: arrays vba output worksheet recordset


【解决方案1】:
'Goes on Top
Option Explicit
Option Compare Text
Option Base 1

Public Sub Recordset_to_Array_to_Worksheet()

Dim MyArray() As Variant 'unbound Array with no definite dimensions'
Dim db as DAO.Database
Dim rst as DAO.Recordset
Dim strSQL as String, Fieldname as String
Dim i as Integer, j as Integer, colcnt as Integer, rowcnt as Integer
Dim wb as Workbook
Dim ws as Worksheet
Dim Dest as Range

'------------------------RECORDSET------------------------'
Set db = Opendatabase("URL link") 'or Set db = Currentdb()
strSQL = "SQL Statement Here"

Set rst = db.OpenRecordset(strsQL, dbOpenDynaset)

If rst.recordcount <> 0 then '///Do NOT Use "Do While Not rst.EOF" Can cause Problems///'
    colcnt = rst.Fields.Count-1
    rowcnt = rst.recordcount
 Else
    Exit Sub
End IF

'-----------------------------WRITE RECORDSET TO MYARRAY----------------------------'
ReDim MyArray (rowcnt, colcnt) 'Redimension MyArray parameters to fit the SQL returned'
rst.MoveFirst

'Populating Array with Headers from Recordset'
For j = 0 To colcnt
     MyArray(0,j) = rst.Fields(j).name
Next

'Populating Array with Record Data
For i = 1 to rowcnt
    For j = 0 to colcnt
        MyArray(i,j) = rst(j)
    Next J
    rst.movenext
Next i

'---------------------------------WORKSHEET OUTPUT---------------------------------'
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Insert Worksheet Name")
Set Dest = ws.Range("A1") 'Destination Cell
Dest.Resize(UBound(MyArray, 1) + 1, UBound(MyArray, 2) + 1).value = 
Application.Transpose(MyArray) 'Resize (secret sauce)

End Sub

【讨论】:

  • 我认为你应该在codereview.stackexchange.com 上发布这个 - 有很多可以优化的地方,例如你可以使用recordset.getRows (docs.microsoft.com/en-us/office/client-developer/access/…),使用每个任务的subs (getRecordset, getArrayFromRecordset, writeArrayToRange)等来构建更通用的代码
  • @Ike 我认为您不能为此使用“.GetRows”,除非您愿意在填充数组时转置数据。但是,我一定会按照您的建议将其发布在 Codereview 上。
  • 是的 - 你必须使用转置 - 但这没问题 - 我一直在使用大量记录集。
  • @Ike,不,你不明白。您必须创建一个完全独立的公共函数 --> TransposeArray(InputArr As Variant) As Variant。创建第二个子例程只是在填充数组时转置数据是低效的。对于这种情况,没有人会这样做。
  • 为什么不呢? - 我的主要编程规则之一是:一个函数/例程 = 一项任务 - 我有很多非常小的例程 - 但可以重复使用和单独测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多