はじめに
今回は、MaxscriptからOLEを使ってExcelにアクセスしようという話です。(Pythonじゃないの?とかいわない)
なぜやることなすこと日本語文献が少ないのか…ニッチすぎるからでしょうか…
というわけで備忘録。
まず、OLEとはなにか
以下参照。
Object Linking and Embedding - Wikipedia
OLEに対応しているアプリケーションならExcelに限らずMaxscriptから叩けるってことです。素敵。
Excelの呼び出しと終了処理
まず、呼び出しと、正常に解放する処理を説明します。
--Excelの呼び出し
x = CreateOLEObject "Excel.Application"
try(
--
--この間にエクセルでなんらかの処理をします。
--
-- 終了処理:OLEオブジェクトの解放
releaseOLEObject x
-- 終了処理:全てのOLEオブジェクトの解放
releaseAllOLEObjects()
)catch(
messageBox ( getCurrentException() )
-- 終了処理:OLEオブジェクトの解放
releaseOLEObject x
-- 終了処理:全てのOLEオブジェクトの解放
releaseAllOLEObjects()
)
これでエクセルが立ち上がり、正常に終了できます。
なお、この例では立ち上がった瞬間閉じているので、立ち上がったことは目視できません。
全ての処理はこの開始処理と終了処理の間に書き込みます。
CreateOLEObject の時点から、xでExcelにアクセスできるようになります。
releaseOLEObjectで、Excelを正常終了して解放します。
try ~ Catchでエラーを検知して、どんなことがあってもきちんと終了させる処理にしています。
Excelへの各種コマンド
コマンドはVBAをベースとしているようなのですが、Maxscript本体と違って、括弧で特定の位置を括らないときちんと動作しない、など全くいうことをきかないことが多々あり、試行錯誤がすごく大変です。
これ専用にコマンド・リファレンスとかないんでしょうか…。誰かご存じでしたら教えてください。
Excel本体のコマンド
Excel本体の非表示
--非表示モード
x.visible = false
新規作成
--ワークブックの新規作成
x.application.Workbooks.Add
名前を付けて保存
上記で非表示モードにしているので、
上書きの警告を非表示にしたうえで強制的に上書き保存します。
--上書きアラート非表示
x.application.DisplayAlerts = false
-- エクセルデータの保存
x.application.ActiveWorkbook.SaveAs(filepath)
ワークブックを閉じる
--アクティブになっているワークブックの終了
x.application.ActiveWorkbook.Close
エクセルの終了
x.quit()
シートのコマンド
新規シートの作成
新しく作成されたシートが自動的にアクティブになります。
--新規シート
(x.application.Worksheets).Add
--アクティブなシート名を変更
x.ActiveSheet.Name = "NewSheet"
既存シートのコピー
新しく作成されたシートが自動的にアクティブになります。
--sheet1をコピー
(x.application.Worksheets("Sheet1")).Copy( (x.application.Worksheets("Sheet1")) )
--コピー後アクティブなシート名を変更
x.ActiveSheet.Name = "NewSheet"
シート名の変更
--現在のアクティブシートを名前変更
x.ActiveSheet.Name = "NewSheet"
--sheet1を直接指定して名前変更
(x.application.Worksheets("Sheet1")).Name = "NewSheet"
シートの選択(アクティブにします)
指定の名前のシートが無い場合はエラーになり処理が止まるので注意してください。。
--NewSheetという名前のシートをアクティブにします
(x.application.Sheets("NewSheet")).Select
シートの削除
指定の名前のシートが無い場合はエラーになり処理が止まるので注意してください。。
--Sheet2を削除します
(x.Sheets("Sheet2")).Delete
シートの保護
--アクティブシートを保護モードにします
(x.ActiveSheet).Protect()
指定のシート名が存在しているか確認
--sheet2があるか確認する処理
for i=1 to (x.application.Worksheets.Count ) do
(
if ((x.Sheets(i)).name) == "Sheet2" then
(
--あるなら、なんらかの処理
)
)
セルを編集するコマンド
特定のセルへ文字列の代入
くせもので、括弧を省くときちんと動作しません。
--A1セルへ文字列代入
(x.application.Range( "A1")).value = "あいうえお"
--B1~B5セルへ文字列代入
(x.application.Range( "B1:B5")).value = "あいうえお"
特定のセルから文字列の取得
--A1セルの文字列をvalueへ取得
value = (x.application.Range( "A1")).value
特定のセルの揃え
--A1は右揃え
(x.application.Range( "A1")).HorizontalAlignment = 4
--B1~B5セルは中央揃え
(x.application.Range( "B1:B5")).HorizontalAlignment = 3
セルのカラーの変更
--セルのカラーインデックスを45番に
(x.application.Range("A1")).Interior.ColorIndex = 45
列の幅を自動調整
--AB列の幅自動調整
(x.application.Columns("A:B")).EntireColumn.AutoFit
エクセルに書き込まれているデータの最大行数を取得する
--最大行数を取得
Max = (((x.application.ActiveSheet).UsedRange).Rows).Count
おまけ:合わせ技
特定のシートの特定のセルから値を取得
--Sheet1のA1から値を取得
value = ((x.application.Sheets("Sheet1")).Range( "A1" )).value
参照