【发布时间】:2019-06-13 12:56:04
【问题描述】:
我需要帮助,通过一个由大约 280.000 行数据组成的不断扩展的 Access 数据库进行大规模循环。该程序每周添加 3000 行数据,因此宏运行时间只会增加。大约需要一小时才能完成。
完成我的程序的最佳方式是什么?我有 VBA 经验,但 SQL 知识有限。
总结的问题是,位于“此处需要帮助”中的 If 语句贯穿 3000 家公司的 280.000 行数据。
目标是在JQHistory中将公司的每周新鲜分数进行评分,但必须考虑运行宏的日期
注意:“此处需要帮助”之外的所有内容,我已在另一个宏中进行了优化。我把它留下来希望能改善问题的背景。
这是未优化的宏:
Sub OpdaterKvant()
Dim wb As Workbook
Dim ws As Worksheet
Dim DatoIn As Date
Set db = New ADODB.Connection
Set DbEQ = New ADODB.Connection
'The location of the database is determined outside the macro'
strConn = ConnectionString
db.Open strConn
Set wb = Workbooks.Open("My File Location")
Set ws = wb.Worksheets(1)
n = ws.UsedRange.Rows.Count
DateIn = Right(ws.Cells(1, 1), 2) & "-" & Mid(ws.Cells(1, 1), 5, 2) & "-" & Left(ws.Cells(1, 1), 4)
Dato = Format(DateIn, "mm-dd-yyyy")
db.Execute ("DELETE * FROM JQScores")
For i = 3 To n
Sedol = Replace(ws.Cells(i, 1), " ", "")
Company = Left(Replace(ws.Cells(i, 2), "'", ""), Len(Replace(ws.Cells(i, 2), "'", "")) - 1)
Country = Replace(ws.Cells(i, 3), " ", "")
Region = Replace(ws.Cells(i, 4), " ", "")
Sector = Replace(ws.Cells(i, 5), " ", "")
MarketCap = Replace(Replace(ws.Cells(i, 6), " ", ""), ",", ".")
JQRank = Replace(ws.Cells(i, 7), " ", "")
ValueRank = Replace(ws.Cells(i, 8), " ", "")
QualityRank = Replace(ws.Cells(i, 9), " ", "")
MomentumRank = Replace(ws.Cells(i, 10), " ", "")
JQScore = Replace(Replace(ws.Cells(i, 11), " ", ""), ",", ".")
'Inserts the information into the Access database.'
Sql = "Insert into JQScores (Sedol, Company, Region, Sector, MarketCapUSD, JQ_Rank, Value_Rank, Quality_Rank, Momentum_Rank, JQ_Score, Country) VALUES ('" & Sedol & "','" & Company & "', '" & Region & "', '" & Sector & "', " & MarketCap & ", '" & JQRank & "', '" & ValueRank & "', '" & QualityRank & "', '" & MomentumRank & "', " & JQScore & ", '" & Country & "')"
db.Execute (Sql)
'*** HELP NEEDED IN THIS SECTION'
If db.Execute("Select Count(Id) as NumId from JQHistory where Sedol='" & Sedol & "' and history_date=#" & Dato & "#")("NumId") = 0 Then
Sql = "Insert into JQHistory (History_date, Sedol, Selskabsnavn, JQScore, JQ_Rank, Value_Rank, Momentum_Rank, Quality_Rank, Marketcap) VALUES (#" & Dato & "#, '" & Sedol & "','" & Company & "'," & JQScore & ", '" & JQRank & "', '" & ValueRank & "', '" & MomentumRank & "', '" & QualityRank & "', " & MarketCap & ")"
db.Execute (Sql)
Else
Sql = "Update JQHistory set MarketCap=" & MarketCap & ", Selskabsnavn='" & Company & "' , JQ_Rank='" & JQRank & "', Value_Rank='" & ValueRank & "', Quality_Rank='" & QualityRank & "', Momentum_Rank='" & MomentumRank & "', JQScore=" & JQScore & " WHERE SEDOL='" & Sedol & "' and History_Date=#" & Dato & "#"
db.Execute (Sql)
End If
'***'
Next i
db.Close
wb.Close
【问题讨论】:
-
嗯,看起来您不能使用访问权限创建多个插入语句:stackoverflow.com/questions/62504/…。真的有必要每天删除表中100%的数据然后插入280k+行吗?有没有更好的方法来构建不涉及该步骤的信息或数据?
-
您误解了我试图改进上下文的尝试。它在名为“JQScores”和“JQHistory”的数据库之间交替。 JQScores 由每周更新的 3.000 行组成,其中 JQHistory 是由 280.000 行 JQScores 组成的时间序列,每周添加以显示随时间的演变:)
-
不执行SQL,而是使用DAO打开Access数据库,然后使用AddNew和Update方法添加记录。它会更快。或者将其上下颠倒并使用 Access 导入电子表格。
-
谢谢。您知道使用 DAO 将列过滤到特定日期的方法吗?
-
执行不适用于 SELECT,只能用于 SQL 操作(DELETE、INSERT、UPDATE)。在 Access 中,使用域聚合,例如 DCount 或 DLookup 或 DSum。在 Excel 中打开一个记录集对象和引用字段。