Accessからオブジェクトとして開いたExcelのプロセスが終了しない

このQ&Aのポイント
  • AccessからExcelのデータを読み込んだ後、プロセスが終了しない問題について説明します。
  • Excelの終了記述やADO接続の終了記述など、解決方法を試したが問題が解決しない状況について質問しています。
  • 環境はWin2000Server、Access2000であり、問題点を見つけていただけると助かります。
回答を見る
  • ベストアンサー

Access からオブジェクトとして開いたExcelのプロセスが終了しない

AccessからExcelのデータを読み込んだ後、Accessを終了させてもプロセスが終了しません。 bookはclose、applicationはquit、オブジェクト変数はnothingというExcelの終了記述をしているので他の問題なのかと思いいろいろ調べて試しましたが解決できません。 Excelのファイル名とシート名はAccessのフォームに貼り付けたテキストボックスの値を取得させていますが下記コードでは省略しています。環境はWin2000Server、Access2000です。 どなたかお気づきの点があればどうぞご教授お願いします。 --------------------------------- Public Sub test() Dim filename As String Dim sheetname As String filename = "c:\パス\ファイル名.xls" sheetname = "シート名" 'AccessからExcelをオブジェクトとして開く Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(filename) Set xlSheet = xlBook.Worksheets(sheetname) 'Excelの行取得用変数設定 Dim xlrow As Integer 'データ開始行 xlrow = 5 Dim xlrowEnd As Integer 'データ最終行(最終行は合計値が入っているので-1とする) xlrowEnd = (Range("A5").End(xlDown).Row) - 1 'Excelデータの取り込み Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "a", cn, adOpenKeyset, adLockOptimistic cn.Execute "delete * from a" xlrow = 5 'Excelデータの開始行番号 Do While xlrow <= xlrowEnd rs.AddNew rs!フィールド1 = xlSheet.Cells(xlrow, 1).Value rs!フィールド2 = xlSheet.Cells(xlrow, 2).Value rs.Update rs.MoveNext xlrow = xlrow + 1 Loop 'Excelの終了記述 xlBook.Close xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing 'ADO接続終了記述 rs.Close Set rs = Nothing cn.Close Set cn = Nothing

noname#72976
noname#72976

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

> xlrowEnd = (Range("A5").End(xlDown).Row) - 1 この行が問題です。 上位のオブジェクトから記述しないと プロセスが残ります。 xlrowEnd = (xlSheet.Range("A5").End(xlDown).Row) - 1 にしてください。

noname#72976
質問者

お礼

ありがとうございます!! 見事にExcelのプロセスがありません!! 感謝感謝です!!m(__)m いろいろ検索している中で 「外部からExelを操作する時にApplication→Workbook→WorkSheetの関係を明示的に示す必要がある」という記述を見つけたのですが、 私がいろいろいじくるとエラーばかり返されすっかり途方にくれていました。 本当にありがとうございました。m(__)mm(__)m

