プロが教える店舗&オフィスのセキュリティ対策術

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

以上、宜しく御願いいたします。

A 回答 (1件)

こんにちは。

こんなややこしいやり方でないといけないんですか?
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 は最初に起動されたインスタンスに接続するようです。

言葉足らずかも知れませんが、よろしくお願いいたします。

補足日時:2007/05/14 12:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A