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以外のブックにデータが書かれてしまうのでしょうか?これを回避するには何か方法があるのでしょうか?
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のほうが適しているような感じがします。
Uスクリプト:COM_Error:例外が発生しました。X行目:Workbook = EXCEL.WorkBooks("abc.xls")というメッセージが表示されて途中で止まってしまいます。変数を変えたりしましたが、これより先にすすめません。どうしたらよいでしょうか?EXCEL.WorkBooks.Open("abc.xls")でも同じメッセージが表示されました。