VBからExcelを起動しています。

Set xlSheet = CreateObject("Excel.Application")
xlSheet.Workbooks.Open FileName:="C:\My Documents\demo.xls"

Excelでの処理が終わった時、Excelを終了させます。

xlSheet.Quit

「Quit」で終わらせているのですが、
どうも「プログラムの強制終了」で見る限り
Excelが残ったままです。
対処策はあるのでしょうか?
教えてください。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

EXCELの残骸・・・


確かに残ることがあります。
EXCELに対してのコーディングの仕方により、残ることがあるそうです。
ぼくも経験しました。

Set xlSheet = CreateObject("Excel.Application")
      ・
      ・
      ・
xlSheet.Quit
Set xlSheet = Nothing

の間を修正することにより、回避できるそうなのですが・・・
その時はコードが長くてほとんど完成していた物の修正ということもあり、別の方法で強制的に終了させました。

サンプルは、全てのEXCELを閉じるようになってます。


Sub quitAllExcel()
  Dim strSQL   As String
  Dim objXlsApp  As Object
  Dim lngCnt   As Long
  Dim i      As Long
  
  'エクセルの起動している数を得る
  strSQL = "SELECT Handle FROM Win32_Process WHERE Name = ""EXCEL.EXE"""
  lngCnt = GetObject("winmgmts:").ExecQuery(strSQL).Count
  
  '問い合わせ
  If lngCnt < 1 Then
    MsgBox "EXCELは起動してません"
    GoTo PGMEND
  ElseIf vbCancel = MsgBox(lngCnt & "個の起動中のEXCELをみつけました。全て破棄終了しますか?", vbOKCancel) Then
    GoTo PGMEND
  End If
  
  'エクセル閉じる処理
  For i = 1 To lngCnt
    Set objXlsApp = GetObject(, "Excel.Application")
    On Error GoTo 0

    If Not (objXlsApp Is Nothing) Then
      Call quitExcel(objXlsApp)
      Set objXlsApp = Nothing
    End If
  Next i
PGMEND:
End Sub

'指定のエクセルアプリケーション内で開いているブック全てを「保存済み」状態にして終了させる
Sub quitExcel(inObjXlsApp As Object)
  Dim objXlsBook As Object
  
  For Each objXlsBook In inObjXlsApp.WorkBooks
    objXlsBook.Saved = True
  Next objXlsBook
  inObjXlsApp.Quit
End Sub
    • good
    • 0

Setで作成したObjectにはNothingをセットして消してください。



Set xlSheet = Nothing

この回答への補足

お返事ありがとうございます。

現在、Qutiの後に Nothingも記述しています。
それでも、残骸があるのです。

補足日時:2002/03/08 10:01
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBからエクセルを起動。そのあとエクセルを終了

教えてください。
VBからエクセルを起動します。
そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。
しかし、エクセルが終了しません。
タスクバー上のエクセルをクリックすると終了します。
どうして、このような現象が起こるのかわかりません。
教えてください。
下記に同様のサンプルを書きました
誤記入があるかも知れませんが
このような感じのプログラムです。
以上、よろしくお願いします。


public sub test
Dim XApp as Excel.Application
Dim nfilename as string
Dim xlBook As Object
Dim xlSheet As Object

' エクセルを起動
Set xlApp = New Excel.Application

nfilename ="AAAA.xls"

' 指定されたファイルを開く
Call xlApp.Workbooks.Open(nfilename)

Set xlBook = xlApp.ActiveWorkbook
Set xlSheet = xlBook.Worksheets(1)

'フォームを貼り付ける
xlSheet.Range("a1").PasteSpecial
  
  'ファイル名の作成
Filename="BBBB.xls"

'保存

ChDir "C:\"
xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False

Set xlSheet = Nothing
xlBook.Close True
Set xlBook = Nothing
xlApp.Quit
Set xlApp = Nothing

End sub

