![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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件)
- 最新から表示
- 回答順に表示
No.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 は最初に起動されたインスタンスに接続するようです。
言葉足らずかも知れませんが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
別インスタンスのエクセルを制御したい
Excel(エクセル)
-
EXCEL VBAで2つEXCELを起動したときのブック名取得の方法
その他(Microsoft Office)
-
VBAで別プロセスのExcelのフルパスの取得
Visual Basic(VBA)
-
-
4
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
ExcelVBA:すでに開かれているブックの判定方法
Visual Basic(VBA)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
9
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
10
excelが別プロセスで起動してしまう
その他(Microsoft Office)
-
11
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
12
ExcelVBAでセルを編集状態にする方法
Excel(エクセル)
-
13
エラーになってないのにVBAが中断される
Excel(エクセル)
-
14
どこにもフォーカスを当てたくない
Access(アクセス)
-
15
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
16
VBA 1次元配列を2次元に追加する
Visual Basic(VBA)
-
17
【VBA】ファイルパスに半角スペースが入ると、VBAが動かない
Excel(エクセル)
-
18
他のアプリケーションとの連携
Visual Basic(VBA)
-
19
VBAでこんなことできますか?
PowerPoint(パワーポイント)
-
20
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
javaのクラスの作り方、エラー...
-
private static という変数の修飾
-
生成したインスタンスを削除す...
-
C#において、同じインスタンス...
-
String a = "a"; と String b =...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
C#デストラクタが走る理由がわ...
-
「インスタンス」の意味をわか...
-
クラスのインスタンス名をクラ...
-
クラス内の関数内static変数に...
-
変数の参照でエラーが出てしま...
-
オブジェクト参照がオブジェク...
-
コンストラクタで設定した値が...
-
VB6.0のクラスで、自分自身のイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
SQLを連続発行する時の正しい(?...
-
オブジェクト参照がオブジェク...
-
文字列を日付に変換でParseExce...
-
VB6.0で、DLLを動的に参照したい
-
javaのクラスの作り方、エラー...
-
インスタンスを同じ名前で作成...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
おすすめ情報