我查了一篇文章(http://www.mrexcel.com/forum/excel-questions/553580-visual-basic-applications-macro-already-open-ie-window.html)。在这里,答案对我来说非常有趣,就像在代码中一样 -
text/html
这里CreateObject()使用" Shell.Application"和其他时间一起使用" InternetExplorer.Application"。第一次用它来引用已打开的窗口或已经激活但第二次用它来创建一个新的浏览器窗口。
我尝试运行以下代码,即使已经打开了实例,每次都会生成新的IE窗口。
Sub GetIE_LateBinding()
Dim IE As Object
With CreateObject("Shell.Application").Windows
If .Count > 0 Then
' Get IE
Set IE = .Item(0) ' or .Item(.Count - 1)
Else
' Create IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
End If
IE.Navigate "http://support.microsoft.com/kb/q176792/"
Set IE = Nothing
End With
End Sub
我可以理解" InternetExplorer.Application"的行为。 - 每次创建新的IE应用程序实例因此新窗口。但是" Shell.Application"似乎获取已经打开的shell应用程序实例,因此,我们可以浏览已经打开的IE窗口。似乎有点混乱。我在哪里错过了?
注意:我正在猜测与#34; Shell.Application"的class_initialize()相关的内容。如果是这样,请帮我一个参考。
答案 0 :(得分:0)
IE和Explorer曾经是同一个程序,这就是Shell.Application列出打开IE Windows的原因。它只是这样做,因为他们曾经都是资源管理器窗口。你很幸运,这符合你的需求。
CreateObject
用于创建新对象。
GetObject(filename)
连接到打开的文件,如果没有打开,则打开它。
Set xlBook = GetObject("C:\Users\David Candy\Documents\Super.xls")
msgbox xlbook.name
GetObject("","shell.application")
连接到现有对象,如果它没有运行则会失败。
Set GetExcelApp = GetObject("", "Excel.Application")
Msgbox GetExcelApp
不要太挂在物体上。许多对象只是像Shell.Application这样的函数库。 您创建了一个新的函数库对象。
来自COM帮助。
**Component Automation**
将Visual Basic映射到自动化
Visual Basic为Automation提供全面支持。下表列出了Visual Basic语句如何转换为OLE API。
Visual Basic语句OLE API
CreateObject (ProgID)
CLSIDFromProgID CoCreateInstance的 QueryInterface获取IDispatch接口。
GetObject (filename, ProgID)
CLSIDFromProgID CoCreateInstance的 IPersistFile接口的QueryInterface。 在IPersistFile接口上加载。 QueryInterface获取IDispatch接口。
GetObject (filename)
CreateBindCtx为后续函数创建绑定上下文。 MkParseDisplayName返回BindMoniker的名字句柄。 BindMoniker返回指向IDispatch接口的指针。 释放绰号句柄。 发布背景信息。
GetObject (ProgID)
CLSIDFromProgID 类ID上的GetActiveObject。 QueryInterface获取IDispatch接口。
Dim x As New interface
查找接口的CLSID。 CoCreateInstance的 QueryInterface
©Microsoft Corporation。保留所有权利。