Excel VBAでAccessを起動し、エクセルファイルのインポートを行い、ゾンビエクセルが残る理由を教えてください

このQ&Aのポイント
  • ExcelのVBAからAccessを起動し、エクセルファイルのインポートを行う処理を実装しています。しかし、この処理を行うとエクセルを閉じてもゾンビエクセルが残ってしまいます。なぜこのような現象が起きるのか理解できません。他の解決方法を知りたいです。
  • VBAを使ってExcelからAccessを起動し、エクセルファイルのインポートを行っていますが、インポート処理後にエクセルを閉じてもゾンビエクセルが残ります。なぜこのようなことが起きるのかわかりません。他の方法でインポートを行う方法を教えてください。
  • ExcelのVBAからAccessを開き、エクセルファイルのインポートを行っていますが、インポート処理後にエクセルを閉じてもゾンビエクセルが残ります。この現象の原因としてはTransferSpreadsheetのコードが考えられますが、他の解決策を知りたいです。
回答を見る
  • ベストアンサー

ゾンビエクセル・・・(ExcelVBA)

ExcelのVBAからAccessを起動し、エクセルファイルのインポートを行っています。 この処理を行うと、その後エクセルを閉じてもプロセスにエクセルが残ってしまいます。 なぜこうなってしまうのか判りません。よろしかったら教えてください(><) 一応コードを書いてみます。TransferSpreadsheetのコードを実行しない場合はゾンビエクセルは残らないので、それが原因だとは思うのですが他の方法がわかりません。 よろしくお願いいたします。 Dim appAccess As Object Dim acImport, fname As String, ffname As String acImport = "acImport" fname = ThisWorkbook.Path & "\取込.mdb" ffname = ThisWorkbook.FullName Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase fname appAccess.DoCmd.TransferSpreadsheet , 8, _ "torikomi", ffname, True, "torikomi" Set appAccess = Nothing

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 現象は確認しました。  .Net では、COMで、こういう問題は知っていましたが、思ってみた方法は試してみましたが、ことごとく失敗しました。今、私は、どうしてよいのか分かりません。   苦肉の策というのか以下のようにはして見ましたが、お世辞にも上手いとは言えません。通常は、Excelからエキスポートではなくて、Access側からインポートさせるというのが通例なので、こうした現象は、分かりませんし、また、一般的に、Excel側からだと、Accessには、ADOなどを使って取り込ませますね。一応、二重起動を防止させるとか、そこまでする必要はないと思います。 まあ、参考までにしてください。きちんと書くなら、ADOなどからのほうがよいですね。 Access2003 なら、OFFICE11 ですが、実際に合わせて直してください。 Sub TestExport() Dim appAccess As Object Dim fname As String, ffname As String Dim xlApp As Object fname = ThisWorkbook.Path & ""\取込.mdb" ffname = ThisWorkbook.FullName   rtn = Shell("C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE", vbHide) With GetObject(, "Access.Application")   .OpenCurrentDatabase fname   .DoCmd.TransferSpreadsheet , 8, "torikomi", ffname, True, "torikomi"   .CloseCurrentDatabase   .Quit End With End Sub

-yellowtail-
質問者

お礼

