- 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。
# う〜む。素晴らしすぎる(笑)
|