題名は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で参照しても同じことなのでしょうか?
また当方、先のサポートページの内容を正しく理解できておらず、この問題を解決できておりません。どなたかアドバイスいただけたらと思います。
No.1ベストアンサー
- 回答日時:
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>
を追加すれば無事開放されるようです。
No.2
- 回答日時:
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と混用するのでしょう?
ありがとうございます。値だけ受け取るようにする、という考え方ができていなかったので、とても参考になりました。
なお、Javascriptと混用する理由は、エクセルのセルの値をgoogle maps APIに与えたかったからです。不勉強だからかもしれませんが、google maps APIだとJavascriptしか使えないと思ったので、エクセルから値をとりだすためにVBScript、その値を使うためにJavascriptと考えました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vbscriptで自分自身のウィンド...
-
JavaScriptのAddFavoriteがIE7...
-
showModalDialogで開いた画面か...
-
リンク先のJavaScriptを実行す...
-
onbeforeunload時のwindow.open...
-
JavaScriptからVBScriptの呼び...
-
ページの移動を確認し、falseな...
-
リロードについて
-
JavaScriptを使う時は、
-
<a href="#" …>の意味を教えて...
-
別ファイルのfunctionの読み込み方
-
bodyにidをつける理由は何ですか?
-
html メールリンクにて自動ファ...
-
javascriptでalertの文字列をコ...
-
javascriptとApacheの設定
-
window.open()の複数の使用
-
iframeの中から親ページをスム...
-
javascriptでクリックしたリン...
-
JavaScriptでのEnterキーとAlt+...
-
submitボタンで他のフレームを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptからVBScriptの呼び...
-
ウインドウの後ろに隠れている...
-
毎回、ページ読み込み時に1回...
-
Vbscriptで自分自身のウィンド...
-
onbeforeunload時のwindow.open...
-
datepickerで日付の値を取得したい
-
Cygwinでログをのこす方法
-
右クリックを左クリックと同じ...
-
ASPで取得した情報をscriptタグ...
-
文字を入れ替わり表示させたい...
-
JavaScriptを使う時は、
-
undefinedが表示されてしまう
-
ブラウザの「戻る」ボタンを押...
-
javascriptでbgmを自動再生する...
-
<aタグで変数に文字を代入
-
scriptエラー?
-
Java ScriptでIPによるアクセス...
-
<script>...</script> 要素の内
-
showModalDialogで開いた画面か...
-
javaからcgiの呼び出し
おすすめ情報