JavaScriptで開いたエクセルが閉じない

このQ&Aのポイント
  • JavaScriptで開いたエクセルが閉じない問題について
  • JavaScriptとVBScriptを用いてエクセルを操作する際に、更新をかけるとエクセルが閉じない問題が発生する
  • マイクロソフトのサポートページによると、JavaScriptからエクセルを開く際にこの問題が発生する可能性がある
回答を見る
  • ベストアンサー

JavaScriptで開いたエクセルが閉じない

題名は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で参照しても同じことなのでしょうか? また当方、先のサポートページの内容を正しく理解できておらず、この問題を解決できておりません。どなたかアドバイスいただけたらと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • e_watt
  • ベストアンサー率71% (25/35)
回答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> を追加すれば無事開放されるようです。

kotsumekawauso
質問者

お礼

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

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答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と混用するのでしょう?

kotsumekawauso
質問者

お礼

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

関連するQ&A

  • エクセルVBAとVBScript

    WinXP/Pro  エクセル2002使用です。 VBScriptで下記のメール送信のプログラムを作り、 それをエクセルVBA→BATファイル→VBScript(→エクセルVBAに戻る)という流れで自動化させましたが、下記のコードでは、現在進行中のエクセルVBAとは別のブックを作るのでうまくいきません。 (エクセルブックを2重起動してしまいます) Set objExcel =GetObject( "d:\auto\aaa.xls") Dim stradrs Dim strkk Dim strjikan with objExcel stradrs = .Worksheets("Sheet1").Cells(5,1).Value strkk= .Worksheets("Sheet1").Cells(4,1).Value strjikan = .Worksheets("Sheet1").Cells(4,2).Value end with Set objEmail = CreateObject("CDO.Message") objEmail.From = "***@***.com" objEmail.To = stradrs objEmail.Subject = "表題" objEmail.Textbody = "内容" objEmail.AddAttachment("d:\auto\" & strkk & strjikan & ".doc") objEmail.Send Set objEmail = nothing Set objExcel = nothing 目的は、最初に立ち上げている(VBScriptを呼び出したVBAを実行中の)エクセルから値を取得したいのです。 下記いずれかの方法によると思っています。 (1)エクセルVBAから直接VBScriptに引数で値を渡すことは可能でしょうか? (2)VBScriptからエクセルブックを起動させずに値を取得することは可能でしょうか? 値はテキスト文字です。 何卒よろしくお願いします。

  • ACCESSからexcelを操作

    accessのVBからEXCELのデータ編集を行う際、 最後エクセルを開放しているつもりなのですが、できていないようです。 ※タスクマネージャーにエクセルのタスクが残っており、 該当のファイルを開くと白くなっている。閉じて再度開くと正常動作する。 いくつかの帳票がありますが、 現象が起こるものと起こらないものがあります。 試しに Xls_app.ScreenUpdating = Trueにしてみるとタスクには残っているが 問題なく開けます。 Xls_app.ScreenUpdating = Falseだとタスクにも残るし、ファイルを開くと白くなっているような感じです。 しかし発生原因がわからず、再発するような気もするので根本原因を 突き止めたいです。 Excel起動時 ---------------- Set Xls_app = CreateObject("Excel.Application") Set Xls_book = Xls_app.Workbooks.Open(STR_out_file) Set Xls_sheet = Xls_book.Worksheets(STR_sheet1) Set Xls_sheet2 = Xls_book.Worksheets(STR_sheet2) 'DEBUG Xls_app.Visible = False Xls_app.ScreenUpdating = False Xls_app.UserControl = True ' Xls_app.Visible = True ' Xls_app.ScreenUpdating = True Private Sub Excel終了()----------------------- Xls_book.Close (True) Xls_app.Quit Set Xls_sheet = Nothing Set Xls_sheet2 = Nothing Set Xls_book = Nothing Set Xls_app = Nothing End Sub

  • VB6からエクセル操作

    VB6でエクセルを開き、ある処理をして、 名前を付けて保存ダイアログを出して保存したいのですが、 名前を付けて保存ダイアログを出すところがうまくいきません。 Dim app As Excel.Application Dim book As Excel.Workbook Dim sheet As Excel.Workshee Set app = CreateObject("Excel.Application") app.Visible = True Set book = app.Workbooks.Open("c:\test.csv") 'ファイルを開く Set sheet = book.Worksheets(1) sheet.Columns("B:D").Delete Shift:=xlToLeft sheet.Columns("C:D").Delete Shift:=xlToLeft sheet.Rows("1:7").Delete Shift:=xlUp ここで、名前を付けて保存ダイアログを出して、ファイルを保存したい。

  • VBscriptでのエクセルの起動について

    phpで開発しているのですが 問題はVBscriptでの問題と思われますのでここで 質問させてください。 vbscript上で Dim xl Dim book, sheet Set xl = CreateObject("Excel.Application") xl.Visible = false Set book = xl.WorkBooks.Add("http://**/****.xls") xl.DisplayAlerts = False -------- phpでのエクセルへのデータ操作 -------- xl.DisplayAlerts = true xl.visible = true set book = Nothing Set xl = Nothing という形でエクセルを起動して、データを挿入してから 画面上に表示という事をしています。 このときに、エクセルはちゃんと起動してくるのですが アクティブウインドウになってくれません。 タスクバーのボタンがピコピコ点滅するだけです。 クリックすると前面に表示されるのですが。。。 どうにか、自動的に前面に出すことはできないでしょうか?

  • アクセスから現在開いているエクセルの値を取得したい

    アクセスから現在開いているエクセル(BOOK1.xls)のシート1のA1に入っている値を取得するにはどうすればいいでしょうか? アクセスの参照設定の「Exsel 11.0 object Library」 にチェックを入れ Sub Test() Dim ExcelSheet As Object Set ExcelSheet = CreateObject("Excel.Sheet") ExcelSheet.Application.Visible = True MsgBox ExcelSheet.Application.Cells(1, 1).Value Set ExcelSheet = Nothing End Sub とやってみたのですが 新たなエクセルブックが表示され、空白のセルのA1が取得されてしまいます。 「現在開いているBOOK1のシート1」とするにはどうすればいいのでしょうか? ご教授よろしくお願いします。

  • VB.net2003のエクセルからデータを取得したいのですが・・・

    お世話になります。 VB.NET2003でExcel XPのセルの数値を取得しTextBoxなどで表示させたいのですが、うまいこといきません。 下に考えてみたコードを書いてみます。 とりあえずExcelのA1セルの値を取得してみたいのですが、後ほどループで他のセルの値も取得したいと思っています。 これを回すと、num(1, 1) = sheet.cells(1, 1)(下から3行目)で”追加情報 : 型 'Range' から型 'String' へのキャストが有効ではありません。”とされます。 どなたかご教授お願いしますm(__)m Private Sub exel_open() '------配列設定----- Dim app As Object 'エクセルアプリケーションの定義 Dim book As Object 'ブックの定義 Dim sheet As Object 'シートの定義 Dim col, row As Integer 'colは行、rowは列 Dim num(1, 1) As String '各セルの値を取得 '------エクセルファイルを開く&表示------- app = CreateObject("Excel.Application") app.application.visible = True book = app.Workbooks.Open("D:\test.xls") 'エクセルファイルのopen sheet = book.Worksheets(1) '-----エクセルデータの読み込み------ num(1, 1) = sheet.cells(1, 1) TextBox1.Text = num(1, 1) End Sub

  • WSHによるExcelのセルコピー&ペーストの方法

    【やりたいこと】 WSHを利用して 1.あるExcelファイル(Aとする)を開く 2.別のExcelファイル(Bとする)を開く 3.Aの特定のシートの特定のセル範囲をコピー 4.Bの特定のシートに、3でコピーしたセル範囲をペースト 5.B上書き保存&閉じる 6.A閉じる 【現状】 以下のようなコードを書いてみたのですが、 ファイルの開閉はできますがコピー&ペーストが 全くできていないようです。 何が問題なのかよくわからず質問させていただきました。 かなり素人なので無駄も多いですが、ぜひご教授願います。 よろしくお願い致します。 ------------------------------------- Set xl1 = Wscript.CreateObject("Excel.Application") xl1.Visible = false Set book1 = xl1.WorkBooks.Open(A) Set mysheet1 = book1.worksheets(特定のシート) Set xl2 = Wscript.CreateObject("Excel.Application") xl2.Visible = false Set book2 = xl2.WorkBooks.Open(B) Set mysheet2 = book2.worksheets(特定のシート) mysheet1.Activate xl1.Range("A1").CurrentRegion.Select xl1.Selection.Copy mysheet2.Activate xl2.Range("A1").Select xl2.Selection.Pastespecial 'ファイルクローズ book2.Close false xl2.Quit set mysheet2 = Nothing set book2 = Nothing Set xl2 = Nothing book1.Close false xl1.Quit set mysheet1 = Nothing set book1 = Nothing Set xl1 = Nothing --------------------------------

  • VBで既存エクセルシートを新規ブックにコピー

    VB6,Excel2003です。 既存のエクセルシートを新規ブックにコピーする プログラムを作成してみましたが タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。 どこが原因か教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim xlsApp As Excel.Application Dim xlsBookTemp As Excel.Workbook 'コピー元ブック Dim xlsBookCopy As Excel.Workbook 'コピー先ブック Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート Dim xlsSheetCopy As Excel.Worksheet 'コピー先シート Set xlsApp = CreateObject("Excel.Application") Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls") Set xlsSheetTemp = xlsBookTemp.Sheets(1) Set xlsBookCopy = xlsApp.Workbooks.Add Set xlsSheetCopy = xlsBookCopy.Sheets(1) xlsApp.Visible = True 'コピー元のSheet1を新規ブックにコピーする xlsSheetTemp.Copy Before:=xlsSheetCopy 'コピー元のブックは閉じる xlsBookTemp.Close '///新規ブックの編集処理/// Set xlsSheetTemp = Nothing Set xlsBookTemp = Nothing Set xlsSheetCopy = Nothing Set xlsBookCopy = Nothing Set xlsApp = Nothing End Sub

  • クリップボードの内容をEXCELに貼付け

    クリップボード内容をエクセルのシートに貼り付けることをvbで行おうとしています。 1回目はできるのですが、2回目にはエラーが出てしまいます。(貼り付けるセルを指定したときに) 現状のコードを添付します。おかしなところがわかる方、教えて下さい。 '------------------------------------------------------- 'エクセルを起動させる '------------------------------------------------------- Public Sub ExcelProc() Dim xl2 As Excel.Application Dim xl2Book As Object Dim xl2Sheet As Object Dim ELSFileName As String 'エクセルの起動 Set xl2 = CreateObject("excel.application") xl2.Visible = True xl2.Workbooks.Open ("d:\test.xls") Set xl2Book = xl2.ActiveWorkbook Set xl2Sheet = xl2Book.Worksheets(1) 'D10にクリップボードの内容を貼り付ける xl2Sheet.Select Range("d10").Select ActiveSheet.Paste '保存するファイル名を作成 ELSFileName = "c:\test10.xls" '保存 ChDir "C:\" ActiveWorkbook.SaveAs FileName:=ELSFileName, FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xl2Sheet = Nothing xl2Book.Close True Set xl2Book = Nothing xl2.Quit Set xl2 = Nothing End Sub この関数を2度実行させたらエラーになります。 Range("d10").Select 'この箇所でエラーになる。 お願いします。

  • VBScriptでのExcelブックのプロパティ参照について

    VBScriptでのExcelブックのプロパティ参照について 先達のみなさまこんにちは。 VBScript(ExcelVBAではなく)を使って、Excelブック内のName (Excelで、[挿入]-[名前]-[定義...]で表示される一覧) を削除したいと思いコーディングしてみましたが、実行すると ブックのBuiltInプロパティを参照しようとする箇所で エラーとなってしまいます。 エラーメッセージは「オブジェクトでサポートされていない プロパティまたはメソッドです。:'objName.BuiltIn'」と 表示しています。 次のようなコードです。 *** Option Explicit Sub DelNames() Dim objArgs Dim objXls Dim objBook Dim objName Dim I Set objArgs = WScript.Arguments Set objXls = CreateObject("Excel.Application") Set objBook = objXls.ActiveWorkbook For I = 0 to objArgs.Count - 1 ' 引数内容確認 Wscript.Echo objArgs(I) objXls.Workbooks.Open objArgs(I) objXls.Visible = True For Each objName in objXls.ActiveWorkbook.Names If (objName.BuiltIn = True) Then objName.Delete End If Next Next Set objXls = Nothing Set objBook = Nothing Set objName = Nothing End Sub *** これをlesson03.vbsとして保存し、これを呼び出すwsfファイルを作成しました。 *** <job id = "DelNamesDD"> <script language = "VBScript" src = ".\lesson03.vbs"></script> <!-- Excel参照設定 --> <reference guid="{00020813-0000-0000-C000-000000000046}"></reference> <!-- メイン処理 --> <script language = "VBScript"> Option Explicit Call DelNames() </script> </job> *** たとえばこれをDelName.wsfとして保存し、DelName.wsfにExcelファイル(*.xls) をドラッグドロップして、「ビルトインではない」名前を削除させたい、と 考えたのです。 しかし、 If (objName.BuiltIn = True) Then の部分で上記のエラーとなってしまい、解決方法がわかりませんでした。 解決方法を教えていただきたくよろしくお願いいたします。 利用しているExcelのバージョンは2003(SP3)、WSHのバージョンは5.6 です。OSはWindows XP SP3です。 お手数をおかけしますが、よろしくお願い申し上げます。

専門家に質問してみよう