No.7ベストアンサー
- 回答日時:
ANo.6で書き落としていましたが、アクセスからエクセルを操作するには、参照設定でMocrosoft Excel 11.0 Object Libraryも参照する必要があります。
また、エクセルからテーブルをインポートする際、同名のテーブルが存在するとエラーになります。このような場合、On Error Goto文を記載し、エラーとして、Err.Number=3012の場合、Docmd.DeleteObject acTable, "ExcelTemp" を実行し、インポート文の前にResumeさせます。これで、既存テーブルがある場合でも、問題なく実行できます。
No.6
- 回答日時:
(2)について検討してみました。
インポートする範囲は、その都度変化すると考えられます。従って、毎回、データの入力されている最後尾の行列位置を検出する必要があります。この点を考慮してコードを作成してみました。ANo.2の続きです。
Dim MyRow As Variant, MyColumn As Variant, SheetName As String
Set XLAPP = CreateObject("Excel.Application")
Set XLWB = XLAPP.Workbooks.Open(strFileName)
Set XLWS = XLWB.Worksheets(1)
With XLAPP
MyRow = .ActiveCell.SpecialCells(xlLastCell).Row '最後尾セルの行数取得
MyColumn = .ActiveCell.SpecialCells(xlLastCell).Column '最後尾セルの列数取得
End With
SheetName = XLWS.Name 'シート名の取得
ActiveWorkbook.Names.Add Name:="MyData", RefersToR1C1:= _
"=" & SheetName & "!R2C1:R" & MyRow & "C" & MyColumn 'データ範囲にMyDataという名前を付ける。
XLWB.Save 'エクセルブックを保存する。
XLAPP.Quit 'エクセルを終了する。
Set XLAPP = Nothing
Set XLWB = Nothing
Set XLWS = Nothing
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "ExcelTemp", strFileName, False, "MyData" '名前がMyDataの範囲をテーブルExcelTempにインポートする。
次に、インポートされたExcelTempテーブルのフィールド1、フィールド2・・・を目的のテーブルへ追加する追加クエリーを実行します。夫々のフィールドが目的のテーブルのフィールドに一致するよう作成します。
この時、ダブってインポートしてしまうケースを防止する対策を取っておく方が安全です。事前に、すべてのフィールが一致するデータが登録されていないか確認するクエリーを作成し、確認する必要があります。一致するデータがある場合、警告を表示させるようにするといいと思います。
No.5
- 回答日時:
No.3 です。
No.4 さんの書かれたとおり、Docmd.TransferSpreadsheet ...を使うとよろしいと思います。
Visual Basic のヘルプに載っておりますので(VBエディタのヘルプから参照できます?よね)、
詳しくはそれを見ていただくとしまして、TransferSpreadsheet メソッドの引数に“hasfieldnames”
というのがあります。その値をTrueにすれば、開いたワークシートの1行目はテーブルのフィールド名
として扱うようになりますので、2行目以降がデータとして認識されます。
例) Docmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "T_商品", _
"C:\Data\Shouhin.xls", True, "Sheet2!A1:G5"
最後の引数部分がワークシートの範囲を指定するところですが、範囲指定省略もできます。
自分のマシン(Access & Execl 2000)では省略すると、第1番目のワークシート全てを取り込む
ことが出来ました。
私の場合、最後の引数を "Sheet3" として実行するとエラーがでましたが、名前の最後に
イクスクラメーション(!)を付けると("Sheet3!")、正しくそのワークシート名の全てのデータ
を取得しました。
No.4
- 回答日時:
(2)ですが、エクセルの一行目は、どのようなデータが入っているのでしょうか?
貼り付けたいテーブルのフィールド名と一致しているのであれば、指定したエクセルファイル名でインポートし、そのテーブルを使用して追加クエリーを作成すればよいと思います。
フィールド名に相当するデータが入っていないのであれば、エクセルでコピーしたい範囲に名前を付けて、この範囲名を指定してインポートして、追加クエリーを実行する事になります。
インポートは、DoCmd オブジェクトの TransferSpreadsheet メソッドで行います。
回答ありがとうございます。
エクセルの1行目は項目が入っております。
しかし、貼り付けたいテーブルのフィールド名とは一致しておりません。(特に項目名についてはこだわりがないので、エクセルの項目名とテーブルのフィールド名を一致させることはできます。)
大変恐縮ですが、「インポートは、DoCmd オブジェクトのTransferSpreadsheet メソッドで行う方法」を具体的に教えて頂けないでしょうか?
勤務先でしかアクセスができないので、No2で回答して頂いたやり方はまだ実践していません。明日やってみます。
よろしくお願いします。
No.3
- 回答日時:
こんばんは。
以下のホームページが参考になるかと思います。
私も勉強&はげみになっております。
「Microsoft Access Club」
http://www.accessclub.jp/samplefile/samplefile_1 …
http://www.accessclub.jp/samplefile/samplefile_1 …
回答ありがとうございます。
早速参考リンク先を拝見しました。
勤務先でしか、アクセスができないので、まだ実践しておりませんが、明日やってみたいと思います。
回答者様に教えて頂いた方法で「2行目からデータが入っている行までコピー」という方法はできるのでしょうか?
大変恐縮ですが、よろしくお願いします。
No.2
- 回答日時:
(1)ファイル名を指定して、エクセルファイルを開く。
vb Editor 参照設定でMicrosoft Office 12.0 Object library にチェックを入れます。
新規モジュールを作成し、
Option Compare Database
Option Explicit
Public Function ExecFileDialog(intMode As Integer) As Variant
Dim fd As FileDialog
Dim varSelItems As Variant
Set fd = Application.FileDialog(intMode)
fd.AllowMultiSelect = False
If fd.Show = -1 Then
For Each varSelItems In fd.SelectedItems
ExecFileDialog = varSelItems
Next
Else
ExecFileDialog = Null
End If
Set fd = Nothing
End Function
と入力します。
適当なフォームにコマンドボタンを作り、
Dim strFileName as Variant
Dim XLAPP As Excel.Application
Dim XLWB As Excel.Workbook
Dim XLWS As Excel.Worksheet
strFileName = ExecFileDialog(msoFileDialogFilePicker)
If IsNull(strFileName) then
MsgBox "ファイルが指定されていません!"
Exit Sub
End If
Set XLAPP = CreateObject("Excel.Application")
Set XLWB = XLAPP.Workbooks.Open(strFileName)
Set XLWS = XLWB.Worksheets(1)
XLAPP.Visible = True
XLWS.Select
XLWS.Visible = True
のようにクリック時イベントプロシージャを作成します。
これで、ファイルダイアログでファイル指定し、エクセルでそのファイルを開き、画面に表示されるはずです。(2)まで完全に自動で行うなら、エクセルを表示する必要はありませんが。
(2)は、後ほど回答できると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) エクセルでのアクセス履歴をとりたいです 1 2022/06/13 17:30
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Visual Basic(VBA) Outlook VBAについて 1 2023/07/10 12:41
- Visual Basic(VBA) Excel VBA リンク更新について A、B、Cのファイルかあります。 (Aファイルのリンク元Bフ 1 2022/09/21 13:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access2019でフォームから入力...
-
Accessでボタンを押したらエク...
-
エクセルからアクセスにインポ...
-
ACCESS テーブルに2行目から取...
-
DataGridViewでの変更保存
-
ACCESSのVBAを利用して、Excel...
-
グループ単位にCSVファイル...
-
ExcelVBAにて外部データ(*.csv...
-
アクセス初心者に注意点を教え...
-
jspのプログラムについて
-
INDEXの無効化
-
異なるスキーマからデータを抽...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
datapumpの実行方法について
-
SQLでスキーマ名(所有者名)の...
-
INSERT時に発番を行いたい
-
[性能改善]AccessのDBに大量の...
-
テーブルからのselectにおいて...
-
oracle sqlで先頭の1件を取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルからアクセスにインポ...
-
他ファイルのテーブルの情報を...
-
ACCESS テーブルに2行目から取...
-
C#でaccdbファイルのテーブルの...
-
(ACCESS)複数mdbからのデータ...
-
データ読込時のタイムアウト
-
Accessでボタンを押したらエク...
-
テーブルのリンク(ACCESS)
-
アクセスマクロで、csv データ...
-
画面から入力した値がDBに登録...
-
jspのプログラムについて
-
アクセス初心者に注意点を教え...
-
グループ単位にCSVファイル...
-
VBでCSVデータをMDB
-
Access2019でフォームから入力...
-
VBSのデータベース操作で、複数...
-
ACCESS 2003では、テーブルのリ...
-
ExcelVBAにて外部データ(*.csv...
-
ACCESSとエクセルのリン...
-
EXCELで帳票フォームをつくりそ...
おすすめ情報