Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel vba:暂停以完成参数化SQL查询?_Vba_Excel_Parameterized Query - Fatal编程技术网

excel vba:暂停以完成参数化SQL查询?

excel vba:暂停以完成参数化SQL查询?,vba,excel,parameterized-query,Vba,Excel,Parameterized Query,我有一个工作簿,其中几个数据源根据一些下拉菜单/用户操作将参数传递回SQL查询。这样可以保持工作簿的整洁、改进计算等—在工作簿中本地保留所有项目级别的详细信息是不实际的 我的VBA的某些元素依赖于对来自这些参数化查询的数据的评估。这里出现了一个问题-VBA在计算宏中的所有内容之前,不会等待参数传回查询 我很好奇是否有人对以编程方式“暂停”VBA执行直到提要刷新的最佳实践有什么想法或建议。我现在的工作是将我的VBA分为两部分,将依赖于更改数据的任何内容放入一个单独的函数中,并使用applicati

我有一个工作簿,其中几个数据源根据一些下拉菜单/用户操作将参数传递回SQL查询。这样可以保持工作簿的整洁、改进计算等—在工作簿中本地保留所有项目级别的详细信息是不实际的

我的VBA的某些元素依赖于对来自这些参数化查询的数据的评估。这里出现了一个问题-VBA在计算宏中的所有内容之前,不会等待参数传回查询

我很好奇是否有人对以编程方式“暂停”VBA执行直到提要刷新的最佳实践有什么想法或建议。我现在的工作是将我的VBA分为两部分,将依赖于更改数据的任何内容放入一个单独的函数中,并使用application.ontime暂停X秒

Application.OnTime Now + TimeSerial(0, 0, 10), "Restart"
这是一个90%的解决方案,但并不理想。时间长度是任意的-在一个非常慢的连接上它不够长,在一个快速的连接上它是不必要的慢

理想情况下,可以通过某种方式等待Excel准备就绪,然后继续。与使用MS Internet控件库时可以使用的方式类似

Do Until .document.ReadyState = "complete"
暂停执行,直到IE返回就绪状态。有没有更优雅的解决方案

编辑:根据下面的jon,添加代码并解释SQL查询的工作原理:

select sts1.studentid, sts1.alphascore as testcycle, 
sts2.numscore as lexile, sts3.alphascore as gleq, sts4.numscore as nce

from ps.studenttestscore sts1
join ps.students stu on (sts1.studentid = stu.id)
join ps.studenttestscore sts2 on (sts1.studenttestid = sts2.studenttestid)
join ps.studenttestscore sts3 on (sts1.studenttestid = sts3.studenttestid)
join ps.studenttestscore sts4 on (sts1.studenttestid = sts4.studenttestid)

where (stu.id = ? ) and (sts1.testscoreid = 578) and (sts2.testscoreid = 575) 
and (sts3.testscoreid = 577) and (sts4.testscoreid = 576)
那个?是传递相关学生ID的参数-MS查询使用该参数的单元格值。它所查找的单元格仅具有基于所选学生的查找:

=IFERROR(INDEX(Stu!$B:$F,MATCH(Student!B2,Stu!$F:$F,0),1),999999)

(iferror只是向上传递一个任意数字,以防止在选择不正确的值时弹出令人讨厌的对话框)。

您的错误是使用MS Query。使用ADODB对数据库调用进行编码,并等待ADODB.Command对象的Execute方法

…如果你真的这么做的话。这里有一定数量的猜测,但是看起来查询的状态——而不是它嵌入的表——是您需要的信息

这段代码异步调用SQL查询—它在概念上类似于命令对象,这(我认为)是您实际正在做的—原始的“sleep”循环可以由进度条或用于在其他地方轮询标志和计算的代码代替

仅供参考,ADO对象的状态和状态属性可能会令人困惑。通常,0表示关闭,1表示打开(对于返回打开的连接或数据集的对象),大于1的值对应于等待或执行

当然,您可以同步调用查询

我可以给你“数据连接”的代码,但你最好去ConnectionStrings.com

Public Function FetchRecordSet(SQL As String, Optional CursorType As CursorTypeEnum = adOpenForwardOnly) As ADODB.Recordset On Error Resume Next Set FetchRecordSet = New ADODB.Recordset With FetchRecordSet .CacheSize = 8 Set .ActiveConnection = DataConnection .Open SQL, , CursorType, adLockReadOnly, adCmdText + adAsyncFetch Do While .State > 1 Application.StatusBar = "Retrieving data... " Sleep 250 Loop End With Application.StatusBar = False End Function 它跑得快多了

在MSDN上查找CommandTypeEnum,并使用最适合您的命令:

对命名表使用adCmdTable,并查看它是否比对“视图”对象使用adCmdStoredProc更有效-我发现它在数据库引擎之间有所不同


[/Update]

请您给出一个SQL调用和周围代码的较长示例,我不知道为什么它会等待执行。Cheeset不清楚您是如何执行SQL的-您能显示您的VBA代码吗?您的“数据源”具体使用什么? SQL = "SELECT * FROM MyQuery" .Open SQL, , CursorType, adLockReadOnly, adCmdText + adAsyncFetch SQL = "MyQuery" .Open SQL, , CursorType, adLockReadOnly, adCmdStoredProc + adAsyncFetch