教えてください。
VBからエクセルを起動します。
そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。
しかし、エクセルが終了しません。
タスクバー上のエクセルをクリックすると終了します。
どうして、このような現象が起こるのかわかりません。
教えてください。
下記に同様のサンプルを書きました
誤記入があるかも知れませんが
このような感じのプログラムです。
以上、よろしくお願いします。


public sub test
Dim XApp as Excel.Application
...続きを読む

Aベストアンサー



参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=231028

QExcelのプロセスが消えません

Excelを普通に起動して閉じた後、タスクマネージャで確認すると、EXCEL.EXEのプロセスが残っています。
ファイルを開いた場合も、空で起動した場合も同様です。
さらに、終了後もEXCEL.EXEのプロセスが多くのメモリを消費しており(200MB以上)、CPU使用量も高くなっています。これでは困るので、毎回強制的に落としています…。

このような症状なのですが、解決策はありますでしょうか。
念のため、ウイルスチェックとOfficeアップデートを試してみましたが改善しません。
どなたかご存知でしたらご教示ください。

Microsoft Windows XP Professional Version 2002 SP2
Microsoft Office Excel2003 SP2

Aベストアンサー

一応、やってみることとしては、次の手順で操作してみたら如何でしょうか。

(1) 「ファイルを指定して実行」で[名前]欄に Excel /s と入れ、[OK]します。

 (または、スタートから[すべてのプログラム]内の Microsoft Office Excel2003 を
 Ctrlキーを押しながら起動しても良い。)

(2) もし上記 /s 起動で「・・・見つかりません」のときは、下記の1行をコピーして
  [名前]欄に貼り付けてください。 " " を含めフルパスで指定します。

 "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /s

 これでExcelが、Safe Mode で起動になっていることを確認します。
 (Excelのタイトルバーに セーフ モードが付加されてていることを確認します。)

(3) Excel(セーフモード)を終了し、少し経過後プロセスを確認します。

(4) これで正常の場合で、メニュー/ツールバー等のユーザ設定部分が、初期化しても
  良いなら、次の操作を行います。

  C:\Documents and Settings\ユーザ名\Application Data\Microsoft\Excel

  の中にある XLSTART フォルダ と Excel11.xlb ファイルを削除します。
 (XLSTARTフォルダ および Excel11.xlb は、再起動で、新らしく作成されます。)

  これで、通常の方法で起動し、正常か確認します。

(5) これでもダメなら、Excel.EXE およびその構成ファイルの異常の可能性があり、
  ユーザの操作範囲外のため 一旦、Office(Excel)をアンインストールし、更にインストールした
 ホルダ( C:\Program Files\Microsoft Office\OFFICE11 )(標準インストールした場合)ごと
 削除後に 再インストールしてみるとよいでしょう。

一応、やってみることとしては、次の手順で操作してみたら如何でしょうか。

(1) 「ファイルを指定して実行」で[名前]欄に Excel /s と入れ、[OK]します。

 (または、スタートから[すべてのプログラム]内の Microsoft Office Excel2003 を
 Ctrlキーを押しながら起動しても良い。)

(2) もし上記 /s 起動で「・・・見つかりません」のときは、下記の1行をコピーして
  [名前]欄に貼り付けてください。 " " を含めフルパスで指定します。

 "C:\Program Files\Microsoft Office\OFFICE11\EXCEL....続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QスプレットシートのGetTextについて。

 今、VBでスプレットシートを使っています。
 スプレットシートに入っている値を配列に入れたいと思ってます。
 そのとき使う関数はスプレットシート名.GetTextですよね?
 そのGetTextの引数が行と列までは分かりますが、第3引数のVarの
 意味が分かりません。
 ヘルプを読んでも理解できなくて、ネットでも調べてみましたが、
 スプレットシートに関するページがなかなか見つからなくて
 今も分からない状態です。

 どなたかスプレットについて載っているページをご存知の方が
 いましたら、紹介してください。
 また、この場で教えてくださってもかまいません。

 すみませんが、よろしくお願いします。

Aベストアンサー

