MS-ACCESS2003 LOOP処理されるOBJECTのデータ消去について

このQ&Aのポイント
  • MS-ACCESS2003のVBAを用いて、LOOP処理されるOBJECTのデータ消去方法について相談です。
  • funcAから複数回呼ばれるfuncBにおいて、objCに前回のデータが残ったままとなってしまいます。
  • deleterowだと一件ずつの削除で時間がかかってしまいます。効率的な方法はないでしょうか?
回答を見る
  • ベストアンサー

MS-ACCESS2003 LOOP処理されるOBJECTのデータ消去について

MS-ACCESS2003のVBAを用いて以下のようなコードを記述しています。 ============================================= function funcB() Dim objB As Object Dim objC As Object Set objB = R3.Add("RFC_READ_TABLE") set objC = objB.Tables("DATA") objCに他システムからselectしたデータを格納 set objB = nothing end function ============================================= function funcA() for i = 0 to n call funcB next end function ============================================= 上のようにfuncAから複数回呼ばれるfuncBにおいて、objCにnothingをsetすることで一旦は参照が切れて 見えなくなりますが、再度funcAからcallされるとobjCには前回のデータが残ったままとなっています。 これを回避するためにnothingをセットする前にobjCのデータを消去したいのですが、deleterowだと一件 ずつの削除となり50万件で30分程度の時間を要してしまいます。 何か改善する良い方法はないでしょうか? よろしくお願いすます。

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

No1です。失礼しました。 質問文中に、[set objC = nothing]ではだめ、と書いてありましたね。 何かダミーの小さい(初期化された)を用意しておいて 再度setするとか。 #コピペでうっかり巨大なデータを扱って動作が遅くなった際に #何か小さなデータを再度コピーしてクリップボードを初期化するのと #同じような感じで。

Mapoon
質問者

お礼

nothingでは参照設定が無くなるだけで、実体は残っていて、2回目にcallされて、再度同じ名前でsetするとデータがよみがえってしまいまうんです。 SAPのRFC_TABLE_READという汎用モジュールを使っているのですが、オブジェクト名を変えても結果は同じでした。 結局SAPの汎用モジュール側で受け取ったオブジェクトに対して初期化せずにAPPNEDをしているのがいけないことが分かり、SAPの汎用モジュールの先頭でオブジェクトを初期化するようにしたら解決しました。 色々とアドバイスを頂きまして、有難うございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

set objB = nothing end function を set objB = nothing set objC = nothing end function では駄目なのですか?

