SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

MaxscriptからOLEを使ってExcelにアクセス


はじめに

今回は、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

 

 参照

Maxscriptリファレンス OLE オートメーション