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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
別インスタンスのエクセルを制御したい
Excel(エクセル)
-
EXCEL VBAで2つEXCELを起動したときのブック名取得の方法
その他(Microsoft Office)
-
VBAで別プロセスのExcelのフルパスの取得
Visual Basic(VBA)
-
-
4
ExcelVBA:すでに開かれているブックの判定方法
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
9
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
10
excelが別プロセスで起動してしまう
その他(Microsoft Office)
-
11
CreateObjectとGetObjectの違い
Excel(エクセル)
-
12
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
13
Application.Runエラー(1004)
Excel(エクセル)
-
14
プロセスIDの取得方法について
Visual Basic(VBA)
-
15
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
16
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
17
ExcelVBAでセルを編集状態にする方法
Excel(エクセル)
-
18
アウトルックが起動しているかどうかを取得するには?
Visual Basic(VBA)
-
19
VBScriptによるExecuteExcel4Macroの使い方について
Visual Basic(VBA)
-
20
【VBA】ファイルパスに半角スペースが入ると、VBAが動かない
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
フォームのCheck boxとOLEObjec...
-
String a = "a"; と String b =...
-
「インスタンス」の意味をわか...
-
SQLを連続発行する時の正しい(?...
-
カンマ区切りの数値文字列を数...
-
スレッドセーフについて
-
C#のメモリ解放についてご教授...
-
外部ライブラリの動的参照によ...
-
複数の変数を宣言する時、同時...
-
生成したインスタンスを削除す...
-
文字列を日付に変換でParseExce...
-
private static という変数の修飾
-
C# のインスタンスの破棄
-
C# インスタンスの破棄
-
エクセルVBAで、条件に一致する...
-
「エンクロージング型」と「外...
-
EXCEL VBAにて動的にCheckBOXを...
-
同じクラスにならない確率を教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報