関連するQ&A

  • [Delphi]入れ子(?)になったプロシージャ

    こんにちは、honiyonです。  あるプロシージャだけが呼び出す関数がある為、次のように定義しました。  procedure Subfunc;   function funcA:integer;   begin    ~    function funcB;    ~   end;   function funcB:integer;   begin    ~    function funcA;    ~   end;  begin   ~  end;  funcAとfuncBは協調して動作するのですが、当然funcAからfuncBは見えていませんので、「funcBが見つからない」とエラーになります。  しかし、この場合どのようにfuncBの存在を定義すれば良いのかわかりません。  あまりこのような形で作成するケースが少ないようで、資料がなく困っています(^^;;  宜しくお願いします(..

  • 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

  • Accessからバッチ処理を実施し、作成したデータを取り込む処理

    お世話になっております。 題名の件ですが、 ▼Accessマクロ Function EventQuery() Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") objWSH.Run """C:\Documents and Settings\userName\デスクトップ\EventLogAccess\event.bat""" Set objWSH = Nothing End Function 上記マクロで、event.batというバッチ処理を実行しております。 ▼event.bat set fname=%DATE:/=% eventquery /s server /u userName /p passWord /l application /fi "Id eq 8" /fi "Datetime gt 12/04/2009,01:00:00AM" /r 500 /v >%fname%.txt 上記バッチ処理で、2009年12月4日のイベントログ(アプリケーション)の一覧を取得しております。 【質問内容】 eventquery.vbsのオプションでは日付指定しかできないみたいですが、 実行した当日のログ(アプリケーション)を取得したいと考えております。 方法はないでしょうか? ご教示の程宜しくお願い致します。

  • class を使用した時の考え方について

    趣味として、プログラミングしているレベルです。職業としての開発経験はありません。 実際の開発業務においては、どちらが一般的なのか、教えて下さい。 例として、ファイル内の行数をを取り込む場合。(Excel VBA です。) Case 1 は、メイン処理の記述数が少ないのですが、クラス内での処理がネスト化しています。 Case 2 は、メイン処理で、一々関数を呼び出していますが、クラス内の関数は、独立しています。 ■ Case 1 -----メイン-------------------------------------------------- Dim argetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile fileRowCount = targetFile.rowCount("c:\", "sample.txt") Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Private Function openFile() 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Private Function readFile() Call openFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount(pPath As String, pFileName As String) As Long myFileName = pPath & pFileName Call readFile rowCount = 'myFileData から、行数を取得する処理 End Function ------------------------------------------------------- ■ Case 2 -----メイン-------------------------------------------------- Dim targetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile Call targetFile.openFile("c:\", "sample.txt") Call targetFile.readFile fileRowCount = targetFile.rowCount Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Public Function openFile(pPath As String, pFileName As String) myFileName = pPath & pFileName 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Public Function readFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount() As Long rowCount = 'myFileData から、行数を取得する処理 End Function -------------------------------------------------------

  • 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 よろしくお願いします。

  • ACCESSでExcelにデータ出力、高速化

    ACCESSのVBAを使ってテーブルのデータを 既存ブックに出力し、別名で保存をしたいのですが、 どうも、処理が遅くて困っています。 改善点がありましたら教えてくださいお願いいたします。 Dim objExcel As Excel.Application Dim xlWrkbk As Excel.Workbook Dim xlWrksh As Excel.Worksheet Dim rs As DAO.Recordset Dim strFilename As String strFilename = CurrentProject.Path & "既存ブック名.XLS" Set objExcel = New Excel.Application Set xlWrkbk = objExcel.Workbooks.Open(Filename:=strFilename, ReadOnly:=True) Set xlWrksh = xlWrkbk.Worksheets("シート名") Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot) With objExcel xlWrksh.Range("A:N").Clear xlWrksh.Range("A2").CopyFromRecordset rs xlWrkbk.SaveAs Filename:=CurrentProject.Path & "新しいブック名.xls" xlWrkbk.Close .Quit rs.Close End With Set rs = Nothing Set objExcel = Nothing Set xlWrkbk = Nothing Set xlWrksh = Nothing

  • shell関数を使ってる事になりますか?

    Function test() Dim objsample As Object Set objsample = CreateObject("Shell.Application") objsample.FindFiles '検索画面を表示させます。 Set objsample = Nothing '開放します End Function このサンプルは、shell関数を使ってる事になりますか? 「Shell.Application」がshell関数なのか教えてください。

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • SAPデータ取得 エクセルVBA

    いつもここでお世話になっております。 次のサイトで掲載されていたVBAで、SAPのデータ(テーブルデータ)をエクセルで取得することができることがわかりましたが、例えばですがSQLを利用するようなVBAを追記して、任意のフィールド、任意のデータを指定して、それに合致するものだけをエクセルに表示させることはできないでしょうか(イメージとして、SELECT フィールド FROM QUERY_TABLE WHERE データのような感じ)。 何度も試行錯誤をしたのですが、うまくいきません。なにとぞよろしくお願い申し上げます。 ※SAPテーブル取得のエクセルVBA : http://d.hatena.ne.jp/sikakura/20100702/1278053742 -ーーー【以下、テーブルデータ取得のためにVBA】---- Sub ログインR3_LOGON() Set R3 = CreateObject("SAP.Functions") 'R3.Connection.System = "172.31.220.42" 'R3.Connection.client = "100" 'R3.Connection.User = "SAP*" 'R3.Connection.Password = "" 'R3.Connection.Language = "EN" '自動ログインする場合は、Connection.Logon(0,True)にして、 '上のパラメータを設定すればOK. If R3.Connection.Logon(0, False) <> True Then MsgBox "ログインを中止しました" Exit Sub End If 'IMPORTパラメータ Dim QUERY_TABLE As Object Dim DELIMITER As Object Dim NO_DATA As Object Dim ROWSKIPS As Object Dim ROWCOUNT As Object '条件式 Dim OPTIONS As Object Dim FIELDS As Object 'データ Dim DATA As Object '結果保持用 Dim ROW As Object Dim Result As Boolean Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Variant '***************************************************** 'RFC_READ_TABLEを指定します '***************************************************** Set MyFunc = R3.Add("RFC_READ_TABLE") Set QUERY_TABLE = MyFunc.exports("QUERY_TABLE") Set DELIMITER = MyFunc.exports("DELIMITER") Set NO_DATA = MyFunc.exports("NO_DATA") Set ROWSKIPS = MyFunc.exports("ROWSKIPS") Set ROWCOUNT = MyFunc.exports("ROWCOUNT") Set DATA = MyFunc.Tables("DATA") Set OPTIONS = MyFunc.Tables("OPTIONS") Set FIELDS = MyFunc.Tables("FIELDS") QUERY_TABLE.Value = "CSKT" DELIMITER.Value = " " NO_DATA = " " ROWSKIPS = 0 ROWCOUNT = 0 Result = MyFunc.Call If Result = True Then Set DATA = MyFunc.Tables("DATA") Set FIELDS = MyFunc.Tables("FIELDS") Set OPTIONS = MyFunc.Tables("OPTIONS") Else MsgBox MyFunc.EXCEPTION Exit Sub End If '列名をExcelシートに出力 For iField = 1 To FIELDS.ROWCOUNT Worksheets("Sheet2").Cells(1, iField).Value = FIELDS(iField, "FIELDTEXT") Next 'データをExcelシートに出力 iField = 1 For iRow = 1 To DATA.ROWCOUNT For iField = 1 To FIELDS.ROWCOUNT iStart = FIELDS(iField, "OFFSET") + 1 iLength = FIELDS(iField, "LENGTH") If iStart > Len(DATA(iRow, "WA")) Then vField = Null Else vField = Mid(DATA(iRow, "WA"), iStart, iLength) End If Worksheets("Sheet2").Cells(iRow + 1, iField).Value = vField Next Next ' **************************************************** ' Release Object ' **************************************************** Set MyFunc = Nothing Set QUERY_TABLE = Nothing Set DELIMITER = Nothing Set NO_DATA = Nothing Set ROWSKIPS = Nothing Set ROWCOUNT = Nothing Set OPTIONS = Nothing Set FIELDS = Nothing End Sub Private Function Split(ByVal inp As String, Optional delim As String = ",") As Variant Dim outarray() As Variant Dim arrsize As Integer While InStr(inp, delim) > 0 ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = Left(inp, InStr(inp, delim) - 1) inp = Mid(inp, InStr(inp, delim) + 1) arrsize = arrsize + 1 Wend ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = inp Split = outarray End Function ーーーーーーーーーーーーーーーーーーーーーー

  • Accessへのエクセルデータインポート

    Accessへのエクセルデータインポート 環境:Access2000/WinXP アクセス2000の特定テーブルへ、エクセルデータをインポートするよう組んだのですが、新しくデータを追加すると、これより前に入っていたデータがレコードを残して消えてしまいました。 新規データを追加した際にただの追加としたいのですがどこがおかしいのでしょうか。 Private Sub データ登録_Click() Dim objExcel As Object Dim varFilePath As Variant Dim bln As Boolean Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String varac = "受講者情報一覧" Set objExcel = CreateObject("Excel.Application") varFilePath = objExcel.GetOpenFilename("Microsfot Exel (*.xls), *.xls", , "xls選択") If varFilePath <> False Then varxls = varFilePath Else Exit Sub End If Set objExcel = Nothing varxls = varFilePath strrange = "" strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & "へ、インポートします。" DoCmd.DeleteObject acTable, varac If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, varac, varxls, True MsgBox "正常にインポート完了しました。" End If Exit Sub エラー: MsgBox "予期せぬエラーが発生しました。" & Chr(13) & "エラー番号:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbCritical Exit Sub End Sub

専門家に質問してみよう