アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも大変お世話になっております。m(_ _)m
質問させてください。

エクセルに存在するデータベースのデータを、アクセスにインポートしたいのですが、アクセス側の「取り込み」みたいなボタンを押せば、ある程度自動的にするような仕組みを作りたいです。
「ある程度」というのは、「ボタン1つですべて実行されるように」というところまで自動化されなくても大丈夫です。
参照先、インポート先のテーブル名などのマウス操作は入っても大丈夫です。

そのようなことができますでしょうか?

できるだけ具体的に教えていただけると助かります。
よろしくお願いします。

A 回答 (4件)

こんにちは。



VBAで、DoCmdオブジェクトのTransferSpreadsheetメソッドでよいのではありませんか?

 DoCmd.TransferSpreadsheet acImport,
      [シートのタイプ],
      [テープル名],
      [ファイル名],
      [Excel側のフィールドを使うかどうか],
      [Excelの範囲]

実際のコード
 DoCmd.TransferSpreadsheet acImport, , "TestTable", "D:\Test.xls", True, "Sheet1!A1:D20"


"Sheet1!A1:D20"
これはなくてもよいです。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
こちらの質問の仕方に不足がありました。

たとえば、エクセルのデータは毎日少しずつ増えていきます。
その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。

頻度はほぼ毎日です。
それを自動化したいのですが、良い方法はないでしょうか?

お礼日時:2005/10/11 16:24

こんばんは。

 #2 のWendy#02 です。

確かに、DoCmd.TransferSpreadsheet acImport では、Append は、無理かもしれませんね。Excel側で、差分を別シートに出して、TransferSpreadsheet acImportなら、出来ますが、Access 側が中心になると、差分は、取り出すことは出来ても、フィールド情報がないので、Append できません。そうすると、私の知っているのは、Adoぐらいしか技術がありませんので、以下のようなものを作ってみました。

Const は、それぞれ入力してください。また、テーブル名・フィールド名は、それぞれ入れてください。本来は、テーブルのレコード数を別に数えるつもりだったのですが、いっしょにしてしまいました。

なお、今回は、テーブルは、一旦閉じないと更新が分りません。

'-----------------------------------------
Option Compare Database
Dim myArVal As Variant
Dim RightCol As Integer
Const Fname As String = "Test.xls" 'Excelブック名
Const ShName As String = "Sheet1" 'シート名
Const RightColA1 As String = "D" '右端の列名

Sub Excel_Apend_ImportSample1()
Dim cn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim mySQL As String
Dim cnt As Long
Dim dbRow As Long
Dim i As Long
 Set cn = CurrentProject.Connection
 mySQL = "SELECT Count(TestTable.フィールド1) as cnt from TestTable"
 rs.Open mySQL, cn, adOpenStatic
 dbRow = rs!cnt
 rs.Close
 Call ExcelOpen(dbRow)
 On Error GoTo RsClose
 rs.Open "TestTable", cn, adOpenStatic, adLockOptimistic
 With rs
  For i = LBound(myArVal, 1) + 1 To UBound(myArVal, 1)
  .AddNew
   !フィールド1 = myArVal(i, 1)
   !フィールド2 = myArVal(i, 2)
   !フィールド3 = myArVal(i, 3)
   !フィールド4 = myArVal(i, 4)
   .Update
  Next i
 End With
RsClose:
 rs.Close: Set rs = Nothing
 cn.Close: Set cn = Nothing
 If Err.Number > 0 Then
  MsgBox Err.Number & " " & Err.Description
  Err.Clear
 Else
 Beep
 End If
End Sub
Sub ExcelOpen(FirstRow)
Dim xlApp As Object
Dim xlshLastRow As Long
Dim xlshAdd As String
 On Error GoTo Quit
'デフォルトの位置にない場合は、ドライブ\フォルダ をつける
 Set xlApp = CreateObject("Excel.Application")
 With xlApp.Workbooks.Open(Fname)
  xlshLastRow = .Worksheets(ShName).Range("A65536").End(xlUp).Row
  'dbのレコード数に+2(フィールド行分+1) ~ Excel の最後の行
  xlshAdd = "A" & FirstRow + 1 & ":" & RightColA1 & xlshLastRow
  myArVal = .Worksheets(ShName).Range(xlshAdd).Value
  .Close
 End With
Quit:
If Err() > 0 Then
 MsgBox Err.Description
End If
xlApp.Quit
Set xlApp = Nothing
End Sub
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
また、返事が遅くなってすみません。

何度もご丁寧な回答をしていただき、本当にありがとうございます。
上記に挑戦してみます。(私自身もVBAには自信がありませんがやってみます)

また分からないことがあったら補足させていただくと思いますので、まだ締め切りませんが・・・

よろしくお願いします。m(_ _)m

お礼日時:2005/10/12 09:52

アクセスに「外部データの取り込み」「インポート」「エクセルファイル」


の「操作」があるのをご存知ですね。
にもかかわらず、「自動的」に拘るのですか。
であればVBAでの処理になると思いますが、質問の書き方からして不安を覚えますが、VBAの回答を、自分の場合に当てはめて、修正はできますか。
>毎日少しずつ増えていきます。その「増えた分だけ」インポートする。
(#1の補足)データを入力した日付はエクセルデータにありますか。その日単位にアクセスに送ってはどうでしょう。
エクセルで日単位にデータを別シートに分けるのはどうするか判りますか。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
また、お返事が遅くなりすみません。

アクセスに「外部データの取り込み」があるのはもちろん知っています。
操作する側の問題で、できたら(いや、確実に)「自動化」したい状況です。

お手数おかけしてすみません。

お礼日時:2005/10/12 09:49

エクセルで作ったデータをCSVで吐き出して、


アクセスでインポートすると理解すればよろしいでしょうか?
アクセスのフォームにインポートボタンを作成してクリックイベントで
VBAが起動するように作ればよいと思います。
詳しくは下記のHPを参考にしてみてください。
http://www.accessclub.jp/bbs3/0067/superbeg25315 …

参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
こちらの質問の仕方に不足がありました。

たとえば、エクセルのデータは毎日少しずつ増えていきます。
その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。

頻度はほぼ毎日です。
それを自動化したいのですが、良い方法はないでしょうか?

お礼日時:2005/10/11 16:23

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