dポイントプレゼントキャンペーン実施中!

題名は25文字しか入力できないので、題名と本文が不適当ですが・・・
htmlのソースにVBScriptとJavaScriptを用いて以下の事をやらせようとしました。

(1)VBScriptで、既存のエクセルファイルを開く
(2)JavaScriptで、先に開いたエクセルファイルのセルを参照して値を表示させる
(3)VBScriptで、開いているエクセルファイルを閉じる

ソースは以下のように書きました。

<html>
<head>
<title>TEST</title>
</head>
<body>

<script language="VBScript">
Dim app
Dim book
Dim sheet
Set app = CreateObject("Excel.Application")
app.Visible = false
Set book = app.Workbooks.Open("○△□.xlsx") 
Set sheet = book.Worksheets("Sheet1")
</script>

<script language="JavaScript">
document.write (sheet.Cells(1,2));
document.write (sheet.Cells(2,2));
</script>

<script language="VBScript">
book.Close()
app.Quit()
Set sheet = Nothing
Set book = Nothing
Set app = Nothing
</script>

</body>
</html>

これをIEで開くと、正しくセルの値を表示させることはできました。しかし、更新をかけると、メモリにエクセルが居座ってしまい、タスクマネージャーのプロセスを見ると、「EXCEL.EXE」が更新のたびに増えてしまいました。

マイクロソフトのサポート(http://support.microsoft.com/kb/266088/ja)によると、Javascriptからエクセルを開くとこのような症状が出ると書いてありますが、VBScriptで開いたエクセルをJavascriptで参照しても同じことなのでしょうか?

また当方、先のサポートページの内容を正しく理解できておらず、この問題を解決できておりません。どなたかアドバイスいただけたらと思います。

A 回答 (2件)

javaScriptで sheet.Cells(2,2) と Excelシートを参照している以上、


javaScript側での掃除が済むまでは解放されないのでしょう。

<script language="VBScript">
...略...
Set app = Nothing
</script>

の後ろに

<script language="JavaScript">
idTmr = window.setInterval("Cleanup();",1);

function Cleanup() {
window.clearInterval(idTmr);
CollectGarbage();
}
</script>

を追加すれば無事開放されるようです。
    • good
    • 0
この回答へのお礼

ありがとうございます。アドバイス通りの対応をしたところ、無事にEXCEL.EXEは消えました。
どうもありがとうございました。

お礼日時:2012/01/29 12:32

JavaScriptにはインスタンスを解放する


Nothingがないので、Excelのオブジェクトを
一つでも触ったら解放できなくなります。
JavaScriptでExcelを扱う場合は面倒でも
VBScript経由で処理します。
var VB = new ActiveXObject("ScriptControl");
VB.Language = "VBScript";
VB.ExecuteStatement("Dim A,B,C");
VB.ExecuteStatement("Set A=CreateObject(\"Excel.Application\")");
VB.ExecuteStatement("Set B=A.Workbooks.Open(\"○△□.xlsx\")");
VB.ExecuteStatement("Set C=B.Worksheets(\"Sheet1\")");
var データ = VB.Eval("C.Cells(1,2).Value");
VB.ExecuteStatement("B.Close");
VB.ExecuteStatement("Set A = Nothing");
VB.Reset();

Evalでオブジェクトを受け取ってしまうと
インスタンスを解放できません。
値だけ受け取るようにします。
それと、VBScriptが使えるなら、なぜ
JavaScriptと混用するのでしょう?
    • good
    • 0
この回答へのお礼

ありがとうございます。値だけ受け取るようにする、という考え方ができていなかったので、とても参考になりました。
なお、Javascriptと混用する理由は、エクセルのセルの値をgoogle maps APIに与えたかったからです。不勉強だからかもしれませんが、google maps APIだとJavascriptしか使えないと思ったので、エクセルから値をとりだすためにVBScript、その値を使うためにJavascriptと考えました。

お礼日時:2012/01/29 12:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!