ACCESS VBA Excelインポート時に「F1フィールドがありません」
ACCESSにはExcelのデータをインポートして利用する機能があります。
VBAでExcelファイルをインポートする際、「F1フィールドがありません」というエラーメッセージが表示されることがあります。
今回は、「F1フィールドがありません」エラーの対処方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
目次
「F1フィールドがありません」のエラー
ACCESSでVBAを使ってExcelファイルをインポートすると、以下のようなエラーが表示されることがあります。
結論から言うと、これはTransferSpreadsheetメソッドの引数であるHasFieldNames、つまりインポートするExcelファイルの1行目をフィールド名として利用するか否かの設定が正しく行われていないために発生するエラーです。
Excelファイルの1行目に、ACCESSの取込先テーブルのフィールド名と全く同じ名前の項目業を作成し、TransferSpreadsheetのHasFieldNamesをTrue (1) に設定すれば回避できます。
TransferSpreadsheetメソッド
ACCESSでVBAを使ってExcelファイルの取込を行う場合は、TransferSpreadsheetメソッドを利用します。
TransferSpreadsheetは以下の構文で使用します。
TransferSpreadsheet (変換型, Excelファイル形式, ACCESSのテーブルの名称, Excelのファイル名, 最初の行をフィールド名として扱うか否か, Excelのセルの範囲)
今回のエラーの原因はこの5つめの引数「最初の行をフィールド名として扱うか否か」の指定不備が原因です。
この引数は、インポートまたはリンクするときにフィールド名としてワークシートの最初の行を使用するには、True (1) を使用します。
ワークシートの最初の行を通常のデータとして扱うには、False (0) を使用します。
この引数を空白にすると、既定値 (False) と見なされます。
サンプルデータでの検証
ここからは詳しく内容を見ていきます。
今回は以下のサンプルデータを準備しました。
インポートするExcelファイル
最初にインポートするExcelファイルです。
売上の情報を一覧化したデータになっています。
インポート先のACCESSのテーブル
インポート先として、ACCESSに「TMP_売上」というテーブルを作成しました。
データは入っていませんが、フィールドの名前と並び順はExcelファイルと同一になっています。
インポート処理を行うフォーム
インポート処理を行うフォームとして、以下を作成しました。
インポートボタンにはクリック時イベントに、以下のイベントプロシージャが設定されています。
Private Sub インポート_ボタン_Click()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TMP_売上", getFileName("")
End Sub
TransferSpreadsheetメソッドを使って、ExcelファイルをTMP_売上にインポートするプロシージャです。
4つ目の引数に指定しているgetFileName(“”)はインポートするExcelファイル名を取得するための別プロシージャです。
ここでは、ファイル名がここに入ると思っていてください。
エラー原因
この状態でイベントプロシージャを実行すると、冒頭の「F1フィールドがありません」が発生します。
それは、5つ目の引数を指定していないからです。
5つ目の引数は省略するとFalse、つまりインポートするExcelファイルの最初の行をフィールド名として扱わないことになります。
それなら単純にテーブルの1レコード目にExcelの項目行がインポートされるだけでは?と思うかもしれません。
ここにもう一つの問題があります。
ACCESSでは、Excelインポート時に1行目をフィールド名として扱わない場合、自動的にF1、F2、F3 … というフィールド名を設定してしまうのです。
そのため、ACCESSのテーブル側(今回でいうTMP_売上)のフィールド名がF1、F2、F3でないと、インポートするExcelファイルの項目名とインポートされるACCESSのテーブルのフィールド名が不一致になってしまうのです。
だから、エラーの内容が「F1フィールドがありません」なのです。
これは、インポートするExcelファイルの1列目はF1という項目名だけど、ACCESSのテーブルにはこのフィールドがありませんよ、というメッセージなのです。
これを回避するには以下を実施しましょう。
TransferSpreadsheetメソッドを使う時は、5つ目の引数はTrueを指定する
インポートするExcelファイルの1行目の項目名と、インポート先のACCESSのテーブルのフィールド名を合わせる
これを守っておくことで、不要なエラーに悩まされることもなくなります。
以上、Excelインポート時に「F1フィールドがありません」のエラー対処方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。