• 締切済み

VB6でEXCELをクローズ出来ない

VB6でEXCELを使用した後クローズ処理をしたつもりですが、VBと別にEXCELを起動しVBで使ったEXCELを読み込もうとすると、「編集のためロックされています」とメッセージが出て、読み取り専用でしかオープン出来ません。また、VBでEXCELを繰り返しオープンするとメモリがいっぱいになってしまいます。 VBでのEXCELオープンは Dim fnm As String Dim exl As Object fnm = "EXCEL File名" 'フルパスで指定 Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm クローズは Set exl = CreateObject("Excel.Application") exl.Application.Quit Set Sheet = Nothing Set BooK = Nothing Set ExcelApp = Nothing 以上です。なお、VBの参考書は入門書だけ持っていますが、このようなことは書いてありません。従って上のコードも意味もわからず、ネットから拾ってきたまま使用しています。参考書または、Webサイトを紹介して頂ければ有り難いです。

みんなの回答

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.3

No.2です。 うーん、当方の環境では先の例文でexcelは終了されるのですが どこかバージョン違いがあるのかもしれません。 別の手として、全てのexcelのプロセスを削除する方法を添付しておきます。 notepad.exeをexcel.exeに変更すれば実現できます。

参考URL:
http://okwave.jp/qa/q2542032.html
sansaiji
質問者

補足

ありがとうございます。 エクセルのクローズ処理をを下記一行で行いました。結果は 'コンパイルエラー SubまたはFunctionが定義されていません とエラーになりました。 この処理はEXCEL.EXEをクローズするための処理のような気がしますが、XXXX.XSL ファイルのみクローズするだけではだめなんでしょうか。 当面はプロシージャ内でオープン、クローズ処理するやり方にします。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.2

No.1です。 --- Private Sub Command1_Click() のなかで、クローズ処理を Private Sub Command2_Click() のなかでのように別プロシージャで行うと ”実行時エラー'91': オブジェクト変数またはWithブロックの変数が設定されていません。” とエラーメッセージが出てしまいます。 これを解決する方法があれば教えてください。 --- 可能性として考えられるのは Set exl = CreateObject("Excel.Application") を実行する前に、 exl.Application.Quit を実行するとこのようなエラーが発生します。 (たとえば、サンプルを実行した直後にCommand2_Clickをクリックする)。 これだとexlオブジェクトが定義されていないことになるので 実行時エラーが発生します。 これを回避するためには、exlオブジェクトが定義されているかどうか確認します。 If exl Is Nothing Then Exit Sub End If こうすることで、定義されていない場合はプロシージャから抜けます。 --- 「つまり、オープンのときに使用したexlオブジェクトとクローズのときに使用したexlオブジェクトが存在しています。」が理解できないくらいの初心者です。よろしく御願いします。 --- 理解しようとすると難しいので、概念として理解してください。 オブジェクトを定義したときにインスタンスが新しく作成されます。 インスタンスとは「分身」のこと。つまりexcelの分身が自動的に作られます。 さらに、別のタイミングでオブジェクトを定義すると またインスタンスが作成され、別の分身が作られます。 この2つの分身はexcelの分身である、という共通点はありますが 分身同士は別物として扱われます。 excelがクッキーの生地とすると、2つのインスタンスは 生地から抜き取ったクッキーそのもの、といったところでしょうか。 このあたりの考え方は「クラス」につながっていきます。

sansaiji
質問者

補足

ありがとうございます。 Private Sub Command1_Click()  エクセルファイルのオープン処理 End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub の順に処理をしますとエラーは発生しません。 ただ、オープンしたエクセルファイルは、VBを終了した後、上のパスを通った数だけ残ってしまうようです。 Private Sub Command1_Click()  If exl Is Nothing の時”エクセルファイルのオープン処理”を実行  ”エクセルファイルのオープン処理” End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub でもおなじです。 Private Sub Command1_Click()  エクセルファイル・オープン済 の時”エクセルファイルのオープン処理”をパス  ”エクセルファイルのオープン処理” End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub のように処理をすると、残るエクセルファイルは1つだけになるようです。 以上より exl Is Nothing では”オープンしたエクセルファイルがない”ことはチェックできていないようです。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

