ようこそゲスト さん ユーザー登録 ログイン

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以外のブックにデータが書かれてしまうのでしょうか?これを回避するには何か方法があるのでしょうか? UWSCを使って以下のコードを書きました。 EXCEL = GETACTIVEOLEOBJ("Excel.Application","Microsoft Excel - abc.xls") というコードです。処理内容はA列のデータをB列に1.. を含むブックマークはてなブックマーク - UWSCを使って以下のコードを書きました。 EXCEL = GETACTIVEOLEOBJ("Excel.Application","Microsoft Excel - abc.xls") というコードです。処理内容はA列のデータをB列に1.. - 人力検索はてな

  • akaired あなたも質問に答えられます! ウォッチリストに追加
  • 状態:終了 いるか
  • 回答数:1 / 5件
  • 回答ポイント:60ポイント
  • 登録:2009-10-30 20:35:58
  • 終了:2009-11-06 20:40:02
  • カテゴリー:コンピュータコンピュータ

1 回答者:airplant 2009-10-31 00:39:27 満足! 60ポイント

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のほうが適しているような感じがします。

質問者:akaired 2009-11-02 18:28:47

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

おとなり質問

この質問・回答へのコメント

>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とも動くことを確認してあります。
最終的にうまく動きましたでしょうか?
うまく動きました!ありがとうございます!

この質問・回答へのトラックバックこの質問・回答へのトラックバック