電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

こんばんは。



現象は確認しました。
 .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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/08 12:09

こんにちは。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/03/15 12:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!