0

这是我的代码。我认为这应该可行;我正在保存 wb 并尝试使用 wb.Application 获取 Excel 应用程序对象。它确实有效,但 XLApp.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 应用程序并仍然使用相交方法?

我还尝试将 XLapp 保存到全局变量并重新使用它,但这也不起作用;同样的错误。

我试图避免使用 Excel 互操作引用来保持与旧版本 Excel 的向后兼容性。

MSDN 库_Application.Intersect 方法

我注意到我的应用程序对象的类型是:Microsoft.Office.Interop.Excel.ApplicationClass

4

2 回答 2

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(...

从 .NET 开发人员的角度理解 Excel 对象模型

于 2013-08-28T23:44:53.590 回答
0

在我的情况下,使用 c#,我需要设置行和列来获取交集。

在此处输入图像描述

我正在使用这两个范围:

using Excel = Microsoft.Office.Interop.Excel;

//open excel
object _misValue = Missing.Value;
Excel.Application myExcelApp = new Excel.Application();
Excel.Workbook myWorkbook = myExcelApp.Workbooks.Open("path/my-fileName.xlsx");

//get current sheet by position the first one
myWorksheet = myExcelApp.ActiveWorkbook.Worksheets.get_Item(1);

//First range : 5:5 the entire row
Excel.Range rangeRow;
rangeRow = myWorksheet.Range["5:5"]; 

//Second range: C:C the entire column
Excel.Range rangeColumn;
rangeColumn = myWorksheet.Range["C:C"];

//do the intersection
var result = myExcelApp.Intersect(rangeRow, rangeColumn
    , _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue
    , _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue
    , _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue, _misValue).Value;

Console.WriteLine(result);

范围工作没有问题。

于 2021-09-16T20:28:06.373 回答