0

これが私のコードです。これはうまくいくはずだと思いました。wb を保存し、wb.Application を使用して Excel Application オブジェクトを取得しようとしています。実際には動作しますが、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 アプリケーションを取得し、引き続き Intersect メソッドを使用することは可能ですか?

また、XLapp をグローバル変数に保存して再利用しようとしましたが、それもうまくいきませんでした。同じエラー。

古いバージョンの Excel との下位互換性を維持するために、Excel 相互運用参照の使用を避けようとしています。

MSDN ライブラリ _Application.Intersect メソッド

アプリケーション オブジェクトのタイプが Microsoft.Office.Interop.Excel.ApplicationClass であることに気付きました。

4

2 に答える 2

0

バロカルバの回答により、使用していたさまざまなタイプについて考えるようになりました。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 に答える