• 締切済み

AccessでExcelのプロセスが消せない

Access2007を使用してExcelへ出力するプログラムを作っております。 On Error時にExcelのプロセスが消せなくて困っています。 正常に終了した場合は消えているのですが、On Error時には消せないと言うのはなぜでしょう? どなたか教えてください! ロジックは以下の通りです。 Dim xls, Book, newSheet As Object Private Sub cmd02_Click() On Error GoTo Err_cmd02_Click '処理A '処理B '処理C 'ExcelFile出力 Call ExcelOut Exit_cmd02_Click: Exit Sub Err_cmd02_Click: MsgBox ERR.Description 'ExcelがOpenしているかの判断 If bolExcelFlag = True Then 'Open中だったらClose Set newSheet = Nothing Book.Close SaveChanges:=False Set Book = Nothing xls.Quit Set xls = Nothing End If Resume Exit_cmd02_Click End Sub Private Sub ExcelOut() 'Excelオブジェクト作成 Set xls = CreateObject("Excel.Application") '新しいブックを追加 Set Book = xls.Workbooks.Add '新しいシートを追加 Set newSheet = Book.Worksheets(1) 'ExcelFlagをOn bolExcelFlag = True 'ヘッダー出力 Call HeaderOut 'ExcelFile編集メイン Call MainOut '最終のSub Total編集 Call BreakOut 'フッター出力 Call FooterOut 'ファイルの保存 Book.SaveAs (strOutFileName) '各オブジェクトのClose Book.Close xls.Quit Set newSheet = Nothing Set Book = Nothing Set xls = Nothing 'ExcelFlagをOff bolExcelFlag = False End Sub 以上、よろしくお願いいたします。

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

当方で行ってみる限り 注1、注2をコメントアウトすると 現象(エクセルが残る現象)が起き コメントアウトしなければ,現象が起きません。 >プロシージャレベル変数になっている可能性はありませんでしょうか? この行、大丈夫ですね? なお、当方の環境は、Office2016で、 Option Explicit     '注1 Dim xls, Book, newSheet As Object Dim bolExcelFlag As Boolean   '注2 Sub main()  On Error GoTo Err_cmd02_Click  'ExcelFile出力  Call ExcelOut Exit_cmd02_Click:  Exit Sub Err_cmd02_Click:  MsgBox Err.Description  'ExcelがOpenしているかの判断  If bolExcelFlag = True Then   'Open中だったらClose   Set newSheet = Nothing   Book.Close SaveChanges:=False   Set Book = Nothing   xls.Quit   Set xls = Nothing  End If  Resume Exit_cmd02_Click End Sub Sub ExcelOut()  Dim wsVal As Integer  Set xls = CreateObject("Excel.Application")  Set Book = xls.Workbooks.Add  Set newSheet = Book.Worksheets(1)  bolExcelFlag = True  newSheet.cells(3, 1).Value = "AAAA"  wsVal = 1 / 0  Book.SaveAs ("D:\wk\aaa.xlsx")  '各オブジェクトのClose  Book.Close  xls.Quit  Set newSheet = Nothing  Set Book = Nothing  Set xls = Nothing  'ExcelFlagをOff  bolExcelFlag = False End Sub

thararom
質問者

お礼

HohoPapaさん ありがとうございます。 また、返信が遅くなってしまって申し訳ございませんでした。 なるほど、グローバル変数のbolExcelFlagに問題がありそうですね? そこを中心に色々試してみます。 ありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.1

その1 If bolExcelFlag = True Then ↑のコードで使っている変数をどこで宣言しているのか気になります。 プロシージャレベル変数になっている可能性はありませんでしょうか? その2 どこかで、 Exit_cmd02_Click: を直接呼び出している可能性はありませんでしょうか? その3 Private Sub ExcelOut() この中でエクセルの起動やブックのオープンを行っていますのでl 私だったら、 この中でエラー処理を行い、そのエラー処理で 必要なブックやエクセルのクローズ処理を行います。 ※そのほうが、コードが読みやすいです。

