UWSCを使って以下のコードを書きました。


EXCEL = GETACTIVEOLEOBJ("Excel.Application","Microsoft Excel - abc.xls")

というコードです。処理内容はA列のデータをB列に1行ずつコピーしていくという処理です。

1.abc.xlsを起動。
2.A列にデータを記入。
3.UWSC実行。
4.B列にデータをコピー
この処理は問題なく行うことができます。

ただ、複数のExcelを起動している場合。例えばxyz.xls、Book1.xlsなどのExcelが起動していたら、Book1.xlsを選択した時、Book1.xlsにA列の値がB列にコピーされてしまうという現象がおこってしまいます。

ヘルプを見ると、
戻値 = GETACTIVEOLEOBJ( COMオブジェクト名, [タイトル, 順番] )
引数
  COMオブジェクト名: COMオブジェクト名
  タイトル: 複数時にタイトルで区別(一部でOK)
  順番: IEにてタイトルが同じ時に区別  ※IEのみ有効
戻値
  COMオブジェクト

という内容が書かれています。GETACTIVEOLEOBJにタイトルとして、abc.xlsを指定しているのに、なぜ複数のexcelを起動している時に、abc.xls以外のブックにデータが書かれてしまうのでしょうか?これを回避するには何か方法があるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/10/30 20:35:58
  • 終了:2009/11/06 20:40:02

ベストアンサー

id:airplant No.1

airplant回答回数220ベストアンサー獲得回数492009/10/31 00:39:27

ポイント60pt

GETACTIVEOLEOBJでは、Excelファイル名に関係なく、Excelオブジェクトが取り出されているようです。

特定のExcelに対して操作するには、Excel内で指定してあげる必要があります。


UWSCのサンプルからコーディングされていると思いますので、今は多分下記のようなプログラムになっていると思います。

EXCEL = GETACTIVEOLEOBJ("Excel.Application","Microsoft Excel - abc.xls")

With EXCEL.ActiveSheet
	for y = 1 to 5		// A列をB列へコピーのサンプル
		.Cells[y,2].Value = .Cells[y,1].Value
	next
EndWith

このプログラムだと、現在のアクティブなExcelに対して操作することになるので、指摘のようにBook1.xlsやxyz.xlsでも動いてしまいます。


対処方法として、3つあると思います。

案1.裏にあるExcelに対してそのまま操作する方法

案2.裏にいたなら、無理に表にしてしまう方法

案3.動かさずにエラーにしてしまう方法

どれを行いたいのか分からなかったので、3つ載せておきました。

//案1.裏にあるExcelに対してそのまま操作
EXCEL = GETACTIVEOLEOBJ("Excel.Application")

Workbook = EXCEL.WorkBooks("abc.xls")

With WorkBook.WorkSheets[1]
	for y = 1 to 5		// A列をB列へコピーのサンプル
		.Cells[y,2].Value = .Cells[y,1].Value
	next
	// .Range["B:B"].Value = .Range["A:A"].Value //全行ならこれでもOK
EndWith
//案2.裏にいたなら、無理に表にしてしまって処理
EXCEL = GETACTIVEOLEOBJ("Excel.Application")

EXCEL.WorkBooks("abc.xls").Activate
With EXCEL.ActiveSheet
	for y = 1 to 5		// A列をB列へコピーのサンプル
		.Cells[y,2].Value = .Cells[y,1].Value
	next
EndWith
//案3.動かさずにエラーにしてしまう
CONST FileName = "abc.xls"
EXCEL = GETACTIVEOLEOBJ("Excel.Application")

IFB EXCEL.ActiveWorkbook.Name <> FileName Then 
	MsgBox(FileName + "ではありません")
	EXIT
EndIF

With EXCEL.ActiveSheet
	for y = 1 to 5		// A列をB列へコピーのサンプル
		.Cells[y,2].Value = .Cells[y,1].Value
	next
EndWith

私もたまにUWSCを使います。

でも、今回の例のようにExcel主体であれば、UWSCよりWSHのほうが適しているような感じがします。

id:akaired

Uスクリプト:COM_Error:例外が発生しました。X行目:Workbook = EXCEL.WorkBooks("abc.xls")というメッセージが表示されて途中で止まってしまいます。変数を変えたりしましたが、これより先にすすめません。どうしたらよいでしょうか?EXCEL.WorkBooks.Open("abc.xls")でも同じメッセージが表示されました。

2009/11/02 18:28:47
  • id:airplant
    >Uスクリプト:COM_Error:例外が発生しました。X行目:Workbook = EXCEL.WorkBooks("abc.xls")というメッセージが表示されて途中で止まってしまいます

    Excelを起動するところまでは、回答には記載しませんでしたので、Excel起動もUWSCで行っているなら、起動のところまではご自分で作成されたスクリプトで行ってみてください。

    上記のCOM_Errorは、abc.xlsが開かれていないときに出ます。

    1.abc.xlsを起動。
    2.A列にデータを記入。
    3.UWSC実行。
    4.B列にデータをコピー
    とあったので、1と2は手動で行うものと思っていました。
    abc.xlsが起動されていれば、UWSCで案1,2,3とも動くことを確認してあります。
  • id:airplant
    最終的にうまく動きましたでしょうか?
  • id:akaired
    うまく動きました!ありがとうございます!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません