GetObject函数的使⽤
GetObject 函数ActiveX 对象的引⽤
返回⽂件中的 ActiveX 对象的引⽤。
语法
GetObject([pathname] [, class])
GetObject 函数的语法包含下⾯⼏个命名参数:
部分 描述
pathname 可选的;Variant (String)。包含待检索对象的⽂件的全路径和名称。如果省略 pathname,则 class 是必需的。
class 可选的;Variant (String)。代表该对象的类的字符串。
其中,class 参数的语法格式为 appname.objecttype,且语法的各个部分如下:
部分 描述
appname 必需的;Variant (String)。提供该对象的应⽤程序名称。
objecttype 必需的;Variant (String)。待创建对象的类型或类。
说明
使⽤ GetObject 函数可以访问⽂件中的 ActiveX 对象,⽽且可以将该对象赋给对象变量。可以使⽤ Set 语句将 GetObject 返回的对象赋给对象变量。例如:
Dim CADObject As Object
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")
当执⾏上述代码时,就会启动与指定的 pathname 相关联的应⽤程序,同时激活指定⽂件中的对象。
如果 pathname 是⼀个零长度的字符串 (""),则 GetObject 返回指定类型的新的对象实例。如果省略了 pathname 参数,则 GetObject 返回指定类型的当前活动的对象。如果当前没有指定类型的对象,就会出错。
有些应⽤程序允许只激活⽂件的⼀部分,其⽅法是在⽂件名后加上⼀个惊叹号 (!) 以及⽤于标识想要激活的⽂件部分的字符串。关于如何创建这种字符串的信息,请参阅有关应⽤程序创建对象的⽂档。
例如,在绘图应⽤程序中,⼀个存放在⽂件中的图可能有多层。可以使⽤下述代码来激活图中被称为 SCHEMA.CAD 的层:
Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")
如果不指定对象的 class,则⾃动化会根据所提供的⽂件名,来确定被启动的应⽤程序以及被激活的对象。不过,有些⽂件可能不⽌⽀持⼀种对象类。例如,图⽚可能⽀持三种不同类型的对象:Application 对象,Drawing 对象,以及 Toolbar 对象,所有这些都是同⼀个⽂件中的⼀部分。为了说明要具体激活⽂件中的哪种对象,就应使⽤这个可选的 class 参数。例如:
Dim MyObject As Object
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")
在上述例⼦中,FIGMENT 是⼀个绘图应⽤程序的名称,⽽ DRAWING 则是它⽀持的⼀种对象类型。
对象被激活之后,就可以在代码中使⽤所定义的对象变量来引⽤它。在前⾯的例⼦中,可以使⽤对象变量 MyObject 来访问这个新对象的属性和⽅法。例如:
MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"
注意 当对象当前已有实例,或要创建已加载的⽂件的对象时,就使⽤ GetObject 函数。如果对象当前还没有实例,或不想启动已加载⽂件的对象,则应使⽤ CreateObject 函数。
如果对象已注册为单个实例的对象,则不管执⾏多少次 CreateObject,都只能创建该对象的⼀个实例。若使⽤单个实例对象,当使⽤零长度字符串 ("") 语法调⽤时,GetObject 总是返回同⼀个实例,⽽若省略 pathname 参数,就会出错。不能使⽤ GetObject 来获取 Visual Basic 创建的类的引⽤。
VBA⾥的GetObject 函数⽰例
该⽰例使⽤ GetObject 函数来获取对指定的 Microsoft Excel 的⼯作表 (MyXL) 的引⽤。它使⽤⼯作表的 Application 属性来显⽰或关闭Microsoft Excel 等等。DetectExcel Sub 过程通过调⽤两个 API 函数,来查 Microsoft Excel。如果 Microsoft Excel 正在运⾏,则将其放⼊运⾏对象表(Running Object Table)中。如果 Microsoft Excel 不在运⾏,则第⼀次调⽤ GetObject 将导致错误。在本例中,出现该错误则把 ExcelWasNotRunning 标志设为 True。第⼆次调⽤ GetObject 是指定要打开的⼀个⽂件。如果 Microsoft Excel 不在运⾏,则这个第⼆次的调⽤将启动该程序,并返回⼀个指定⽂件 (mytest.xls) 所
对应的⼯作表的引⽤。该⽂件必须位于指定的位置;否则将产⽣ Visual Basic 错误及⾃动化错误。随后的⽰例代码将 Microsoft Excel 及包含指定⼯作表的窗⼝设为可见。最后,如果在此前没有 Microsoft Excel 的副本在运⾏,代码就使⽤ Application 对象的 Quit ⽅法来关闭 Microsoft Excel。如果该应⽤程序原来就在运⾏,则不要试图关闭它。引⽤本⾝在设为 Nothing 后被释放。
'声明必要的 API 例程:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName as String, _
ByVal lpWindowName As Long) As Long
Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long _
ByVal wParam as Long, _
ByVal lParam As Long) As Long
Sub GetExcel()
Dim MyXL As Object '⽤于存放Microsoft Excel 引⽤的变量。
Dim ExcelWasNotRunning As Boolean '⽤于最后释放的标记。
'测试 Microsoft Excel 的副本是否在运⾏。
On Error Resume Next '延迟错误捕获。
'不带第⼀个参数调⽤ Getobject 函数将返回对该应⽤程序的实例的引⽤。如果该应⽤程序不在运⾏,则会产⽣错误。
Set MyXL = Getobject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear '如果发⽣错误则要清除 Err 对象。
DetectExcel '检测 Microsoft Excel。如果 Microsoft Excel 在运⾏,则将其加⼊运⾏对象表。
Set MyXL = Getobject("c:\vb4\MYTEST.XLS") '将对象变量设为对要看的⽂件的引⽤。
'设置其 Application 属性,显⽰ Microsoft Excel。然后使⽤ MyXL 对象引⽤的 Windows 集合显⽰包含该⽂件的实际窗⼝。
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
'在此处对⽂件进⾏操作。
' ...
'如果在启动时,Microsoft Excel 的这份副本不在运⾏中,则使⽤ Application 属性的 Quit ⽅法来关闭它。
'注意,当试图退出 Microsoft Excel 时,标题栏会闪烁,并显⽰⼀条消息询问是否保存所加载的⽂件。
If ExcelWasNotRunning = True Then
MyXL.Application.Quit
End IF
Set MyXL = Nothing '释放对该应⽤程序
'和电⼦数据表的引⽤。
End Subrows函数的使用方法及实例
Sub DetectExcel() '该过程检测并登记正在运⾏的 Excel。
Const WM_USER = 1024
Dim hWnd As Long
'如果 Excel 在运⾏,则该 API 调⽤将返回其句柄。
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then '0 表⽰没有 Excel 在运⾏。
Exit Sub
Else
SendMessage hWnd, WM_USER + 18, 0, 0 'Excel 在运⾏,因此可以使⽤ SendMessage API 函数将其放⼊运⾏对象表。
End If
End Sub
解决⽤GetObject打开的⼯作表修改后保存,再次打开⼯作表不显⽰
通过getobject打开的Excel⽂件只要被修改(写)并保存后,就只能在VBE中看到,但⽤户界⾯却看不到。就算你重启Excel,再去⼿动打开此⽂件,也是什么都看不到。不保存就没有这个问题!如果要解决这个问题,必须在wb.close 前加⼀句
Application.Windows(wb.name).Visible = True。
Private Sub CommandButton1_Click()
On Error Resume Next
⽂件⽬录 = ThisWorkbook.Path & "\Excel\"
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.GetFolder(⽂件⽬录)
For Each s In fldr.Files
With GetObject(⽂件⽬录 & s.Name)
.Sheets(1).Cells.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceForma .SaveAs ThisWorkbook.Path & "\Excel_修改后\" & s.Name '保存
.Windows(1).Visible = True '⼯作表可见
.Close (True) '保存改动
End With
Next
End Sub
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论