访问 VBA:Scripting.Dictionary - 转储到表?
Posted
技术标签:
【中文标题】访问 VBA:Scripting.Dictionary - 转储到表?【英文标题】:Access VBA: Scripting.Dictionary - Dump to Table? 【发布时间】:2016-09-14 13:28:06 【问题描述】:感谢前面提供的帮助,我有了一种计算记录集中字符串之间词频的实用方法。以下代码会产生所需的结果。
最后一步是将字典结构转储到 currentDB 中的 Access 表中。我可以通过下面注释的每个键单步执行并通过 SQL 附加到表中 - 但使用 24K 术语非常慢。
已更新 >> 带解决方案
Private Sub Command0_Click()
Dim counts As New Scripting.Dictionary
Dim word As Variant
Dim desc As String
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset '<< solution
Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "SELECT DISTINCT Items.Description FROM Items ;"
Set rs1 = db.OpenRecordset(strSQL, dbOpenDynaset)
Do While Not rs1.EOF
For Each word In Split(rs1!Description, " ")
If Not counts.Exists(word) Then
counts.Add word, 1
Else
counts.Item(word) = counts.Item(word) + 1
End If
Next
rs1.MoveNext
Loop
'>> .AddNew Solution inserted as suggested below <<
rs2 = db.OpenRecordset("Freq", dbOpenTable)
For Each word In counts.Keys
With rs2
.AddNew ' Add new record
.Fields!Term = word
.Fields!Freq = counts(word)
.Update
.Bookmark = .LastModified
End With
Next
rs2.Close
'>> End Solution <<
Set rs1 = Nothing
Set rs2 = Nothing
MsgBox "Done"
End Sub
问题:
-
我可以将字典转储到 BULK 的表中,而不是逐个逐个遍历键吗?
基本原理:(对我而言)使用表格结构更容易执行下游表示和操作。
谢谢!
【问题讨论】:
没有循环真的没有办法做到这一点。即使在 .NET 中,您从 Dictionary 中获得的最接近的是键/值对数组。 DAO 连接应该通过 INSERT 循环提供良好的性能。 为什么不直接将其添加到表中,而不是先写入字典。然后你可以用计数对数据进行分组。 【参考方案1】:您的代码没有显示您如何尝试插入行 - 我假设每行都有单独的 INSERT INTO (...) VALUES (...)
语句?
对于循环中的多个插入,不要使用 SQL INSERT 语句。而是使用DAO.Recordset
和.AddNew
,它会快得多。
看到这个答案:https://***.com/a/33025620/3820271
这里举个例子:https://***.com/a/36842264/3820271
【讨论】:
Andre, 17K ".AddNew" 按照您的建议插入 @MarkPelletier:您可以通过删除.Bookmark = .LastModified
来减少更多毫秒 - 只有当您想从新添加的记录中读取数据时才需要这样做,例如自动编号主键。以上是关于访问 VBA:Scripting.Dictionary - 转储到表?的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过 VBA 访问 Lync 时在 Excel VBA 编辑器中使用的参考