AccessとExcelを連携する|インポート・エクスポート・リンクの使い分け
AccessとExcelを組み合わせる手法を4つ比較。Excelデータのインポート(255列上限・先頭8行での型判定)、リンクテーブル(読み取り専用の制約)、Excelへのエクスポート(マクロ・OLEは出力不可)、Power QueryからのAccess読み込みを実務的に解説します。
4つの連携手法の結論:用途で使い分ける
AccessとExcelを組み合わせる方法は大きく4種類あります。Excel→Accessへのインポート(データをAccessにコピーして取り込む)、ExcelファイルをAccessのリンクテーブルとして参照する、Access→Excelへのエクスポート(クエリ結果やテーブルをExcelに出力する)、そしてExcelのPower QueryからAccessデータを読み込む方法です。
どれが「正解」というわけではなく、「Excelのデータを今後Accessで管理したい」のか、「元のExcelは活かしつつAccessの帳票・クエリ機能を借りたい」のか、「Accessの集計結果をExcelで分析したい」のかで選択が変わります。この記事では各手法の実務上の使いどころと注意点を整理します。AccessとExcelのどちらを選ぶべきかという総論はAccessとExcelの違いで解説しているので、そちらも参照してください。
手法の比較表
| 手法 | データの所在 | Accessでの編集 | 元Excelへの影響 | 向く場面 |
|---|---|---|---|---|
| インポート(Excel→Access) | Accessにコピーが作られる | できる | なし(元ファイルはそのまま) | Excelで管理していたデータをAccessに移行・統合する |
| リンクテーブル(Excel→Access) | Excelファイルに残る | できない(読み取り専用) | なし(編集はExcel側で行う) | Excelに残しつつAccessのクエリや帳票を使いたい |
| エクスポート(Access→Excel) | Excelファイルに出力される | (Excelで編集) | 新規ファイルまたは指定ファイルに書き出す | Accessのクエリ結果をExcelで集計・グラフ化する |
| Power Query(Excel側でAccess読み込み) | Accessに残る | (Excelで読み込むのみ) | なし(Accessは変更されない) | ExcelからAccessのテーブルを定期的に参照・分析する |
ExcelデータをAccessに取り込む(インポート)
インポートはAccessにデータのコピーを作る操作です。元のExcelファイルは変更されません。「外部データ」タブ→「新しいデータソース」→「ファイルから」→「Excel」から操作できます。ウィザードに沿って、取り込むシートまたは名前付き範囲、先頭行をフィールド名として扱うか、新規テーブルまたは既存テーブルへの追加、主キーの設定を順に選んでいきます。
インポートで気をつけるべき点はデータ型の判定です。Accessはインポート時に先頭8行をスキャンして各列のデータ型を自動判定します(Microsoft公式ドキュメントに明記)。先頭8行に異なる型が混在していると、Accessが不適切な型を推定することがあります。混在列ではテキスト型が提案されやすく、その場合、数値も文字列として取り込まれます。また推定された型と互換性のない後続値は欠落・誤変換される場合があります。インポート前にExcel側でセル書式だけでなく、文字列として保存された数値や空白・記号などの実際の値も列単位で統一しておくのが確実です。
また、最大255列までという列数制限があります。それ以上の列を持つシートはそのまま取り込めません。列数が多いExcelファイルを扱う場合は、必要な列だけ名前付き範囲に切り出してからインポートするとよいです。
一度設定したインポート操作は「インポート仕様」として保存でき、次回以降は同じ設定を呼び出すだけで繰り返せます。保存済み仕様はVBAのDoCmd.RunSavedImportExportで再実行できます。仕様を使わず、ファイルパス・テーブル名・範囲などをコードで都度指定する場合はDoCmd.TransferSpreadsheetを使います。
ExcelをリンクテーブルとしてAccessから参照する
リンクテーブルはExcelのデータをAccessに取り込まず、接続だけ作る方法です。元のExcelファイルに更新があれば、Accessのリンクテーブルを開いたときに最新の状態が反映されます。Excelを「元データの正本」として使い続けながら、Accessのクエリや帳票を活用したい場合に向きます。
ただし、リンクテーブルはAccessから編集できません。Microsoftの公式ドキュメントには「リンクテーブルの内容と構造はAccessでは読み取り専用です」と明記されています(import-or-link-to-data-in-an-excel-workbook)。データの追加・変更・削除はExcelファイル側で行う必要があります。
リンクテーブルの実用上の注意点は2つあります。1つは型の揺れです。Excelのセルは入力次第で数値・文字・日付が混在しやすく、リンク時のデータ型判定が崩れると計算クエリが動かなくなります。リンク前にExcel側のフォーマットを列単位で揃えておく必要があります。もう1つはファイルパスの依存です。Excelファイルを移動・リネームするとリンクが切れるため、運用中は「リンクテーブルマネージャー」(外部データタブ)で随時管理します。
なお、対象のExcelブックでセルまたは数式バーが編集中(F2キーや数式バーへの入力中)の状態でリンクしようとすると、Accessは編集モードが終了するまでタイムアウトなしで待機し続けます(Microsoftの仕様)。
AccessのデータをExcelに出力する(エクスポート)
AccessのテーブルやクエリをExcelに書き出すのがエクスポートです。「外部データ」タブ→「Excel」から実行できます。Accessのクエリで集計・加工した結果をExcelに渡し、グラフ作成やピボット分析に使う、という流れが実務では多いです。
エクスポートで出力できるのはテーブル・選択クエリ・フォーム・レポートです。ただし以下のものは出力されません(Microsoft公式:Export data to Excel)。
- マクロ・モジュール(VBAコードはExcelに移せない)
- OLEオブジェクト・添付ファイル・グラフ
- 計算式(結果の値は出力されるが、式自体は出力されない)
- サブフォーム・サブレポート(メインのみ出力、サブは別途操作が必要)
多値フィールドはセミコロン区切りのテキストとして出力されます。出力先のファイルについては注意が必要で、挙動が「書式あり」と「書式なし」で大きく違います。「書式付きでエクスポート」を選んだ場合、既存のExcelブックを指定するとブック全体が上書きされ既存のワークシートがすべて削除されます。「書式なし」ではブックは上書きされず、新しいシートとして追加されます。書式付きでエクスポートするときは新規ファイルへの出力を原則とし、上書きが必要な場合はあらかじめバックアップを取ってください。
インポートと同様、エクスポート操作も仕様として保存して繰り返し実行できます。AccessにVBAを書けば、ボタン操作1つで特定フォルダにExcelを書き出す自動化も可能です。毎月末に集計クエリをExcelに出力する処理を自動化したい場合は、DoCmd.TransferSpreadsheetを使って実装します。
ExcelのPower QueryからAccessデータを読む
逆の方向として、ExcelのPower QueryからAccessのテーブルやクエリを読み込む方法もあります。Excel側で「データ」タブ→「データの取得」→「データベースから」→「Microsoft Accessデータベースから」を選ぶと、Access側のテーブルをナビゲーターで選択してExcelに取り込めます。
Power QueryによるAccess読み込みはImport(取り込み)のみで、Accessファイルを変更する操作はできません(Power Query Access database connector)。Power Query Onlineを使う場合はオンプレミスデータゲートウェイが必要になります。また、Power BI DesktopとAccessデータベースエンジンのビット数(32bit/64bit)が一致していないと接続エラーになる点も注意です。
Power Queryは「更新」ボタンを押せば最新のAccessデータに上書き取得できます。Accessのクエリをデータソースに指定することもできるため、Accessで複雑な集計クエリを作っておいて、Excelではその結果だけを受け取る、という分業も可能です。
定期的な受け渡しの自動化
AccessとExcelの間でデータを定期的に受け渡す業務では、毎回ウィザードを手で操作するのは現実的ではありません。自動化の主な選択肢は2つです。
1つめはAccess VBAでDoCmd.TransferSpreadsheetを使う方法です。引数でTransferType(インポート・エクスポート・リンク)、ファイルパス、テーブル名などを指定します。フォームのボタンクリックで呼び出せば、操作担当者が1クリックで一連の処理を実行できます。
2つめはWindowsのタスクスケジューラとAccessのマクロアクション「ImportExportSpreadsheet」を組み合わせる方法です。タスクスケジューラはユーザーがサインインしていなくても実行できる設定がありますが、Accessを含むOfficeの非対話型無人実行はMicrosoftのサポート対象外であり、ダイアログ待ちや停止が発生するリスクがあります(Microsoft公式:Considerations for unattended automation)。夜間バッチで確実に動かしたい場合は、このリスクを踏まえて設計してください。
受け渡し量が増えてきたら、SQL Serverへのバックエンド移行も検討する価値があります。段階移行の考え方とODBCリンクテーブルの実務を参照してください。現行のAccessが移行できる状態かどうかを確認したい場合は、無料の解析可否チェックからどうぞ。
よくある質問
Q. ExcelをリンクテーブルにするとAccessから行を追加できないのはなぜですか。
Microsoftの仕様上、AccessにリンクされたExcelシートは読み取り専用になります。追加・変更・削除はExcelファイルを直接開いて行い、Access側はそれを参照するだけです。どうしてもAccess側からデータを書き込みたい場合は、リンクではなくインポートしてAccessのテーブルに持ってくる必要があります。
Q. インポートしたデータが数値ではなくテキストになってしまいます。
Accessがインポート時に先頭8行をスキャンして型を判定するためです。先頭8行に異なる型が混在していると不適切な型が推定されることがあり、混在列ではテキスト型が提案されやすくなります。その場合、数値も文字列として取り込まれます。セル書式を「数値」に変えるだけでは不十分で、文字列として保存された数値(Excelが左揃えで表示している数値)や空白・記号も除去する必要があります。ウィザードのフィールドプロパティ画面で型を手動で変更することもできますが、根本はExcel側のデータを統一することです。
Q. エクスポートしたExcelにVBAの計算式を含めて出力できますか。
できません。Accessのエクスポートで出力されるのは、クエリや計算フィールドの結果値です。Excelの計算式(SUM関数など)は出力されません。計算ロジックをExcelに持ち込みたい場合は、エクスポート後にExcel側でマクロや数式を追加する形になります。
Q. Power QueryでAccessデータを読み込むとき、Accessが起動しますか。
起動しません。Power QueryはACE OLEDBプロバイダーを使ってAccessファイルに直接アクセスするため、Accessアプリケーション自体は不要です。ただし、ACE OLEDBプロバイダー(Access Database Engine)がPCにインストールされている必要があります。Microsoftの公式ドキュメントではPower BI DesktopとACE OLEDBプロバイダーの32bit/64bitビット数が一致していないと接続エラーになると明記されており、ExcelからAccess接続を使う場合も同様にビット数の不整合が原因になり得ます(Power Query Access database connector)。
触れないAccessが「診断できるか」だけ、確かめませんか。
顧客データは送信不要。発注の義務もありません。
約2分・ファイル送信不要・発注義務なし/説明はオンライン・売り込みはしません