- 締切済み
エクセル(複数インスタンス)より任意のWorkBookを取得したい
VB初心者です。非常に困っていますのでどうぞ宜しく御願いいたします。 起動中のエクセルをVB6.0からコントロールしたいと思い、以下のコードを書いたのですが、エクセルが複数インスタンスで起動している場合、意図するワークブックが取得できないことに気が付きました。(一番初めに起動したインスタンスのエクセルしか取得できませんでした) ■失敗■ Private Sub Command1_Click() Set xlApp = GetObject(, "Excel.Application") xlApp.ActiveWorkbook.Sheets("シート名").Select 'アクティブなWorkBookを取得 Err.Clear On error resume next If Err.Number <> 0 Then MsgBox"エラー" Else msgBox"取得成功" End If Err.Clear On error goto 0 End Sub そこで、全てのエクセルのウィンドーテキストを取得し、そこから意図するエクセルオブジェクトを取得しようと、ネットで調べながら以下のプログラムを試してみました。結果、List1に全てのインスタンスのワークブック名を取得することはできましたが、肝心のGetObjectで「オートメンーションの操作中にファイル名またはクラス名を見つけられませんでした。」というエラーが発生し失敗してしまいました。 ■失敗■ 'Windowの生成API Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Sub Command1_Click() 'コントロールするエクセルの列挙 Dim lBookNameLenghth As Long Dim strBuffer As String Dim lChild As Long Const lBufferSize As Byte = 255 strBuffer = String(lBufferSize, Chr(0)) List1.Clear Do Counter = Counter + 1 lChild = FindWindowEx(0, lChild, "MS-SDIa", vbNullString) If lChild = False Then Exit Do lBookNameLenghth = GetWindowText(lChild, strBuffer, lBufferSize) List1.AddItem Left(strBuffer, lBookNameLenghth) Loop While lChild End Sub Private Sub List1_Click() If List1.Text <> "" Then Set xlApp = GetObject(List1.Text, "Excel.Application") '←ここでエラー発生 End If End Sub どんな方法でも構いませんので、全てのインスタンスのエクセルを対象としたエクセルオブジェクト取得方法を教えてください。 環境:Windows2000 Professional+VB6.0+Office2000 以上、宜しく御願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- fly_moon
- ベストアンサー率20% (213/1046)
こんにちは。こんなややこしいやり方でないといけないんですか? WindowsAPIなんて使わなくても、Excelのを使えば良いんじゃないんですか? Private Sub Command1_Click() 'コントロールするエクセルの列挙 Dim xlApp As Object Dim xlBook As Object Set xlApp = GetObject(, "Excel.Application") For Each xlBook In xlApp.Workbooks List1.AddItem xlBook.Name Next End Sub Private Sub List1_Click() Dim xlApp As Object 'Excel.Application Dim xlBook As Object 'Excel.Workbook If List1.Text <> "" Then Set xlApp = GetObject(, "Excel.Application") Set xlBook = xlApp.Workbooks.Item(List1.Text) End If xlBook.Sheets("Sheet1").Cells(10, 1) = "test" End Sub こんだけの単純なもんではダメなんですか?
補足
ご回答ありがとうございます。 お知らせいただいたソースでテストしてみたのですが駄目でした。 テスト方法は、エクセルアプリケーションを2つ起動し(エクセルのアプリケーションウィンドゥが2つある状態。説明し辛いです・・・)、両方のワークブックが取得できるかを検証したのですが、片方のワークブックしか取得できませんでした。 Microsoft Excel の複数のインスタンスが実行されている場合、GetObject は最初に起動されたインスタンスに接続するようです。 言葉足らずかも知れませんが、よろしくお願いいたします。