関連するQ&A

  • VB6.0上でExcelオブジェクトを生成

    VB6.0上でExcelオブジェクトの生成についてです。 その1 Dim xlApp As New Excel.Application Dim xlBook As New Excel.Workbook Dim xlSheet As New Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と その2 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と、どちらが良いのでしょうか? 開発環境は  Windows2000  VB 6.0  Excel 2003 です。

  • ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について

    表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか? ====== VBAコードの抜粋 =========   Dim xlApp As Object       ' Excelのアプリケーション定義   Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義   Dim xlSheet As Object      ' Excelの参照するシート名を定義   Dim SheetName As String     ' シート名を代入   Dim SheetCount As Byte     ' シートの選択 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む If SheetCount = 1 Then SheetName = "Sheet1" If SheetCount = 2 Then SheetName = "Sheet2" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名") Set xlSheet = xlBook.Worksheets(SheetName) Set Wcell = xlSheet.Range("A1") Set Cn = CurrentProject.Connection Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True   データを取込むコードあり(省略) xlBook.Close xlApp.Visible = False Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing Next SheetCount

  • ExcelのデータをAccessのテーブルへインポートできない

    Access VBA超初心者です。 Excelのデータの任意の列のデータをAccessの既存テーブルの任意のフィールドへインポートしたいのですが 既存Excelシートの構成は例のようにデータベース形式でないため試行錯誤しています。 Excelシートの構成は1~2行は空行、3行目と4行目にフィールド名がはいっており セルの結合は使われていません。 データは5行目から開始されています。    <例> 列番号 |A列|B列|C列|D列|E列| 3行目 |     季節    |  |   4行目 | 春 |夏 |秋 |冬 |  |   5行目 |aa |bb |100 |200 |300 | まず、以下の手順1と手順2を考えました。 ---------------------------------------------------- ◇目的 上記<例>のE列のデータを既存Accessテーブルにインポートしたい。 ◇Accessの事前準備 フィールド名だけ指定し、レコードは空の状態の[a]テーブルを作成しました。 ◆手順1 AccessからExcelをオブジェクトとして開き、[a]テーブルへ列単位でコピーする() ◆手順2 [a]テーブルから条件にあうレコードを別テーブル[b]のフィールドへインポートする (SQL文) ---------------------------------------------------- まず、手順1のコードをネット検索を参考にして以下のようにしました。 最後に「入力しました」とメッセージが表示されるもののaテーブルにデータがインポートされません。 特にエラーメッセージも表示されません。 どなたか親切にアドバイス頂ける方がいらっしゃいましたらどうぞお願いします。m(__)m ---------------------------------------------------- Public Sub エクセルインポート() Dim xlApp As Object, xlBook As Object, xlSheet As Object, Wcell As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("¥Excelファイル保存場所パス\Excelファイル.xls") Set xlSheet = xlBook.Worksheets("Excelシート名") Set Wcell = xlSheet.Range("a1") Dim intNo As Integer Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "a", cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True intNo = 5 Do Until rs.EOF rs!フィールド名1 = xlApp.Application.Cells(intNo, 1).Value rs!フィールド名2 = xlApp.Application.Cells(intNo, 2).Value rs!フィールド名3 = xlApp.Application.Cells(intNo, 3).Value     ~     rs!フィールド名21 = xlApp.Application.Cells(intNo, 21).Value Loop xlBook.Close xlApp.Visible = False Set xlBook = Nothing rs.Close Set rs = Nothing cn.Close Set cn = Nothing MsgBox "入力しました" End Sub ----------------------------------------------------

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

    教えてください。 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

  • Access-VBAでフィールドまたはレコード指定

    お世話になります。 Accessから、フィールドまたは、レコードを指定して、 Excelの指定したセルに出力することはできますか? Sub EX1() On Error Resume Next Dim db As DAO.Database Dim rs As DAO.Recordset Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set db = CurrentDb '出力元のテーブルまたはクエリ Set rs = db.OpenRecordset("EQ") Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) ' Excel のセルに値を代入 xlSheet.Cells(1, 1).CopyFromRecordset rs ' Worksheet を名前をつけて保存 xlSheet.SaveAs "D:\一時保存\abc.xls" xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub ' Excel のセルに値を代入 xlSheet.Cells(1, 1).CopyFromRecordset rs の部分でできそうなのですが。 クエリにある1つ目のレコード、またはフィールドを、Excelの(1,1)。 2つ目を、(3,1)。 3つ目を、(5,1)としたいのです。 よろしくお願いします。

  • ADO オブジェクトの渡し方

    こんにちは。ADOについてお教えください。 フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。 ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。 スコープの問題で、rs、cnのオブジェクトが無い為だと思います。 ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。 Private Sub Form_Load() Call ConnectDatabase Call CloseDatabase End Sub Module1 ------------------ sub ConnectDatabase() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset 処理~~~~ end sub sub CloseDatabase() rs.Close cn.Close Set rs = Nothing Set cn = Nothing end sub

  • ACCESS2003のVBAで改修依頼管理ツールを作成しています。

    ACCESS2003のVBAで改修依頼管理ツールを作成しています。 そこで問題が発生してしまい行き詰っています。 問題は改修要望依頼が入ったテーブルを一覧表でEXCEL出力する際に、 2回目の出力を行うと「オブジェクト変数またはWithブロック変数が設定されていません。」 とエラー表示がされ、ここでデバックを使いなにも変更せず終了し、もう一回実行すると 今度は正常に出力されます。つまり正常出力した後にもう一回同じことをするとエラーが出るということです。 オブジェクトの開放もプロシージャの最後で行っているので環境は一回目の出力と変わらないはずなんですが、原因がわかりません。 常に「ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧"」の箇所でとまるので EXCELアプリケーションの参照が曖昧になっているのでしょうか? 下記はコード一部です。どこに問題があるでしょうか? 参照設定は編集済みです。 '【定数設定】 Const QName As String = "Q_改修依頼内容" '【変数設定】 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Dim i As Long Dim strMDBPATH As String 'MDBの保存場所、フォルダー・ディレクトリ Dim strXLSFILE As String 'テンプレートファイルの名前、e:\xxx\yyyy\テンプレート.xls Dim strSaveFile As String Dim ans As Long Dim strMsg As String Dim endCol As String '変数にエクセルアプリケーションをセットして開く Set xlApp = CreateObject("Excel.Application") ' Set xlBook = xlApp.Workbooks.Open(strXLSFILE) ' Set xlSheet = xlBook.Worksheets("Sheet1") ' xlApp.Visible = True With xlApp .Workbooks.Add .Visible = True End With   ActiveWorkbook.Sheets("Sheet1").Name = "改修依頼一覧" 'エラー発生箇所 Set cn = CurrentProject.Connection rs.Open QName, cn, adOpenKeyset, adLockReadOnly ActiveWorkbook.Sheets("改修依頼一覧").Range("A2").CopyFromRecordset rs 'A1セルを選択 Worksheets("改修依頼一覧").Cells(1, 1).Select 'ファイル名を設定 strSaveFile = "改修依頼内容一覧_" & Format(Now, "yyyymmdd_hhmmss") & ".xls" '名前を変更して保存 ActiveWorkbook.SaveAs FileName:=strMDBPATH & strSaveFile 'データ一覧画面に戻る DoCmd.SelectObject acForm, "データ一覧画面" 'オブジェクトの開放 Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set rs = Nothing Set cn = Nothing Exit Sub 以上です。 編集モジュールなどはエラーに関係ないと思われるステートメントは省略させていただきました。 どなたかご存知の方がいればアドバイスお願いします。

  • DBから取得したオブジェクトの受け渡し方法

    はじめましてVB初心者でわけが分からなくなっています。DBをクローズした後に取得したレコードセットを他の関数に渡すにはどうしたらよいでしょうか?おそらく、そんなのcloseせずにやればいいと思うかもしれませんが、可能かどうかがわかりません。どうか教えてくださいよろしくお願い致します。 下記のコードにて行ってます。Set rs = cn.Execute(strSQL)で取得しています。rsをDBを閉じた後も他の関数に渡せるようにしたい訳です。m(..)m Dim cn As Object Dim rs As Object Private Sub getData() Dim strSQL As String Set cn = CreateObject("ADODB.Connection") cn.Open "省略" strSQL = "SELECT * FROM swan" Set rs = cn.Execute(strSQL) Set rs = nothing Set cn.close Set cn = nothing End Sub

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • Excel出力後のExcelの起動について

    Vb側からデータをExcelに出力し、その画面を表示させたまま 出力したExcelを確認しようと思ったところ、Excelは起動するものの シートが表示されない現象が起こりました。 出力後のExcelの終了(解放?)のロジックは下記の通りです。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets.Add … … Sheetへの出力処理 … … Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing この現象の回避方法がありましたらご教授ください。 Windows2000 Vb6.0 SP5 Excel2000