2013-08-28 60 views
0

这是我的代码。我认为这应该工作;我保存了wb并尝试使用wb.Application获取Excel应用程序对象。它实际上工作,但XLApp.Intersect失败,出现“类型不匹配”错误。使用Application.Intersect为什么我会得到类型不匹配

Dim wb As Object 

Sub First() 
    Dim XLApp As Object 
    XLApp = CreateObject("Excel.Application") 
    wb = myXL.XLApp.Workbooks.Add() 
End Sub 

Sub Second() 
    Dim XLApp as object = wb.Application 
    Dim rg as object = XLApp.Intersect(ws.UsedRange, ws.Columns("B")) 
End Sub 

是否可以从工作簿中获取Excel应用程序并仍然使用Intersect方法?

我也尝试将XLapp保存到一个全局变量并重新使用它,但那也没有奏效;同样的错误。

我试图避免使用Excel Interop参考来维护与旧版本的Excel的向后兼容性。

MSDN Library _Application.Intersect Method

我发现我的应用对象的类型为:Microsoft.Office.Interop.Excel.ApplicationClass

+0

做问题1:“为什么我会得到类型不匹配?(问题的标题和原始版本;我已经回答了什么)”。问题2:“是否可以从工作簿获取Excel应用程序并仍然使用Intersect方法?”问题3(需要一些帮助来清除你的想法):“我试图避免使用Excel Interop参考来保持与旧版Excel的向后兼容性。”问题4:“下划线的意义是什么?”问题5:“Excel.Application和Excel.ApplicationClass之间的区别” – varocarbas

+1

您可以每次只提问一个问题。请回答这个问题的原始版本(为什么我得到这个错误?)。否则,我会删除我的答案,因为它仅回答了您的一组问题。 – varocarbas

+0

@varocarbas我编辑我的问题,删除其他问题。 –

回答

0

的varocarbas的回答让我开始思考我用的是不同类型的。所以,我尝试了对象Dim ObjRange1 As Object的各种组合,并宣布类型Dim rg1 As Excel.Range

这里是我测试的代码,它工作正常,除了一个是在结束这给了我“类型不匹配”的错误。

Sub testXL1() 

    Dim XLApp As Object 
    Dim wb As Object 
    Dim ws As Object 

    XLApp = CreateObject("Excel.Application") 
    XLApp.visible = True 
    wb = XLApp.Workbooks.Add() 
    XLApp = wb.application 
    ws = wb.worksheets(1) 
    ws.cells(1, 1) = "First" 
    ws.cells(2, 2) = "hello" 

    'this works fine 
    Dim rg1 As Microsoft.Office.Interop.Excel.Range 
    Dim rg2 As Microsoft.Office.Interop.Excel.Range 
    Dim rg3 As Microsoft.Office.Interop.Excel.Range 
    rg1 = ws.usedRange 
    rg2 = ws.columns("B") 
    rg3 = XLApp.Intersect(rg1, rg2) 
    rg3.Select() 

    'this works fine 
    Dim rg4 As Object 
    rg4 = XLApp.Intersect(rg1, rg2) 'Public member 'Intersect' on type 'Object()' not found. 
    rg4.Select() 

    'this works fine 
    Dim ObjRange1 As Object = ws.usedRange 
    Dim ObjRange2 As Object = ws.columns("B") 
    Dim rg5 As Microsoft.Office.Interop.Excel.Range 
    rg5 = XLApp.Intersect(ObjRange1, ObjRange2) 
    rg5.Select() 

    'this works fine 
    Dim ObjRange3 As Object 
    ObjRange3 = XLApp.Intersect(ObjRange1, ObjRange2) 
    ObjRange3.Select() 

    'this give a Type Mismatch error 
    ObjRange3 = XLApp.Intersect(ws.usedRange, ws.columns("B")) 
    ObjRange3.Select() 


End Sub 

所以我想答案是ObjRange3 = XLApp.Intersect(ObjRange1, ObjRange2)

varocarbas答案使用它们作为参数之前设置为对象变量的范围必须使用DirectCast

rg = DirectCast(XLApp, Microsoft.Office.Interop.Excel.Application).Intersect(... 

Understanding the Excel Object Model from a .NET Developer's Perspective

相关问题