まず Set ExcelApp = Nothing ではなく Set exl = Nothing ですね。 つぎに exl オブジェクトのインスタンスが2つ作成されています。 タスクマネージャを見ればわかると思いますが Set exl = CreateObject("Excel.Application") を実行するたびに「Excel.exe」がプロセスに追加されます。 つまり、オープンのときに使用したexlオブジェクトと クローズのときに使用したexlオブジェクトが存在しています。 これを防ぐために、インスタンスの作成は一回でする必要があると思います。 ソフトの使用方法がわからないので何ともいえませんが 仮に、フォーム上に「開く」「閉じる」といった使い方をしているならば exlオブジェクトをメンバ変数で宣言すると この問題を解決できます。 ちなみに「プロジェクト」→「参照設定」で「Microsoft Excel xx.x(バージョン) Object Library」 にはチェックを入れてありますか。 入れてあるとexl.と入力したときに入力候補が表示されて便利です。 以下に参考を示します。 Private exl As Excel.Application Private Sub Command1_Click() Dim fnm As String fnm = "c:\blank.xls" 'フルパスで指定 Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm End Sub Private Sub Command2_Click() exl.Application.Quit Set Sheet = Nothing Set BooK = Nothing Set exl = Nothing End Sub

sansaiji
質問者

お礼

ありがとうございました。 EXCELのオープン、クローズを同一プロシージャの中で行えば正常に出来るようになりました。 しかし、オープン処理を Private Sub Command1_Click() のなかで、クローズ処理を Private Sub Command2_Click() のなかでのように別プロシージャで行うと ”実行時エラー'91': オブジェクト変数またはWithブロックの変数が設定されていません。” とエラーメッセージが出てしまいます。 これを解決する方法があれば教えてください。 参考:「Microsoft Excel xx.x(バージョン) Object Library」にチェックは入っています。   :Private exl As Excel.Applicationはこのフォームの先頭で定義しました。   :EXCELはデータを参照するだけなので非表示です。   :「つまり、オープンのときに使用したexlオブジェクトとクローズのときに使用したexlオブジェクトが存在しています。」が理解できないくらいの初心者です。よろしく御願いします。

