在VBA中引用Window对象

时间:2015-07-25 09:32:52

标签: excel vba excel-vba

我在VBA中引用Windows对象时遇到问题。它抛出以下错误:“错误5(无效的过程调用或参数)。我找不到原因,因为我看不到编程错误。

Public Sub TestWindowhandle()

Dim lResult As Long
Dim objShell, wins, winn
Dim IE_Count As Long, i As Long, This_PID As Long


On Error GoTo TestWindowhandle_Error

Set objShell = CreateObject("Shell.Application")
Set wins = objShell.Windows
IE_Count = wins.Count
For i = 0 To (IE_Count - 1)
   Set winn = wins.Item(i)
Next i

On Error GoTo 0
Exit Sub

TestWindowhandle_Error:

MsgBox "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & " in procedure TestWindowhandle of Module Module1"
Stop
End Sub

2 个答案:

答案 0 :(得分:1)

该接口有点奇怪,似乎只能使用控制变量的副本:

Set winn = wins.Item(i + 0)

Set winn = wins.Item((i))

答案 1 :(得分:0)

我相信这里正在发生的事情。

Item方法接受Variant参数。

当调用接受Variant参数的外部方法时,VB喜欢创建并传递通过引用提供值的变量 - 也就是说,设置VT_BYREF flag。 但是,当发送中间结果(临时值,不存储在变量中)时,VB不会设置此标志,这是有道理的,因为即使被调用的方法更新了值,也没有人能够看到它。

因此,当您致电.Item(i)时,VB会发送一个类型为VT_I4 | VT_BYREF的变体,当您调用.Item(i + 0)时,会调度类型VT_I4的变体,而不会VT_BYREF

在大多数情况下,差异并不显着,因为VARIANT感知方法应该能够应对。但是,这个特定的方法does different things取决于它接收到的VT_,并且因此明确愿意拒绝除了三个接受的VT_以外的任何Variant。因此,为了调用它,你需要欺骗VB去除byref标志。

有趣的是,当您将变量声明为VT_VARIANT | VT_BYREF时,VB仍会调度VT_I4,但该方法似乎支持这种情况并正确解析为具有非变量的指向内部变体引用类型ByVal

请注意,这与VB的ByRef / <script> $(function() { $("#date").datepicker(); $("#date").datepicker ({ dateFormat: "dd-mm-yyyy" }); }); </script> <tr> <td>Start Date</td> <div class="form-group"> @Html.LabelFor(model => model.date, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.date, new { htmlAttributes = new { @class = "date" } }) @Html.ValidationMessageFor(model => model.date, "", new { @class = "text-danger" }) </div> </div> </tr> <tr> <td>End Date</td> <div class="form-group"> @Html.LabelFor(model => model.date, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.date, new { htmlAttributes = new { @class = "date" } }) @Html.ValidationMessageFor(model => model.date, "", new { @class = "text-danger" }) </div> </div> </tr> 无关 - 这是关于VARIANT data type的内部结构。