Wendy02様 何度か質問に答えていただき、いつもありがとうございます。 確かに通常はACCESSから処理しているのですが、今回はどうしてもEXCELから行う必要があり、困っていました。 頂いたコードを実行してみたのですが、やはりプロセスが残ってしまいました。 ADOやVB.NETなど手をつけたこともなく、ちょっと難しいです。 でも、私のコードではACCESSが画面に出てしまっていたのが解消され、大変助かりました。 >一応、二重起動を防止させるとか、そこまでする必要はないと思います。 この言葉にヒントを得て、エクセルのファイルの方を見直してみることにしました。 いろいろ試行錯誤してなんとか成功したのでコードを載せます。 Sub アクセス変換() Application.ScreenUpdating = False Dim WB As Workbook Sheets("取り込み").Select Sheets("取り込み").Copy Set WB = ActiveWorkbook WB.SaveAs ThisWorkbook.Path & "\torikomi.xls" WB.Close False Dim appAccess As Object Dim fname As String, ffname As String Dim xlApp As Object, rtn fname = ThisWorkbook.Path & "\取込.mdb" ffname = ThisWorkbook.Path & "\torikomi.xls" rtn = Shell("C:\Program Files\Microsoft Office\OFFICE10\MSACCESS.EXE", vbHide) With GetObject(, "Access.Application") .DoCmd.SetWarnings False .OpenCurrentDatabase fname .DoCmd.TransferSpreadsheet , 8, "torikomi", ffname, True, "torikomi" .CloseCurrentDatabase .Quit End With On Error Resume Next Kill ThisWorkbook.Path & "\torikomi.xls" End Sub

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 すみません。私が手抜きした結果は、結局ダメだったということですね。 コードをみさせていただきました。それで上手くのですね。 まったく、想像がつかないというか、それは、なぜ、成功しているのか、良く分かりません。 一応、私の回答はマクロが主なので、そのままではみっともないので、ADO を使ってみました。^^; 一応、格好がつくと思います。 ExcelのVisual Basic Editor のメニューの ツール-参照設定-Microsoft ActiveX Date Object xx.x Library (xx.x は数字)にチェックを入れてください。 「.AddNew」の部分のあとに、 フィールド名とセルの列を書き入れてください。 マクロは、自ブック(ThisWorkbook) からになっていますが、違うようでしたら、その部分を、ActiveWorkbook に修正してください。 一応、こちらでは、プロセスの残骸は、今度は、ちゃんと確認しましたが、そちらでもお調べください。 '-------------------------------------------- Sub ExportMacroR() Dim MyPath As String Dim DbName As String Dim i As Integer Dim xlRng As Range '名前の定義登録 Set xlRng = Range("torikomi") Dim cnADO As New ADODB.Connection Dim rsADO As New ADODB.Recordset MyPath = ThisWorkbook.Path & "\" DbName = "取込.mdb" Set cnADO = New ADODB.Connection   cnADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MyPath & DbName      Set rsADO = New ADODB.Recordset   rsADO.Source = "torikomi"   rsADO.ActiveConnection = cnADO   rsADO.CursorType = adOpenStatic   rsADO.LockType = adLockOptimistic   rsADO.Open      With rsADO   For i = 2 To xlRng.Rows.Count     .AddNew     'ここを書き換えてください。例:     ![日付] = xlRng.Cells(i, 1).Value     ![売上] = xlRng.Cells(i, 2).Value     .Update   Next i   End With   rsADO.Clone   cnADO.Close      Set rsADO = Nothing   Set cnADO = Nothing      Set xlRng = Nothing End Sub

-yellowtail-
質問者

お礼

お礼がものすごく遅くなり申し訳ありません。 検証してから・・・と思ったのですが、時間が取れず、遅くなってしまいました。 せっかく、丁寧な回答いただいたのに礼儀知らずで申し訳ありませんでした。 本当にありがとうございました。

