Tcl/Tk 覚え書き: COMでExcelと連携
以前、Tcl/TkからExcelを操作する方法として、ddeパッケージを使う方法を紹介しましたが、別な方法としてtcomパッケージを使う方法があります。
tcomパッケージはTcl/Tk本体に付属するものではありませんが、ActiveTclには収録されてますし、開発元のwebサイトからも入手可能です。
前提条件とか注意事項とか
以下の変数が設定されていることとする。
- filename
- ファイル名
- bookname
- ワークブック名
- sheetname
- ワークシート名
- col, col1, col2
- セルの列番号
- row, row1, row2
- セルの行番号
- data
- セルに読み書きするデータ
手元にExcel2000しかないので、より新しいバージョンでも通用するかは不明。
FirefoxなどのGeckoを使ったブラウザでは、コード例の部分が右端で折り返されずにはみ出してるので注意。(ドラッグしてコピーはできるので、必要ならエディタ等にコピペして見てください)
基本的な書式
- メソッドの実行
- オブジェクト メソッド 引数1 引数2 …
- 名前付き引数を使ったメソッドの実行
- オブジェクト -namedarg メソッド 引数名1 引数1 引数名2 引数2 …
- プロパティの取得
- オブジェクト -get プロパティ名 インデックス1 インデックス2 …
- プロパティの設定
- オブジェクト -set プロパティ名 インデックス1 インデックス2 … 値
Excelを構成する各種オブジェクトを以下の変数に保持することとする。
- application
- ExcelのApplication オブジェクト
- workbooks
- 開いている全ワークブックをまとめたWorkbooksコレクション
- workbook
- 1つのワークブックを表すWorkbookオブジェクト
- worksheets
- 1つのワークブック中の全ワークシートをまとめたWorksheetsコレクション
- worksheet
- 1つのワークシートを表すWorksheetオブジェクト
- cells
- ワークシートのCellsプロパティ
Excelを起動する
set application [::tcom::ref createobject "Excel.Application"]
$application Visible 1
tcomで変数に代入したCOMオブジェクトは、変数がスコープを外れたり、別の値を代入されたりして値を失うと、自動的に破棄される。::tcom::ref createobject の戻り値を代入した変数が失われると、Excelが終了してしまうので注意。
例えば、COMオブジェクトを変数に代入せずに、「[::tcom::ref createobject "Excel.Application"] Visible 1」というように実行すると、オブジェクトの寿命はこの文の実行中だけなので、Excelは起動してすぐに終了する。
すでに起動しているExcelを取得
set application [::tcom::ref getactiveobject "Excel.Application"]
Excelが起動していない時はエラーとなる。
Workbooksコレクションを取得
set workbooks [$application Workbooks]
ファイルからワークブックを開く、ワークブックを新規作成する、などはWorkbooksコレクションに対する操作となる。
ファイルを開く
set workbook [$workbooks Open $filename]
開いているワークブックを取得
set workbook [$workbooks Item $bookname]
ワークブック新規作成
set workbook [$workbooks Add]
Addの後ろに引数を追加してドキュメントの種類を指定可能。1でワークシート1枚、2でグラフシート1枚、3でマクロシート1枚、5でワークシート3枚(通常の新規作成で作成されるもの)、7でダイアログを持ったドキュメントが作成される。
Worksheetsコレクションを取得
set worksheets [$workbook Worksheets]
ワークシートを取得
set worksheet [$worksheets Item $sheetname]
ワークシート追加
カレントワークシートの直前に追加する場合。
set worksheet [$worksheets Add]
こちらはワークブックの新規作成と同じ方法ではシートの種類を指定できないようである。
指定したワークシートの後ろに追加する場合。
set worksheet2 [$worksheets -namedarg Add After $worksheet]
ブックからシート削除
削除確認ダイアログを表示する場合。
$worksheet Delete
削除確認せずに強制的に削除する場合。
$application DisplayAlerts False
$worksheet Delete
$application DisplayAlerts True
現在アクティブなブック名とシート名を得る
set workbook [$application ActiveWorkbook]
set worksheet [$workbook ActiveSheet]
アクティブなシートを切り替える
[[$workbook Worksheets] Item $sheetname] Activate
Cellsコレクションを取得
set cells [$worksheet Cells]
Cellsコレクションを通してセルにアクセスする。
セルにデータを入力する
1つのセルに入力する場合。
$cells Item $row $col $data
row1,col1~row2,col2の矩形領域に入力する場合。
$cells Range [$cells Item $row1 $col1] [$cells Item $row2 $col2] $data
ひとつのデータを与えた場合は領域内が同じデータで埋められる。
一連のデータを領域内に入力する場合は、行のデータのリストの行数分のリスト、の2次元リストとする。ただし、処理の中で、文字列で与えられた{~}表記をリストとして解釈してくれないようなので、与えるデータは{~}で書き下すのでなく、listコマンドなどでリストを構成すること。
データが足りないセルはエラー値 #N/A が入り、領域をはみ出すデータは捨てられる。
セルからデータを取得する
1セルの場合。
set data [[$cells Item $row $col] Value]
矩形領域の場合。
set data [[$cells Range [$cells Item $row1 $col1] [$cells Item $row2 $col2]] Value]
dataに代入される値は、行のデータのリストの行数分のリスト、の2次元リストとなる。ただし、領域内にエラー値が含まれている場合はエラーとなる。
名前を付けてファイルを保存
set xlsfname [file nativename $filename]
$workbook SaveAs $xlsfname
ワークブックを閉じる
対象のワークブックを閉じる。
$workbook Close
全てのワークブックを閉じる。
$workbooks Close
Workbooksコレクションに対してCloseを実行すると、全てのワークブックが閉じられる。
日本語の扱いについて
試してみた限りでは、ddeパッケージと異なり、tcomパッケージは日本語も問題無く使えるようです。
| 固定リンク
この記事へのコメントは終了しました。
コメント