@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Visual Basicからエクセルの操作

投稿者投稿内容
FD
会議室デビュー日: 2006/05/17
投稿数: 5
投稿日時: 2006-05-17 16:05
そういう検索方法があることを知りませんでした。
大変、参考になりました。
おかげさまで助かりました。

今から自分でできる範囲でやってみようと思うので
また問題が出てきたときはよろしくお願いします。

ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 16:30
引用:

FDさんの書き込み (2006-05-17 16:05) より:

そういう検索方法があることを知りませんでした。
大変、参考になりました。
おかげさまで助かりました。

今から自分でできる範囲でやってみようと思うので
また問題が出てきたときはよろしくお願いします。

ありがとうございました。


もっと重要な「暗黙の参照」が解決できていません。
こちらの方は、メモリリークを起こしかねないので心配です。
(Excel が正しく終了しないでプロセスに居残ります)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
FD
会議室デビュー日: 2006/05/17
投稿数: 5
投稿日時: 2006-05-17 17:07
お手数ですがそちらのことも教えていただいてもよろしいですか?
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2006-05-17 17:24
こんにちは、まゆりんです。

引用:

FDさんの書き込み (2006-05-17 17:07) より:
お手数ですがそちらのことも教えていただいてもよろしいですか?


まずは「暗黙の参照」とは何かを検索するなりして調べてみてください。
また、じゃんぬねっとさんが参考となるページへのリンクを貼って下さっているのですから、
そちらもちゃんと見てくださいね。

_________________
まゆりん @ わんくま同盟
Blog る。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 17:34
引用:

FDさんの書き込み (2006-05-17 17:07) より:

お手数ですがそちらのことも教えていただいてもよろしいですか?


はい。
先ほどの書き込みから引用しますと、

引用:

xlRange("A1:N2").Select()
With xlApp.Selection.Borders(xlEdgeTop)


ここで途中に、COM オブジェクトが暗黙的に参照されています。

xlApp.Selection.Borders は、Selection の時点で 1 つ参照があります。
xlRange("A1:N2") は、xlRange.Range("A1:N2") に展開すると考えると、
ここにも、Range プロパティで返される Range オブジェクトの参照があります。

これは、以下のように参照を取る必要があります。
(xlRange は、xlSheet.Cells から取得していると仮定しています)
そして、ReleaseComObject メソッドで参照カウントをデクリメントする必要があるのです。

コード:

    '//Dim xlRange As Excel.Range = xlSheet.Cells と仮定

    Dim xlRange2 As Excel.Range
    Try
        xlRange2 = DirectCast(xlRange.Range("A1:N2"), Excel.Range)
        xlRange2.Select()
        '//
        '// xlRange2 を使った処理
        '//
    Finally
        If Not xlRange2 Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange2)
        End If
    End Try

    Dim xlSelection As Excel.Range
    Try
        xlSelection = DirectCast(xlApp.Selection, Excel.Range)
        '//
        '// xlSelection を使った処理
        '//
    Finally
        If Not xlSelection Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSelection)
        End If
    End Try


どうでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-05-18 01:38
引用:

じゃんぬねっとさんの書き込み (2006-05-17 17:34) より:

xlRange("A1:N2") は、xlRange.Range("A1:N2") に展開すると考えると、



え、そんな展開されないと思いますが・・・
そもそもこれ、VBA にしたって error じゃないの?

xlRange(1,1) とか xlRange._Default(1) とかなら、_Default property の省略でという話ならわかります。

xlRange(1,1) → xlRange._Default(1,1) つまり xlRange.Item(1,1)

本題と違うようなのでこれにて
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-18 06:01
引用:

ちゃっぴさんの書き込み (2006-05-18 01:38) より:

え、そんな展開されないと思いますが・・・
そもそもこれ、VBA にしたって error じゃないの?


あれ? VBA ではなかった記憶がありますが、
VB.NET 側からは、こうするのが正しかったような... (;^-^)

間違っていましたら、すみません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-05-19 02:34
引用:

じゃんぬねっとさんの書き込み (2006-05-18 06:01) より:
引用:

ちゃっぴさんの書き込み (2006-05-18 01:38) より:

え、そんな展開されないと思いますが・・・
そもそもこれ、VBA にしたって error じゃないの?


あれ? VBA ではなかった記憶がありますが、
VB.NET 側からは、こうするのが正しかったような... (;^-^)



とりあえず、適当にやってみました。
# 面倒なんで例外処理は省いてます。

コード:
Dim xlApplication As Excel.Application = New Excel.Application
xlApplication.Visible = True
Dim xlWorkbooks As Excel.Workbooks = xlApplication.Workbooks
Dim xlWorkbook As Excel.Workbook = xlWorkbooks.Add
Dim xlSheet As Excel.Worksheet = xlWorkbook.ActiveSheet
Dim xlRange As Excel.Range = xlSheet.Cells
xlRange("A1:N2").Select()



<結果>
'System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 種類が一致しません。

環境 VB.NET 2003, Excel 2003

なお、
コード:
xlRange("A1:N2").Select()



コード:
xlRange.Range("A1:N2").Select()


とか
コード:
xlRange(2,2).Select()


とした場合には例外が発生しません。

なんか方法あるんですか?
# .NET で Excel 扱う気がしないので、ろくに検証もせず、あまり自信が無いんですが・・・
# といっても、もしできたとしてもこんな使い方使う気がしないですけど・・・

ちなみに関係ないかも知れないですけど、VBA で
コード:
Range("A1:N2").Select


なんてのができるのは、この頭の Range property が Global class の property だからですね。
# この場合、省略されているのは property ではなく、object。
# う〜む。素晴らしすぎる(笑)

スキルアップ/キャリアアップ(JOB@IT)