tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: エクセルのアクティブBOOKの取得
投稿日: 2009/08/04(Tue) 12:47
投稿者魔界の仮面弁士
> VBプログラム上で、既に複数起動している EXCELブックで、アクティブなブック→シート→
> セルへ文字列を出力したいのですが、どのようにして、アクティブセル情報を取得すれば
> よろしいでしょうか?

「x = GetObject( , "Excel.Application")」の構文を使えば、
起動済みの Excel.Application インスタンスを拾う事ができます。
それが出来れば、あとは ActiveWorkbook や ActiveCell のプロパティにて、
「アクティブなブック」も「アクティブなセル」も得る事ができます。


ただし、Excel 本体を複数起動していた場合に、それぞれを識別する事はできません。
http://support.microsoft.com/kb/288902/ja

もしも複数インスタンスをそれぞれ取得する必要がある場合には、少々面倒ですが、
IRunningObjectTable から Excel のオブジェクトを列挙するという手法が使えます。
あるいは、AccessibleObjectFromWindow を使う事もできるでしょう。

ただし、これらの方法で得られるのは Application オブジェクトではなく、
Workbook オブジェクトとなります。もしも Application オブジェクトを
得る必要がある場合には、Workbook オブジェクトの Application プロパティを
辿って見てください。



で。本題とは関係無い部分に、幾つか問題があるようですので、少し指摘させてください。


> Public WithEvents xlApp As Excel.Application 'Excelアプリケーションイベント変数
> Private Sub xlBook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Microsoft.Office.Interop.Excel.Range) Handles  xlBook.SheetSelectionChange
COM オブジェクトの場合、Handles 句(と WithEvents)を使うのは避けて、
AddHandler でイベントを割り当てる事をお奨めします。


>         xlApp = CreateObject("Excel.Application")
参照設定している場合は、
          xlApp = New Excel.ApplicationClass()
にしましょう。

>         xlBook = xlApp.Workbooks.Add
もしこれが VB6 や VBA や VBScript であれば、
「xlApp.Workbooks.Add」という記述でも良いのですが、
VB.NET の場合、そのように記述する事は出来ません。

詳細は、このサイトの解説記事をご覧ください。
http://hanatyan.sakura.ne.jp/dotnet/excelme.htm


> Private Sub Form_QueryUnload(ByVal Cancel As Integer, ByVal UnloadMode As Integer)
これは、VB6 の イベントですよね。VB.NET には存在しません。
この部分が実行されているかどうか、再度検証しておいてください。

> 'インスタンスの解放
> xlApp = Nothing     'CreateObject("Excel.Application")
> xlBook = Nothing    'xlApp.Workbooks.Add
Nothing の代入は、Excel オブジェクトのインスタンス解放を意味しません。
詳細は、先の URL の記事を参照してください。

> End
End ステートメントは強制終了であり、使用していたオブジェクトの後始末が
行われない可能性があります。
VB6 であれ VB.NET であれ、End ステートメントの使用は避けるようにしてください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。