« フォクすけテーマFirefox 3 対応 | トップページ | ウィルスバスター2009を入れてみた »

2008/09/03

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パッケージは日本語も問題無く使えるようです。

|

« フォクすけテーマFirefox 3 対応 | トップページ | ウィルスバスター2009を入れてみた »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Tcl/Tk 覚え書き: COMでExcelと連携:

« フォクすけテーマFirefox 3 対応 | トップページ | ウィルスバスター2009を入れてみた »