选项严格时获取Excel对象

时间:2017-03-18 19:39:04

标签: vb.net excel-interop

我从这个微软页面获得了以下代码。

https://msdn.microsoft.com/en-us/library/e9waz863(v=vs.90).aspx

' Add Option Strict Off to the top of your program. 
Option Strict Off

Private Sub getExcel()
Dim fileName As String = "c:\vb\test.xls" 

If Not My.Computer.FileSystem.FileExists(fileName) Then
    MsgBox(fileName & " does not exist")
    Exit Sub 
End If 

' Set the object variable to refer to the file you want to use. 
Dim excelObj As Object = GetObject(fileName)
' Show Excel through its Application property. 
excelObj.Application.Visible = True 
' Show the window containing the file. 
Dim winCount As Integer = excelObj.Parent.Windows.Count()
excelObj.Parent.Windows(winCount).Visible = True 

' Insert additional code to manipulate the test.xls file here. 
' ...

excelObj = Nothing 
End Sub

Option Strict Off

时,一切都很好

enter image description here

Option Strict On

时,一切都不好

enter image description here

那么,当Option Strict On?

时如何解决这些错误

小心!我想从同一个excel实例中获取特定的excel文件。

2 个答案:

答案 0 :(得分:1)

+1,争取使用Option Strict On。 :)

但是,代码使用的是所谓的Late Binding,并且要求您使用Option Strict Off。但是,您可以通过创建新的代码文件并使用Partial Class定义来包含需要延迟绑定的代码来最小化Option Strict Off的范围。

你可以通过使用带有Option Strict On的VB CallByName function来获得,但这会很快变得非常丑陋并且可能非常慢。

还有一种使用原生API的高级技术,称为COM反射,可以与Option Strict On配合使用。文章中描述了这种技术:[基本本能 - 用反射检查COM对象]。(https://msdn.microsoft.com/en-us/magazine/dd347981.aspx)。

早期绑定的典型方法(Option Strict On)是添加对Excel主互操作程序集的引用。这种技术也有一些批评者,但是迄今为止最简单的方法。

编辑:以下演示了如何使用Excel PIA和早期绑定直接打开与OP原始代码类似的工作簿。

Dim wbPath As String = "*** replace with path to your workbook ***"
Dim wb As Excel.Workbook = CType(GetObject(wbPath), Excel.Workbook)
'or 
'Dim wb As Excel.Workbook =  CType(Marshal.BindToMoniker(wbPath), Excel.Workbook)

Dim app As Excel.Application = wb.Application
app.Visible = True
wb.Windows(1).Visible = True

答案 1 :(得分:0)

作为旁注,如果您知道它有效,则无需依赖Interop.Excel早期绑定。您可以将错误通知更改为警告,仍然可以编译并运行。

' Imports Microsoft.Office.Interop.Excel

Dim fileName = "c:\vb\test.xls"   
If Not IO.File.Exists(fileName) Then MsgBox(fileName & " does not exist") : Exit Sub 

Dim obj = GetObject(fileName, "Excel.Application")
Dim wb = TryCast(obj, Workbook)

wb.Application.Visible = True 
wb.Windows(1).Visible = True