質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

7744閲覧

Access VBAでインポートした際にデータが全て取込まれない

syncrock

総合スコア209

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/01/29 00:24

TransferSpreadsheetのacExportで出力したExcelファイルに1行追加し、
acImportでインポートしたときに追加した行がインポートされません。
例えば、10行のデータを出力しヘッダー込で11行がExcelに出力され、
12行目に新しくデータを追加してもインポート時は10行しか取込まれていません。
インポート時は

vba

1DoCmd.TransferSpreadsheet acImport, 10, テーブル名, ファイル名, True, シート名

で実行しており、特に何もおかしなことはしていないのですが、ピンと思い当たる方いませんでしょうか。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

第6引数ですがExcelの範囲名を指定していませんか?シート名は最後に「!」をつける必要があったと思います。

投稿2019/01/29 01:11

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2019/01/29 01:48

回答ありがとうございます。 ご指摘通り、シート名の最後に「!」をつけることで正常に取り込まれました。 特に範囲指定しておらずシート名だけの記載だったのですが、!をつけないといけなかったのですね。。。
guest

0

第6引数で「シート名」を指定していますが、この引数は厳密には「シート名」を指定するのではなく「範囲(Range)」を指定する引数です。

最初にAccessからExportした際、Excelに出力したテーブル名のシートが作成され、そこにデータが出力されます。
それに加え、そのデータ範囲がExcelの「名前」にも追加されています。

例えば"DATA_01"テーブルから5列10行のデータを出力した場合、
・「DATA_01」シートにヘッダ込み11行のデータが出力される。
・「DATA_01!$A$1:$E$11」のデータ範囲が「DATA_01」という「名前」で追加される。
⇒「数式」タブの「名前の管理」で確認できます。

このシートからデータを取得する際に「DATA_01」という範囲を指定すると、シート名としての「DATA_01」よりも先に「名前」の「DATA_01」が優先して参照されるため、範囲が絞られたインポートになってしまいます。

回避策

回避策は
・「名前」としての「DATA_01」を削除する、または範囲拡張する
・Importの引数をシート名として判断させる
といったところでしょうか。

今回の場合はAccessVBAでの制御だと思いますので、前者のようにExcel側のデータをゴリゴリやるのは面倒かもしれません。

後者であれば、sousukeさんのアドバイスにある通り
DoCmd.TransferSpreadsheet acImport, 10, "Access側テーブル名", "Excelファイル名", True, "シート名!"
のような形式で明示的に指定できます。

参考になれば幸いです。

投稿2019/01/29 02:23

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2019/01/29 02:25

入れ違いですでに解決済みされていたようですね。よかったです。
syncrock

2019/01/29 02:44

回答ありがとうございます。 仰るとおりでした、名前の管理でシート名と同名の定義が作成されており、その範囲をみたものと思います。 範囲を指定することは認識しておりましたが、シート名を指定した場合はそのシートを対象に見る。と思ってました。 また、名前が定義されていることは完全に認識外でした。 とても勉強になりました、ありがとうございます。
guest

0

TransferSpreadsheetのacExportで出力したExcelファイルに1行追加し、

「この1行追加し」というのはユーザーがExcelファイルを開いて1行入力したということですか。それとも、VBAで追加したということでしょうか。
VBAで追加したのなら、そのコードも提示してください。

また、提示のコードは第2引数を数値で指定してますが、ここは名前付き定数で指定するようにしましょう。提示する場合はできる限り実際にものに近い形で提示してください。質問用に編集すると実際のコードに間違いがあっても指摘できません。

例えば、下記のように。

vba

1DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _ 2"t_個人情報", "c:\test\t_個人情報.xlsx", True, "Sheet1!"

ちなみに、シート名の最後の ! を省略しても問題なくインポートできるようです。
当方の実験ではできましたが、できないこともあるようですね。
実験コードを見直したら、!を付けてました。

投稿2019/01/29 02:00

編集2019/01/29 04:43
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2019/01/29 02:17

回答ありがとうございます。 >「この1行追加し」というのはユーザーがExcelファイルを開いて1行入力したということですか。それとも、VBAで追加したということでしょうか。 →「ユーザーが出力したファイルを開いて、1行入力した。」ということです。 >また、提示のコードは第2引数を数値で指定してますが、ここは名前付き定数で指定するようにしましょう。 →こちらについてはコードそのままであり、数値で指定しておりました。  ただし、「シート名」とかは変数だったりしますのでマスクするなど実際のコードになるように以後気を付けます、ご指摘ありがとうございます。 >当方の実験ではできましたが、できないこともあるようですね。 →インポート自体は出来ますが追加した行が「!」が無いときは取込めず、「!」がある時は取込めており、問題は解決しましたが結局何がいけないのかがはっきりしませんね。。 本当に何も特別なことはしてない(つもり)なのですが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問