関連するQ&A

  • VB6からExcelを操作する

    VB6.0からExcelの操作をしています。 そのなかで、Excelシートを印刷したいのですが、どのようにしたら良いのでしょうか。 また、ExcelVBAのFunctionやSubを実行するにはどのようにするのでしょうか。 VB6.0内でExcel操作は次のようにしています。 Dim ExcelApp As Object Dim EWorkbook As Object Dim ESheet As Object Set ExcelApp = CreateObject("Excel.Application") Set EWorkbook = ExcelApp.Workbooks.Open(ExcelBookFlNm) Set ESheet = EWorkbook.Sheets(M_SheetNm) Set ESheet = Nothing Set EWorkbook = Nothing ExcelApp.Quit Set ExcelApp = Nothing よろしくお願いします。

  • VB6からExcellのSheetNo.を設定する方法

    VB6でEcellをデータベースとして使用します。 Excellのファイルを開きSheet1のセルデータを読み込むことは出来ますが、Sheet2以降のシートを指定する方法が判りません。教えてください。Ecellファイルは下記の手順でオープンしてます。 Dim fnm As String Dim exl As Object gStrExcelDir = CurDir fnm = gStrExcelDir + "ファイル名" Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm ここまででSheet1のセルデータの読み込みはできます。 次に新しいSheetNo.を設定する方法が判りません。 よろしく御願い致します。

  • VB6からExcellのSheetNo.の設定方法

    VB6で、Excellを使用するアプリケーションを作成中です。 下記の手順でExcellファイルをオープンしていますが、SheetNo.を指定する方法が判りません。VB6は全くの初心者でExcellファイルを開くやり方もネットからもってきたもので、意味も判らないまま使用しています。 よろしく御願いします。 Dim fnm As String Dim exl As Object gStrExcelDir = CurDir         'gStrExcelDir:String変数 fnm = gStrExcelDir + "\ファイル名" Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm ここまででファイルのオープンは出来ていて、SheetNo.1のセルのデータ読み込みは出来ます。 この後、別なSheetNoを設定する方法が判りません。

  • エクセルを終了させたい。

    Set rs =VB_ado.Execute(sql) Set exl = CreateObject("Excel.Sheet") rs.Close exl.Sheets(1).Name = Mid(fnm1, 1, 6) exl.Application.Visible = True exl.Windows.Arrange ArrangeStyle:=1 exl.saveas fnm  (1)質問 VB_ado.Close (1)saveasするときに上書きメッセージを表示したくない。 (2)EXCELのWindowsを表示させたくない。または、表示したEXCELを終了させたい。

  • VB5.0からExcel97にデータを書き込むとき

    VB5.0からExcel97にデータを書き込んだりする場合、最初にVBのほうで どういう設定をしなければいけないのでしょうか? 参照設定でMicrosoft Excel 8.0 Object Libraryを選択していて 以下の文をVBに設定しています。 Dim ExcelApp As Object Set ExcelApp = CreateObject("Excel.Application") これだけだと、起動したときに"Excel.Application"の部分が 「型が一致しません」でエラーになります。 何か足りない設定があるのでしょうか? 説明がわかりにくいかと思いますが、どうしたらいいかなかなか わかりません。どうぞよろしくお願いします。

  • VB2008 エクセル出力

    VB2008 エクセル出力 教えていただけると助かります VB6.0使用時にエクセル出力をするために下記のようなプログラムで出力していました ※「Microsoft Excel 9.0 Object Library」を参照 Dim xlApp As EXCEL.Application Dim xlBook As EXCEL.Workbook Dim xlsheet As EXCEL.Worksheet Dim File As String File = App.Path + "\EXCEL\" + "フォーム.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(File) Set xlsheet = xlBook.Worksheets("テスト") xlsheet.Range("A1") = "テスト" 'フォルダ作成 If Dir("D:\", vbDirectory) = "" Then Call Mkdirs("D:\テスト") 'Worksheetを名前をつけて保存します。 xlApp.DisplayAlerts = False xlsheet.SaveAs "D:\テスト\テスト.xls" xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing Set xlsheet = Nothing VB2008の場合だとどのように書けば同じように動きますか ※色々試してみましたがダメでした 「Microsoft Excel 12.0 Object Library」を参照しています

  • アクセスからエクセルファイルを全て閉じたい

    アクセスからエクセルファイルを全て閉じるにはどうすればいいでしょう?(保存して閉じたいです) エクセルファイルは名前やファイル数はランダムです。 アクセスの標準モジュールに Sub Test1() Dim ExcelApp As Object Set ExcelApp = CreateObject("Excel.Application") ExcelApp.Application.Visible = False Set ExcelApp = Nothing End Sub と書きました。 このあいだにコードをいれるのですが 思いつきません。 まず数を取得して 一つ一つ保存→閉じるかな?と思い MsgBox ExcelApp.Worksheet.Count を入れてみましたが エラーになりました。 オフィスのバージョンは2003です。 ご教授よろしくお願い致します。

  • VisualBaic2005でExcelファイルを読む方法

    Dim oExl As Excel.Application Dim WorkBookName As Excel.Workbook Dim Open_WorkSheet_Name As Excel.Worksheet oExl = CreateObject("Excel.Application") WorkBookName = oExl.Workbooks.Open("d:\book011.xls", , False) この時点でExcelのファイルが開きません。 また、oExl.Visible = True を実行するとExcel自体は開くのですが、ファイルのオープンは できません。また、終了時に oExl.Workbooks.Close() oExl = Nothingを実行すると Excel自体は閉じるのですが、プロセスは残りまます。 VB2005からExcelファイルを読む方法とクローズ処理の方法を 教えてください。よろしくお願いします。

  • VB2005でのEXCEL制御について

    いつもお世話になってます。 私はVB入門者です。 VBからシートを選択して値を入れることは出来たのですが 範囲選択→格子罫線をひく、といったような操作について 調べたところ、マクロをつくりコピーアンドペーストでスムーズに いくということがわかったので、試したところうまくいきませんでした。 又、質問ナンバー QNo.3575919 に [Visual Basic2005でExcelに罫線を描く]とあり 「CreateObject("Excel.Application")」はソースに入っているか という部分がポイントのようなので、少しいじってはみたのですが うまくかけませんでした。 と、いうよりも理解できませんでした。 下記のコードでは選択範囲を指定する部分まで成功したものです。 アドバイスよろしくお願いします。 Sub excel_app() Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing xlApp = New Excel.Application() xlBooks = xlApp.Workbooks xlBook = xlBooks.Open("C:\hoge.xls") xlSheets = xlBook.Worksheets xlBook.Worksheets(1).Range("A31:Y55").Select() xlBook.Worksheets(1).Range.Borders. ←これ以降がわかりません。

  • 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

専門家に質問してみよう