関連するQ&A

  • EXCELファイルからACCESSへインポート

    質問させていただきます。 ACCESSのフォームから、EXCELファイルを選択してEXCELの内容を、 テーブルにインポートさせたいのですが。以下の方法で行って いるのですが、テーブルに反映されません。 Private Sub cmd_Import_Click() Dim InitialFileName As String Dim varTitle As Variant Dim FileName As String InitialFileName = "hoge.xls" varTitle = "ファイルを開く" FileName = GETHOGEOPEN(varTitle, InitialFileName) DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_HOGE", FileName, True DoCmd.SetWarnings True MsgBox "完了しました" End Sub ACCESS → ACCESS2003 SP3 EXCEL →EXCEL2003 SP3 よく見ると、すでにEXCELのバージョン指定が違う(汗) これが原因かも・・・・(汗) わかる方がいらっしゃったら教えてください。

  • Accessを使ったデータの一括インポートについて

    VBA初心者です。 現在ExcelのデータをAccessにインポートする方法を探しています。 フォルダの構成としては 親フォルダに子フォルダがあり、そのなかにファイルがあります。 例としましては 親フォルダ 子フォルダ ファイル名 A aaaa 1111 B bbbb 2222 C cccc 3333 D dddd 4444 E eeee 5555 F ffff 6666 と言った感じです。 自分なりに調べて1つのフォルダの中にあるデータは全てインポートできそうです。(aaaaフォルダ内等) 現在、親ごとにテーブル分けして一括インポートできる方法を探しています。 現在のコードは Private Sub AAA_Click() Dim dname As String Dim fname As String Dim tblname As String dname = "c:\フォルダ名\" tblname = "テーブル名" fname = Dir(dname & "*.xls") Do While fname <> "" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, dname & fname, True fname = Dir() Loop End Sub これを用いようと考えてます。 ここから子フォルダ内を全て1つのテーブルにまとめるというところでつまづいております。 初心者のためコードも頂けると助かります。 よろしくお願いします。

  • ACCESS エクセル取込 列指定

    下記のコードでエクセル取込を行おうと思いましたが、列指定をする"A:M, O:V"の箇所でエラーとなってしまいました。A:M列だけならエラーもなく取り込めますが、O:V列も取り込みたいです。 N列を取り込みたくない理由としては、文字と数字が混在していて、省きたいと思っております。 何か良い方法はございませんでしょうか? DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_SAPShohin", Path, True, "A:M, O:V" ←エラー ____________________________________________________________________ Private Sub SAPShohin_Click() Dim Path As String Dim Res As String WizHook.Key = 51488399 Res = WizHook.GetFileName(0, "", "", "", Path, "CurrentProject.Path", "(*.xlsx,*.xls)", 0, 0, 4, -1) If Res = 0 Then '取得したファイルパス(Path)でExcelからインポート DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_SAPShohin", Path, True, "A:M, O:V" Else '[キャンセル]ボタンが押された場合の処理 MsgBox "[キャンセル]ボタンが押されました。" Exit Sub End If MsgBox "インポートできました!"

  • ExcelVBAからAccessのモジュールを実行したい

    ExcelVBAからAccessのモジュールを実行したいのですが、 終了した後、タスクマネージャにExcelが残ってしまいます。 ExcelVBAは下記の通りです。 Dim objAccess As Object Dim strAccessPath As String strAccessPath = ThisWorkbook.Path & "\a.mdb" Set objAccess = CreateObject("Access.Application") objAccess.Opencurrentdatabase objAccessPath objAccess.Run "モジュール1" objAccess.closecurrentdatabase objAccess.Quit Set objAccess = Nothing です。 モジュールの内容は、  1.ExcelのシートをAccessにインポート  2.選択クエリでテーブルとの差分を抽出しグループ化  3.クエリをエクスポートする です。 objAccess.Run "モジュール1" をしなければExcelが残らないようなので Run以外の方法でモジュールを実行する方法をご教授ください。 (つたない説明でわかりにくい点あると思います。ご指摘ください)

  • xlsxデータをaccdbに一括インポート

    VBAでxlsデータをmdbに一括インポートする際には下記のように実行していましたが、 OFFICE2010に変更したら使えなくなりました。単純に拡張子をそろえただけではダメらしく、   appAcc.DoCmd.TransferSpreadsheet acImport, 8, 。。。の代わりを教えて頂けませんでしょうか。   Dim appAcc As Object Dim wksAcc As Workspace DoEvents frmMain.lblMsg.Caption = "従業員リストをDBにインポートしています" 'Accessのアプリケーションオブジェクトを作成する Set appAcc = CreateObject("Access.Application") appAcc.OpenCurrentDatabase g_strFilePath & "TimeManagement.mdb" Set wksAcc = CreateWorkspace("test", "admin", "", dbUseJet) appAcc.DoCmd.TransferSpreadsheet acImport, 8, "t_EmpLst", g_strFilePath & g_strEmpLstFileName, True, "A1:G" & g_lngEmpLstLastCnt appAcc.CloseCurrentDatabase wksAcc.Close Set wksAcc = Nothing Set appAcc = Nothing

  • Excel VBA msoAutomationSecurityForceDisableについて

    マクロを無効にしてファイルを読み込むコードを過去レスを見て作成しましたが、msoAutomationSecurityForceDisableを定数でなく、変数としか認識しないため、うまく機能しません。 下記コードのどこを修正すべきか、ご教示願います。 Sub read() Dim DirN As String Dim Fname As String With ThisWorkbook.Worksheets("手当") .Activate .Range(.Cells(7, 1), .Cells(10000, 40)).ClearContents End With Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False DirN = Worksheets("手当").Range("C2").Value & "\" Fname = Dir(DirN & "*.xls") Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Do While Fname <> "" Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False '追加してファイル名を検索する場合はDir関数の引数はなくす。 Fname = Dir() Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Loop End Sub

  • エクセルVBAでBOOKに読み取りパスワード設定

    エクセル2013です。 以下のコードで指定した任意のフォルダ内のエクセルに読み取りパスワードを設定できました。 しかし、そのフォルダの下にサブフォルダーがあった場合にサブフォルダ内のBOOKは対象になりません。どのように直せばサブフォルダも対象にできるようになるでしょうか?教えてください。 Sub TEST01()   Dim myfdr As String, fname As String   Dim mb As Workbook, wb As Workbook   Dim n As Long   With Application.FileDialog(msoFileDialogFolderPicker) '対象とするフォルダの指定      If .Show = True Then       myfdr = .SelectedItems(1)     Else       MsgBox "キャンセルします。"       Exit Sub     End If   End With   Set mb = ThisWorkbook 'このコピー先ブックをmbとする。   fname = Dir(myfdr & "\*.xls*") 'フォルダ内のExcelブックを検索   n = 2   Do Until fname = Empty '全て検索     Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。     With mb.Sheets("Sheet1") '転記       .Cells(n, "B").Value = wb.FullName       .Cells(n, "C").Value = wb.Sheets(1).Range("B1").Value     End With     n = n + 1 'カウント     Application.DisplayAlerts = False     wb.SaveAs Filename:=wb.FullName, Password:="emaxemax"     wb.Close     Application.DisplayAlerts = True     fname = Dir 'フォルダ内の次のExcelブックを検索   Loop '繰り返す   MsgBox n - 2 & "件処理しましました。" End Sub

  • [PG]AccessVBAでファイルのインポートする方法

    [PG]AccessVBAでファイルのインポートする方法 VBAでエクセルファイルのインポートする機能を実装しています。 下記のコードで実行しますと実行時エラー"3011"が表示され DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange で止まります。何か解決方法を教えていただけないでしょうか? Function ExcelDataImport() 'On Error GoTo エラー Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String ' --- Accessテーブルを指定します。存在していなければ自動的に作成します。 varac = "tbl_売上げテーブル" ' ---Excelファイルを指定します。必ず、存在していなくてはいけません。 varxls = "C:\売上げ.xls" ' --- データ入力のシート名とセル範囲を指定します。 ' なお、省略が可能です。省略した場合は、ワークシート全体がインポートされます。 strrange = "売上げシート!A1:D10" strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & _ "へ、データ入力を行います。" & Chr(13) & _ "Excelファイルの入力レンジは、 " & strrange & " です。" ' --- DeleteObjectメソッドを用いて、tbl_売上げテーブルを削除します。 ' --- TransferSpreadsheetメソッドを用いてデータをインポートします。 DoCmd.DeleteObject acTable, varac If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange MsgBox "データ入力は、正常に完了しました。" End If Exit Function

  • Access&VB

    2つほど質問があるのですが、 1.VBからDAOでパスワードがかかっているACCESSに接続する場合に引数はどのように設定したらよいのでしょうか? 2.ACCESSでクエリーを作成し、そのクエリーの結果をエクセルにエクスポートするという処理をやります。 このときクエリーはパラメータを要求します。どこかのタイミングでパラメータをわたせないでしょうか? 具体的にはこんな感じです。 Dim objDb As Object Dim appAccess As Object Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase "パス名\Memo.mdb" appAccess.DoCmd.TransferSpreadsheet 1, 8,"クエリー名","パス名.xls", False,"" もしくは、 appAccess.DoCmd.RunMacro "マクロ名" (マクロの中身は「TransferSpreadsheet」) 分りにくい説明ですが、よろしくお願いします。

  • エクセルテーブルをアクセステーブル取込む

    エクセルで作成したテーブルデータを取り込むときに余分に空白のレコードが取り込まれてしまうんですが原因が分かりません。 下記コードで処理してます。 Dim strac As String Dim strxls As String Dim strrange As String Dim strMsg As String strac = "T_障害票マスタ" 'Accessテーブルを指定します。 strxls = テキスト0 'エクセルファイルを指定します。 strrange = "T_障害票!" 'データ入力のシート名とセル範囲を指定します。 strMsg = "エクセルファイル" & strxls & " を、Accessファイル " & strac & _ "として、データ入力を行います。" & _ "よろしければ、OKをクリックして下さい。" 'MsgBoxのメッセージ If strxls = "" Then MsgBox "ファイルを選択して下さい。" 'テキストボックスの確認 Exit Sub End If 'DoCmd.DeleteObject acTable, strac 'テーブルを削除します。 If MsgBox(strMsg, vbOKCancel, "import") = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _ strac, strxls, True, strrange MsgBox "インポートは、正常に完了しました。" End If Exit Sub なお取り込むテーブルデータはフィールド行を抜かして常に1レコードだけです。 アクセスでは既存のテーブルに保存してます。 詳しい方お願いします。

専門家に質問してみよう