Set iDoc = IE.Document 在 VBA 中给出 运行 时间错误
Set iDoc = IE.Document gives run-time error in VBA
我有一个奇怪的问题。我使用的是 32 位版本的 IE 10。最终用户使用的是 64 位版本的 IE10
对我来说 set iDoc = IE.Document
在下面的代码片段中工作正常。但是对于最终用户,我得到 "Type mismatch error".
下面是我的代码:
Function Run() As Integer
Dim IE As InternetExplorer
Dim dataCount%
Set IE = GetIE
Navigate IE, "http://www.my-url-here.com/index.php"
Call Login(IE)
IE.Quit
End Function
Private Sub Login(IE As InternetExplorer)
Dim iDoc As HTMLDocument
Dim uName$, pwd$
Set iDoc = IE.Document ' here is where it gives type mismatch error
Call GetLoginDetails(jobBoard, uName, pwd)
iDoc.getElementById("login").Value = uName
iDoc.getElementById("pw").Value = pwd
iDoc.getElementsByClassName("sub_btn")(0).Click
Sync IE
End Sub
Sub Sync(IE As InternetExplorer)
Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Do While IE.Document.ReadyState <> "complete"
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
'Debug.Print "Out: " & IE.Document.ReadyState
End Sub
Sub Navigate(IE As InternetExplorer, address$)
IE.Navigate address
Sync IE
End Sub
Function GetIE() As InternetExplorer
Set GetIE = New InternetExplorer
With GetIE
.Visible = True
.Height = 550
.Width = 800
.Left = Application.Width - .Width
End With
End Function
请注意:IE.Document.getElementById("login").Value = uName
对我们双方都很好。
虽然不是特定于 IE,this MS article 暗示在 VBA 和 x64 系统中存在与基础 API 调用相关的已知问题。
通过 external/custom API 调用,我们可以使用 PtrSafe
和 LongPtr
声明来适应这一点。
使用后期绑定,我发现它过去对我有用:
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
缺点是您将失去 intellisense 功能 - 但如果代码没有 运行 我想 IntelliSense 并不是那么有用...
我有一个奇怪的问题。我使用的是 32 位版本的 IE 10。最终用户使用的是 64 位版本的 IE10
对我来说 set iDoc = IE.Document
在下面的代码片段中工作正常。但是对于最终用户,我得到 "Type mismatch error".
下面是我的代码:
Function Run() As Integer
Dim IE As InternetExplorer
Dim dataCount%
Set IE = GetIE
Navigate IE, "http://www.my-url-here.com/index.php"
Call Login(IE)
IE.Quit
End Function
Private Sub Login(IE As InternetExplorer)
Dim iDoc As HTMLDocument
Dim uName$, pwd$
Set iDoc = IE.Document ' here is where it gives type mismatch error
Call GetLoginDetails(jobBoard, uName, pwd)
iDoc.getElementById("login").Value = uName
iDoc.getElementById("pw").Value = pwd
iDoc.getElementsByClassName("sub_btn")(0).Click
Sync IE
End Sub
Sub Sync(IE As InternetExplorer)
Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
Do While IE.Document.ReadyState <> "complete"
Application.Wait Now + TimeSerial(0, 0, 1)
Loop
'Debug.Print "Out: " & IE.Document.ReadyState
End Sub
Sub Navigate(IE As InternetExplorer, address$)
IE.Navigate address
Sync IE
End Sub
Function GetIE() As InternetExplorer
Set GetIE = New InternetExplorer
With GetIE
.Visible = True
.Height = 550
.Width = 800
.Left = Application.Width - .Width
End With
End Function
请注意:IE.Document.getElementById("login").Value = uName
对我们双方都很好。
虽然不是特定于 IE,this MS article 暗示在 VBA 和 x64 系统中存在与基础 API 调用相关的已知问题。
通过 external/custom API 调用,我们可以使用 PtrSafe
和 LongPtr
声明来适应这一点。
使用后期绑定,我发现它过去对我有用:
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
缺点是您将失去 intellisense 功能 - 但如果代码没有 运行 我想 IntelliSense 并不是那么有用...