タイトル : 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 ステートメントの使用は避けるようにしてください。 |