VarにGetTextされた内容が入ります。

例えばですが
fspreed1.GetText ColCnt, RowCnt, Var
と記述すると、スプレッドシートの横方向はColCntで指定しますね。
スプレッドシートの縦方向はRowCntで指定しますね。

で、Varにそのセルの内容が設定されます。

QエクセルVBAで#N/Aのようなエラー値を含むセルの検出は

エクセルVBAでセルに#N/Aのようなエラー値を含む場合Ifを使った構文で制御したいのですが、エラー値であるかどうかを調査するにはどうすれば良いでしょうか。教えてください。

Aベストアンサー

ワークシート関数のISERRORを使えばよいようです。

#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! のいずれでもTRUEが返ります。

エラーの種類を検出するには、ERROR.TYPE関数を使用します。ただし、ERROR.TYPE関数でエラーのないセルを参照すると、#N/A が返ります。

詳細は、キーワード「エラー」または「IS関数」でヘルプをご参照ください。

VBAを使う場合は、CVErr 関数でエラー値を検出できます。
(詳細は、キーワード「セルのエラー値」で。)

QVBからExcelに書き込む方法

こんにちは。VB6.0(SP5),Excel2000,Win2000でVBの勉強をしています。
VBでコマンドボタンを押した時に、テキストボックスのデータを、Excelに書き込みたいと思っています。
特定のExcelに書き込むことは「GetObject」で出来たのですが、名前がわからない場合はどうしたらよいのでしょうか?

※ExcelはVBから起動したものではなく、人が任意のファイルを起動しています。Excelの名前はわかっていません(任意なので、何かわかりません)

このような場合に、VBから書き込むのは可能なのでしょうか?
よろしくお願いします。

Aベストアンサー

'Microsoft Excel への参照を格納する変数を宣言します。
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet


'Microsoft Excel が既に起動されているかどうかを調べます。
'第 1 引数を指定せずに GetObject 関数を呼び出すと、
'アプリケーションのインスタンスへの参照が返されます。
'Microsoft Excel が起動されていないと、エラーが発生します。
Set xlApp = GetObject(, "Excel.Application")

If Err.Number Then
MsgBox "Excel が起動されていません。"
' エラーが発生した場合は Err オブジェクトをクリアします。
Err.Clear
Else
' MsgBox "Excel はすでに起動中です。"
Set xlBook = xlApp.Workbooks.Item(1)
Set xlSheet = xlBook.Worksheets.Item(1)

xlSheet.Cells(3, 5) = Me.Text1.Text
End If

上記のプログラムで開いてるエクセルの1つめのブックの1つめのシートにテキストボックスのデータが書き込まれます。
いかがでしょうか?

'Microsoft Excel への参照を格納する変数を宣言します。
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet


'Microsoft Excel が既に起動されているかどうかを調べます。
'第 1 引数を指定せずに GetObject 関数を呼び出すと、
'アプリケーションのインスタンスへの参照が返されます。
'Microsoft Excel が起動されていないと、エラーが発生します。
Set xlApp = GetObject(, "Excel.Application")

If Err.Nu...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QVB6.0からエクセルを起動

現在VBとVBAの勉強をしているのですが、VB6.0からエクセルを起動する際に、エクセルにはVB6.0から引数を渡したいのですがどうすれば良いでしょうか?

どなたか、ご存じの方が居ましたら教えてください。

Aベストアンサー

以下の例を参考にしてください。

'VB側
  cPassWd = "パスワード"
  MyPath = "C:\"
  wPG = "Book1.xls"
  paA = "引数1"
  paB = "引数2"
  Set MyExcel = CreateObject("Excel.Application")
  Set MyBook = MyExcel.Workbooks.Open(MyPath & wPG, , True, , cPassWd, "")
  MyExcel.Visible = True
  MyExcel.Run "Main", paA, paB

'EXCEL側
Sub Main(paA As String, paB As String)
  MsgBox paA
  MsgBox paB
End Sub

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報