|
本帖最后由 yiyiyicz 于 2019-4-25 17:39 编辑
用vb6打开excel文件,然后做读写操作,很好办
但对已经打开的excel操作,我费了好大劲才搞定,原理不明白。和各位坛友分享
Dim Xlapp As Excel.Application
Dim Xlbook As Excel.Workbook
Dim Xlsheet As Excel.Worksheet
On Error Resume Next
Set Xlapp = GetObject(, "excel.application") '打开已有的对象,这里假定只有一个excel文件
If Xlapp Is Nothing Then '如果打开不成功,即excel文件没有打开
Set Xlapp = CreateObject("excel.application") '建立excel对象
Set Xlbook = Xlapp.Workbooks.Open(App.Path & "\demo.xlsx") '打开指定的文件,路径,文件名
Xlapp.Visible = True '显示模式,显示
End If
Set Xlsheet = Xlbook.Worksheets("基本数据") '指定具体的sheet
If Val(Xlapp.Application.Version) >= 8 Then '//这段是从网上抄的,什么道理不明白
Set Xlsheet = Xlapp.ActiveSheet '//这段是从网上抄的,什么道理不明白
Else '//这段是从网上抄的,什么道理不明白
Set Xlsheet = Xlapp '//这段是从网上抄的,什么道理不明白
End If '//这段是从网上抄的,什么道理不明白
Debug.Print Xlsheet.Cells(56, 2)
MsgBox Xlsheet.Range("B56").Value
说明:
On Error Resume Next
Set Xlapp = GetObject(, "excel.application")
If Xlapp Is Nothing Then
Set Xlapp = CreateObject("excel.application")
Set Xlbook = Xlapp.Workbooks.Open(App.Path & "\demo.xlsx")
Xlapp.Visible = True
End If
这段作用为:使用一个已经打开的对象,当对象还没有打开,则新打开。曾经看到有人说,只用“GetObject(, "excel.application") ”这一句就能实现前述功能,但我没有试出来。
这是标准操作,比较严谨。很多场合都是用这个套路。
特别要理解 GetObject(, "excel.application") 。注意格式
说明:
If Val(Xlapp.Application.Version) >= 8 Then
Set Xlsheet = Xlapp.ActiveSheet
Else
Set Xlsheet = Xlapp
End If
这段是从网上抄的,什么道理不明白。但确实可以不用再次打开已经打开的excel文件,而能正常操作这个已经打开的excel文件
如果新打开excel文件,这段程序也能正常运行。
if endif结构显得啰嗦,对于版本高的Excel,只需要一句标红的语句
哪位牛人给注释,或者解释其中道理。我的理解是对象设置与激活的问题
【补充】标红的是关键。没有这句,操作已经打开的excel文件,无效,诡异的是没有出错提示。同样的代码,新打开excel文件并操作,成功。
我试过激活工作簿、工作表;试过激活窗体;试过excel最大化最小化都没用。
可再次设置对象变量,程序就走通了。费解
|
|