![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
題名は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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) VBSでExcelファイル起動時、重複しても開くのを止めたい 1 2022/10/01 23:20
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- Visual Basic(VBA) バックグラウンドのプロセスのエクセルを閉じる方法 4 2022/05/12 15:39
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【js】attrで属性を取得する...
-
リンク先のJavaScriptを実行す...
-
JavaScriptからVBScriptの呼び...
-
iPhone Safariの戻るボタンの挙動
-
フォルダ名の取得方法
-
文字を入れ替わり表示させたい...
-
ブラウザの「戻る」ボタンを押...
-
ASP.NET(VB2005)■ WEBページ...
-
印刷時に消したいjavascriptがある
-
javascriptでbgmを自動再生する...
-
<![CDATA[の意味がわからない
-
見覚えのないコードが・・・
-
IISでの302 Redirectページの作...
-
アラートの表示方法についてご...
-
2つのjavascript 統合
-
JavaScriptによる(連続)自動判定
-
<a href="#" …>の意味を教えて...
-
bodyにidをつける理由は何ですか?
-
getElementsByNameで要素が取得...
-
javascriptでalertの文字列をコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vbscriptで自分自身のウィンド...
-
JavaScriptからVBScriptの呼び...
-
毎回、ページ読み込み時に1回...
-
ウインドウの後ろに隠れている...
-
onbeforeunload時のwindow.open...
-
<aタグで変数に文字を代入
-
javascriptでbgmを自動再生する...
-
datepickerで日付の値を取得したい
-
JavaScript関数呼出し元の要素...
-
Cygwinでログをのこす方法
-
showModalDialogで開いた画面か...
-
PrintScreenキーを無効にしたい
-
undefinedが表示されてしまう
-
ブラウザの「戻る」ボタンを押...
-
リンク先のJavaScriptを実行す...
-
<script>...</script> 要素の内
-
location.reload() について
-
フォルダ名の取得方法
-
確認ダイアログで「キャンセル...
-
Java ScriptでIPによるアクセス...
おすすめ情報