VBA 过程仅返回特定日期的结果

Posted

技术标签:

【中文标题】VBA 过程仅返回特定日期的结果【英文标题】:VBA procedure returns results only up to a certain date 【发布时间】:2016-10-11 20:09:49 【问题描述】:

每个人。我有一个程序可以每天从一个大表中提取某些数据,然后将这些数据粘贴到一个 Excel 文件中。源表包含大约 200 万条记录(从 01.10.2015 到 09.09.2016),并且以每月 220k 条记录的速度增长。以下过程成功提取了我需要的数据,直到 2016 年 6 月中旬。从那时起,它无法提取任何数据。运行常规查询确实表明数据在那里。打开表格也会显示相同的结果 - 数据截至 2016 年 9 月 9 日可用)。我认为代码还有其他问题,但它确实在另一个表上正常工作。它也适用于这个,但想不出为什么它在 2016 年 6 月中旬之后找不到记录的原因。我索引了日期字段,这是我用于提取记录的参数,但这没有帮助。非常感谢任何帮助和建议。谢谢你的时间。这是我的代码:

Dim xl As Excel.Application
Dim wb As Excel.Workbook
Dim xs As Excel.Worksheet
Dim rng As Excel.Range
Dim c_range As Excel.Range


Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strsql As String

strsql = "SELECT tblTraderExecutions.exec_id, tblTraderExecutions.exec_date, tblTraderExecutions.exec_time, tblTraderExecutions.empty, tblTraderExecutions.exec_string, tblTraderExecutions.internal_order_id, tblTraderExecutions.trading_account, " & _
"tblTraderExecutions.trading_account, tblTraderExecutions.operation_bg, tblTraderExecutions.empty, tblTraderExecutions.empty, tblTraderExecutions.symbol, tblTraderExecutions.symbol, tblTraderExecutions.price, tblTraderExecutions.quantity, " & _
"tblTraderExecutions.currency, ROUND(tblTraderExecutions.total_comm,2), tblTraderExecutions.empty, Round((tblTraderExecutions.quantity * tblTraderExecutions.price),2), Round((tblTraderExecutions.quantity * tblTraderExecutions.price),2), " & _
"tblTraderExecutions.trade_broker, tblTraderExecutions.contra, tblTraderExecutions.accept_broker FROM tblTraderExecutions " & _
"WHERE [exec_date] = [start_date] ORDER BY [tblTraderExecutions].[exec_id]"
Set dbs = CurrentDb
Set qdf = dbs.CreateQueryDef(vbNullString, strsql)
qdf.Parameters("start_date").Value = Forms!frmPropReports!txtDate
Set rst = qdf.OpenRecordset

Set xl = New Excel.Application
xl.Visible = True
Set wb = xl.Workbooks.Open("D:\mpuls\trader_executions_export.xlsx")
Set ws = wb.Worksheets("DNEVNICI")
Set rng = ws.Range("a8")
rng.CopyFromRecordset rst

Set c_range = ws.Range("c8:c65000")
c_range.NumberFormat = "h:mm:ss;@"

rst.Close
qdf.Close
Set qdf = Nothing

Set rst = Nothing
Set dbs = Nothing

【问题讨论】:

可能是因为您希望处理超过 100 万行,而 Excel 只能存储(在任何给定的工作表上)不超过 1,048,576 行吗?也许 2016 年 6 月是 Excel 达到 100 万限制的地方? 根据@Ralph 的建议,您能否放置rst.MoveLastMsgBox rst.RecordCount 以查看记录集保存了多少条记录? 或者,您可以使用 `ADODB.Recordset.GetRows()` 方法获取可以写入工作表的数据数组。 查询只获取一天的数据,每月有22万条记录,相当于每天1万条记录,距离100万条还有很长的路要走。 @Selim:所以您的查询获得了start_date PARAMETERS start_date DateTime;。 【参考方案1】:

首先,我要感谢所有做出贡献的人。 我的数据库是在 Access 2016 上创建的,我在另一台 PC 上使用 Access 2013 运行它。这是它只将记录返回到某个日期的地方。在使用 Access 2016 将其移动到 PC 后,它按预期工作,但仅在后台运行 excel,所有适用的记录都在导出的文件中。那时我将行 xl.Visible = true 移到行 xl.workbooks.open 下方。这就像一个魅力。

【讨论】:

以上是关于VBA 过程仅返回特定日期的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用excel VBA仅引用一个数字来自动填充日期

VBA宏:捕获具有特定字符串的行并返回它

SQL 无法让 WHERE EXISTS 子句正常工作,并且仅返回在特定日期内具有客户端类型的行

查询在 QBE 中返回结果,但不是通过 VBA 代码

带 Pivot 的存储过程不返回结果结构,而是返回零值

带有枢轴的存储过程不会返回结果结构而是返回零值