tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルエクセルのアクティブBOOKの取得
記事No9246
投稿日: 2009/08/04(Tue) 11:32
投稿者GEN
以下質問があります、ご存知の方 ご教授お願いいたします。

VB歴:VB6(6年),VB2008(半年),VBA(2年ぐらい)
使用環境:VB2008(Express版)+ Excel2007

VBプログラム上で、既に複数起動している EXCELブックで、アクティブなブック→シート→
セルへ文字列を出力したいのですが、どのようにして、アクティブセル情報を取得すれば
よろしいでしょうか?

VB上でインスタンスを作成して起動したExcelブックのアクティブシート・セルの情報は
下記コードで取得可能なのですが、そのつど、VB上から起動したブックでないと、
取得は出来ないのでしょうか?

【やりたいこと】
・既に起動している、複数のBOOKがあって、後から立ち上げたVBブログラムで参照したい。
・VBプログラムが立ち上がっていて、後で作済みのエクセルブックを複数上げて
アクティブブックを参照したい。(エクセルVBAでアクティブなブック→シート→セル の参照方法でも参考になりますので、アドバイスお願いいたします。)


Imports Microsoft.Office.Interop
Public Class Form1
    'ExcelイベントをVBで制御・監視するための定義(VBイベントとして組み込む)
    Public WithEvents xlApp As Excel.Application 'Excelアプリケーションイベント変数
    Public WithEvents xlBook As Excel.Workbook 'Excelワークブックイベント変数
    Public WithEvents xlSheet As Excel.Worksheet 'Excelワークシートイベント変数
    Public WithEvents xlChart As Excel.Chart 'Excelチャートイベント変数

    Public X As Integer
    Public Y As Integer
    Public Z As String
    Public S As String

    Public ActAdress As String

    '新規Excelファイルを作成する
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Excelインスタンスの生成
        xlApp = CreateObject("Excel.Application")
        xlBook = xlApp.Workbooks.Add
        'xlSheet = xlBook.Worksheets(1)
        xlSheet = xlBook.ActiveSheet

        xlApp.Visible = True  'Excelアプリケーションを表示させる。FALSEだと非表示です。

        xlBook.Activate()

        X = xlApp.ActiveCell.Row
        Y = xlApp.ActiveCell.Column
        Z = xlApp.ActiveCell.Address

    End Sub

    Private Sub Form_QueryUnload(ByVal Cancel As Integer, ByVal UnloadMode As Integer)
        'インスタンスの解放
        xlApp = Nothing     'CreateObject("Excel.Application")
        xlBook = Nothing    'xlApp.Workbooks.Add
        xlSheet = Nothing   'xlBook.Worksheets(1)
        xlChart = Nothing   'xlChart
        End
    End Sub
  
  'WorkBookのイベントに記述することでシート間の参照も可能。
    Private Sub xlBook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Microsoft.Office.Interop.Excel.Range) Handles

xlBook.SheetSelectionChange
        X = xlApp.ActiveCell.Row
        Y = xlApp.ActiveCell.Column
        S = xlApp.ActiveSheet.name
        Z = xlApp.ActiveCell.Address
    
    'アクティブセルへ情報書き込み
        xlApp.ActiveSheet.Cells(X, Y).value = S & "&" & Z

    End Sub
End Class

[ツリー表示へ]
タイトルRe: エクセルのアクティブBOOKの取得
記事No9247
投稿日: 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 ステートメントの使用は避けるようにしてください。

[ツリー表示へ]