thararom
質問者

お礼

HohoPapa様 回答ありがとうございます。 以下に回答させて頂きます。 その1 If bolExcelFlag = True Then ↑のコードで使っている変数をどこで宣言しているのか気になります。 プロシージャレベル変数になっている可能性はありませんでしょうか? →オブジェクト内のグローバル変数にしております。 その2 どこかで、 Exit_cmd02_Click: を直接呼び出している可能性はありませんでしょうか? →サーチしましたが、呼びだしている個所はありませんでした。 その3 Private Sub ExcelOut() この中でエクセルの起動やブックのオープンを行っていますのでl 私だったら、 この中でエラー処理を行い、そのエラー処理で 必要なブックやエクセルのクローズ処理を行います。 ※そのほうが、コードが読みやすいです。 →ご指摘ありがとうございます。  参考にさせて頂きます!

関連するQ&A

  • access2000設定について

    access2000で下記のような設定をしています。 フォーム画面より、表示ボタンをクリックすると プレビュー状態でそのままで、画面に表示されません。どこが悪いのでしょうか・ Private Sub cmd表示_Click() DoCmd.Maximize If gOnErrorCtl Then On Error GoTo Err_cmd表示_Click lblStatus.Caption = "総勘定元帳をプレビュー表示します" Call PrintSokanjo If RtnCd Then lblStatus.Caption = "プレビュー中 . . ." DoCmd.OpenReport "R_総勘定元帳出力用変更", acViewPreview lblStatus.Caption = "総勘定元帳プレビュー終了" Else MsgBox "印刷は中止されました", vbOKOnly, AppName End If Exit_cmd表示_Click: Exit Sub Err_cmd表示_Click: Resume Exit_cmd表示_Click End Sub

  • 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

  • access vba 構文の解読

    access vba 構文の解読 はじめまして先ほどaccess2003について質問させていただいたものです。以下の構文が先ほどの続きです。こちらも皆様のお力で構文を解読していただけないでしょうか。 すみません解読とは、構文の一行一行が何を示しているのか教えていただけると助かります。 よろしくお願いいたします。 ' Exit the application. Case conCmdExitApplication CloseCurrentDatabase ' Run a macro. Case conCmdRunMacro DoCmd.RunMacro rs![Argument] ' Run code. Case conCmdRunCode Application.Run rs![Argument] ' Open a Data Access Page Case conCmdOpenPage DoCmd.OpenDataAccessPage rs![Argument] ' Any other command is unrecognized. Case Else MsgBox "不明なオプションです。" End Select ' Close the recordset and the database. rs.Close HandleButtonClick_Exit: On Error Resume Next Set rs = Nothing Set con = Nothing Exit Function HandleButtonClick_Err: ' If the action was cancelled by the user for ' some reason, don't display an error message. ' Instead, resume on the next line. If (Err = conErrDoCmdCancelled) Then Resume Next Else MsgBox "コマンド実行中のエラーです。", vbCritical Resume HandleButtonClick_Exit End If End Function Private Sub メニュー終了_Click() On Error GoTo Err_メニュー終了_Click DoCmd.Close Exit_メニュー終了_Click: Exit Sub Err_メニュー終了_Click: MsgBox Err.Description Resume Exit_メニュー終了_Click End Sub Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Quit Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub

  • access VBAでのファイル読み込みとその保存方法

    昨日も質問させていただいたVBA初心者です。 いろいろ調べましたが解決しなかったので、 またまた質問させていただきます。 ファイルを読み込んで、それを別ファイルに保存したいのですが、 下記ですと、1行のみ保存されるだけでした。 この方法ですと、すべて保存されるはずと書かれていたのですが。 全くどこが悪いのか分かりません、よろしくお願いします。 Private Sub cmd_Click() On Error GoTo Err_cmd_Click Dim ReadFileName As String Dim Contents As String Dim WriteFileName As String ReadFileName = "P:\dl_engine\logs1\service\20020223" ' ファイルを読み込む Open ReadFileName For Input As #1 Input #1, Contents Close #1 WriteFileName = "C:\Contents\data\Melody.csv" ' ファイルに保存 Open WriteFileName For Output As #2 Write #2, Contents Close #2 '正常終了 Exit_cmd_Click: Exit Sub 'エラー処理 Err_cmd_Click: Beep Select Case Err.Number Case Else MsgBox Err.Number & ":" & Err.Description End Select Resume Next End Sub

  • オブジェクトが必要です・・・・・

    オブジェクトが必要です・・・・・ すみません、判りません、丸投げです(爆)、申し訳ありませんがどなたか完成していただけませんか?;; また、この辺りをサルでも判るように解説してくれていて勉強し易いサイトがあったら教えてください・・・ Private Sub コマンド1_Click() Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSht As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Open("■■■■■.xls") Set xlsSht = xlsWkb.Sheets(■■■■) If xlsBook.ReadOnly Then xlsBook.Close MsgBox "そのファイルは既に開かれています。" xlsApp.Quit Else xlsBook.Close End If Set wkb = Nothing: Set xls = Nothing Exit_exOpenEditC: Exit Sub Err_exOpenEditC: MsgBox Err.Number & " - " & Err.Description Resume Exit_exOpenEditC End Sub accessからexcelファイルをシートを指定して開き、重複の場合は開かない様にし、メッセージボックスを表示させたいのです・・・

  • アクセスにて検索フォームを作りたい

    お世話になります。 アクセス初心者です。 会社名検索フォームに会社名を入力して表示コマンドをクリックすると 会社フォームの入力した会社が表示されるようにしたいのです。 現在は、表示コマンドをクリックすると会社フォームが開きます。 どの会社名を打ち込んでもNo.1のレコードしか開きません。 つまり会社フォームが開く という指示をしているだけです。 コードなど全く分かりません。 ただ、本を見て真似て下記の通り入力してみました。 間違っているor足りない ということはわかっていますが、 どう入力すれば良いのかわかりません。 教えて下さい。よろしくお願いいたします。 Private Sub cmd表示_Click() On Error GoTo Err_cmd表示_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "会社フォーム" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_cmd表示_Click: Exit Sub Err_cmd表示_Click: MsgBox Err.Description Resume Exit_cmd表示_Click End Sub

  • 【Access VBAからExcelを閉じたい】

    【Access VBAからExcelを閉じたい】 以下のコマンドを書いて、 クエリ結果をExcelに貼りつけました。 ですが、Excelを保存して閉じることができず、、、。 (自動起動・終了を目的としています) 具体的には、 objApp.Save を実行すると、 『この場所に"RESUME.XLW"という名前のファイルが既にあります。置き換えますか?』 とメッセージボックスが出てきます。 何もメッセージを出さずに、上書き保存→Excelを閉じるには、どのように書けばよろしいでしょうか? 以下ソース - - - - - - - - - - - - - - - - Private Sub XLS_Paste_1() On Error GoTo Err_XLS_Paste_1 Dim DB As DAO.Database Dim RS As DAO.Recordset Dim objApp As Object Dim ExeName As String Dim SheetName As String ExeName = "\\FileServer01\Share\Excel_Base.xls" SheetName = "Report" Set DB = CurrentDb Set RS = DB.OpenRecordset("qry_sel_DAILY_DATA") On Error Resume Next Set objApp = CreateObject("Excel.Application") '変数にExcelオブジェクトを格納 objApp.Visible = True 'Excelを画面に表示させる With OBJEXE objApp.Workbooks.Open (ExeName) With objApp.Sheets(SheetName) .Range("B53:G83").ClearContents '転記エリアのクリア .Cells(53, 2).CopyFromRecordset RS 'B53基準で出力 End With objApp.Visible = True objApp.Save objApp.Quit Set objApp = Nothing Set RS = Nothing Set DB = Nothing Set OBJEXE = Nothing Exit Sub End With Exit_XLS_Paste_1: Exit Sub Err_XLS_Paste_1: MsgBox Err.Description Resume Exit_XLS_Paste_1 End Sub

  • vbaで、postgresqlアクセス問題

    vbaで、postgresqlアクセス問題:      データベースに、データは ***0000, でも、vbaで、取得したのは ****.四つの0が自動に、削除されました。      例: postgresqlに、 40000 ⇒ vbaで、取得した: 4   vbaソース:  Option Explicit Sub subPgGetData() Dim adoCn As New ADODB.Connection On Error GoTo ErrLogin: With adoCn .Provider = "PostgreSQL OLE DB Provider" .Properties("Data Source") = Range("B1").Value .Properties("Location") = Range("B2").Value .Properties("User ID") = Range("B3").Value .Properties("Password") = Range("B4").Value .Open End With On Error GoTo 0 Dim adoRs As New ADODB.Recordset On Error GoTo ErrSql: adoRs.Open Range("B6").Value, adoCn, adOpenForwardOnly, adLockReadOnly On Error GoTo 0 Workbooks.Add Cells.CopyFromRecordset adoRs Cells.Columns.AutoFit adoRs.Close: Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub ErrLogin: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoCn = Nothing Exit Sub ErrSql: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub End Sub わかる方はご指示ください。 よろしくお願いします。

  • 【Access VBA クエリ結果をExcelに貼り付けたい】

    【Access VBA クエリ結果をExcelに貼り付けたい】 以下のコマンドを書いて、 クエリ結果をExcelに貼りつけました。 この記述ですと、クエリのヘッダー部が貼りつけされません。 ヘッダー部も合わせて貼りつけるには、どのように記述すればよろしいでしょうか? 以下ソース - - - - - - - - - - - - - - - - Private Sub XLS_Paste_1() On Error GoTo Err_XLS_Paste_1 Dim DB As DAO.Database Dim RS As DAO.Recordset Dim objApp As Object Dim ExeName As String Dim SheetName As String ExeName = "\\FileServer01\Share\Excel_Base.xls" SheetName = "Report" Set DB = CurrentDb Set RS = DB.OpenRecordset("qry_sel_DAILY_DATA") On Error Resume Next Set objApp = CreateObject("Excel.Application") '変数にExcelオブジェクトを格納 objApp.Visible = True 'Excelを画面に表示させる With OBJEXE objApp.Workbooks.Open (ExeName) With objApp.Sheets(SheetName) .Range("B53:G83").ClearContents '転記エリアのクリア .Cells(53, 2).CopyFromRecordset RS 'B53基準で出力 End With objApp.Visible = True objApp.DisplayAlerts = False objApp.Save objApp.DisplayAlerts = True objApp.Quit Set objApp = Nothing Set RS = Nothing Set DB = Nothing Set OBJEXE = Nothing Exit Sub End With Exit_XLS_Paste_1: Exit Sub Err_XLS_Paste_1: MsgBox Err.Description Resume Exit_XLS_Paste_1 End Sub

  • ACCESSからEXCELへのオートメーション操作

    ACCESSからEXCELへのオートメーション操作について質問させて下さい。 以下のようにコードを書きましたが、エラーに飛んでしまいます。 また、EXCELファイルは出来ているのですが、データがきちんと出力されません。 解決手段をご教授して下さい。 宜しくお願いします。 Private Sub コマンド39_Click() On Error GoTo エラー_Err DoCmd.TransferSpreadseet acExport, acSpreadsheetTypeExcel8, "営業報告", "C:\営業日報.xls", True Dim objEXE As Object , Dim wk_excel As Object, wk_book As Object Dim wk_file As String wk_file = "営業日報" Set objEXE = Excel.Application objEXE.Workbooks.Open ("C:\営業日報.xls") wk_excel.Sheets(wk_file).Columns("C:C").Select wk_excel.Sheets(wk_file).Open.Columns("E:E").ColumnWidth = 10 With Selection .Formula = .Value End With wk_excel.Sheets(wk_file).Range("A1").Select Exit Sub エラー_Err: MsgBox "エラーです" エクセル_Exit: Exit Sub End Sub

専門家に質問してみよう