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

Visual Basicからエクセルの操作

投稿者投稿内容
FD
会議室デビュー日: 2006/05/17
投稿数: 5
投稿日時: 2006-05-17 14:26
環境は Win2000
VS.NET 2003
Office 2000
です。

私は今、エクセルでVBAを使った処理をVBからの操作におきかえる作業をしています。

xlRange("A1:N2").Select()
With xlApp.Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 1
End With

このような処理が元のソースに多々でてくるのですが
    xlEdgeTop
    xlContinuous
    xlThin
がエラーでひっかかってしまいます。

今までの環境では問題なく動いています。
MicroSoft Excel **.* Object Library の参照はしてあります。

問題にお気づきの方、もしくは詳しい解説サイトをご存知の方がいらっしゃいましたら
教えていただきたいです。
    よろしくお願いします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-17 14:34
引用:

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

このような処理が元のソースに多々でてくるのですが
    xlEdgeTop
    xlContinuous
    xlThin
がエラーでひっかかってしまいます。


エラー(例外?)の内容を詳しく教えてください
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 14:35
引用:

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

このような処理が元のソースに多々でてくるのですが
    xlEdgeTop
    xlContinuous
    xlThin
がエラーでひっかかってしまいます。


コンパイル エラーですよね。
エラーの内容を書かれていないので推測になりますが、そのメンバまでのパスがないからでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 14:45
引用:

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

環境は Win2000 VS.NET 2003 Office 2000 です。

xlRange("A1:N2").Select()
With xlApp.Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 1
End With


そもそも、このコードには COM オブジェクトへの暗黙の参照がありますね。
参照カウントをデクリメントするタイミングを逃していることになります。
必ず変数へ参照を取り、解放を行うようにしてください。参考になれば幸いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
FD
会議室デビュー日: 2006/05/17
投稿数: 5
投稿日時: 2006-05-17 15:11
お返事ありがとうございます。

エラーの内容ですが、
  VisualStudioでの編集時に波線がひかれます。
  ビルドすると宣言されていません。
となります。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 15:13
引用:

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

エラーの内容ですが、
  VisualStudioでの編集時に波線がひかれます。
  ビルドすると宣言されていません。
となります。


であれば、答えはもう出ていますのでご確認ください。

# それよりも、COM 参照の解放の方が心配ではありますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
FD
会議室デビュー日: 2006/05/17
投稿数: 5
投稿日時: 2006-05-17 15:31
参考にしているサイトから得た情報で

Public Sub MRComObject(ByRef objCom As Object)
Try
If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(objCom) Then
Dim I As Integer
Do
I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
Loop Until I <= 0
End If
Catch
Finally
objCom = Nothing
End Try
End Sub

最後に

MRComObject(xlSheet) 'xlSheet の解放
MRComObject(xlSheets) 'xlSheets の解放
xlBook.Close(False) 'xlBook を閉じる
MRComObject(xlBook) 'xlBook の解放
MRComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
MRComObject(xlApp) 'xlApp を解放

の記述はしています。


>>であれば、答えはもう出ていますのでご確認ください。

って事はVBAでは宣言がいらなくてもVBでは宣言する必要があるのでしょうか?
もしそうなら何型で宣言すればいいのかご存知でしたら教えていただけますか?

たびたび、申し訳ありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-17 15:45
引用:

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

参考にしているサイトから得た情報で

Public Sub MRComObject(ByRef objCom As Object)
  :
End Sub

最後に
 :
の記述はしています。


はい、もちろんこの固まりは、Finally 句で書かれていますよね。
であるならば、これについては問題ないと思います。

ただ、私は「暗黙の参照」と言っています。(すみません、わかりにくかったですね)
これについての問題は解決できていないんですよ。

FD さんのソースですと、xlSheet, xlBook などは変数に 参照を残しているから
COM オブジェクトの参照を解放する記述ができるんですよね。
逆に、暗黙的に参照されたオブジェクトは、変数に参照を残していないので解放の記述ができないということです。

引用:

って事はVBAでは宣言がいらなくてもVBでは宣言する必要があるのでしょうか?


メンバを限定するまでのパスがインポートされているという考え方が正しいと思います。
VB.NET でも Imports ステートメントでインポートすることで同様のことが可能です。

引用:

もしそうなら何型で宣言すればいいのかご存知でしたら教えていただけますか?


これは、ご自分で調べられる範囲だと思います。
たとえば、xlEdgeTop は Excel.XlBordersIndex.xlEdgeTop ですね。

残りは、オブジェクト ブラウザで検索してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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