Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2016)
ヘッダーなしでテキストファイルを取り込みたいです
投稿日時: 21/02/22 18:36:52
投稿者: myzkktht

 
いつもお世話になっております。
 
ACCESSにてテキストファイルを取り込み、件数をメッセージボックスで表示、
1行目はヘッダーなので取り込まないようにしようとしているのですが、
 
HasFieldNamesでFalseを指定しているのですが、ヘッダーが取り込まれます。
 
また、件数表示が実際は1000件ほど取り込んでいるのですが、「0件を
取り込みました」と表示されてしまいます。
 
具体的な対応策がわからず困っております。ぜひご教示のほど、よろしくお願いします。
 
 
Private Sub コマンド43_Click()
Dim ファイル名 As String
Dim cnt As Long
ファイル名 = "C:\ファイル名.csv"
DoCmd.TransferText acImportDelim, , "取込テーブル", ファイル名, False
MsgBox "ファイル名データから「" & cnt & "件」を取り込みました"
End Sub

回答
投稿日時: 21/02/22 22:50:23
投稿者: よろずや

>HasFieldNamesでFalseを指定しているのですが、ヘッダーが取り込まれます。
 
HasFieldNames ←ヘッダがある
ですから True を指定しましょう。
 
>「0件を取り込みました」と表示されてしまいます。
 
件数を取得する処理が何も書かれていません。

投稿日時: 21/02/23 10:26:52
投稿者: myzkktht

ご回答ありがとうございます。
Trueを指定したところ、「〇〇がみつかりません」というエラーとなって
しまいました。
これは、定義を作っておかなければいけないということでしょうか。
ヘッダーにブランク行があり、ヘッダー有で取り込むとヘッダー部分の
取込エラーとなり、ヘッダー無しで取り込みがしたいというのが目的に
なります。
 
お手数ですがご教示のほど、よろしくお願いします。
 
※定義を呼び出す形にする。
集計については取り込んだテーブルのデータ数をカウントするようにできました。
cnt = DCount("*", "取込テーブル ")
 
 

よろずや さんの引用:
>HasFieldNamesでFalseを指定しているのですが、ヘッダーが取り込まれます。
 
HasFieldNames ←ヘッダがある
ですから True を指定しましょう。
 
>「0件を取り込みました」と表示されてしまいます。
 
件数を取得する処理が何も書かれていません。

回答
投稿日時: 21/02/23 22:39:35
投稿者: よろずや

>ヘッダー無しで取り込みがしたいというのが目的になります。
 
ヘッダーが有るのに False 指定にすると、
ヘッダー部の読み込みでエラーになるはず。
読み込みエラーの内容が別テーブルに記録されます。
そのテーブルを無視すればよろしいかと。

回答
投稿日時: 21/02/24 12:10:35
投稿者: Suzu

引用:
1行目はヘッダーなので取り込まないようにしようとしているのですが、
 
HasFieldNamesでFalseを指定しているのですが、ヘッダーが取り込まれます。

 
DoCmd.TransferText メソッド (Access)
https://docs.microsoft.com/ja-jp/office/vba/api/access.docmd.transfertext
 
HasFieldNames
引用:
インポート、エクスポート、またはリンクするときにフィールド名としてテキスト ファイルの最初の行を使用するには、True (1) を使用します。 テキスト ファイルの最初の行を通常のデータとして扱うには、False (0) を使用します。 この引数を空白にすると、既定値 (False) と見なされます。 Microsoft Word の宛名の差し込みデータ ファイルの場合は、この引数は無視され、最初の行には常にフィールド名が含まれます。

 
判りづらいかも知れませんが、
ファイルの最初の行にヘッダーが含まれている場合に
 True を指定すると、最初の行を フィールド名 と見立ててインポートを行います。
 
 False を指定すると、最初の行も データ と見立ててインポートを行おうとします。
   この場合、通常はフィールド名は文字列型になりますよね?
   フィールドのデータ型が 数値型 の場合、文字列を入れようとしますからエラーとなり
   別にエラーテーブルが生成され、その行のデータが取り込めなかった事が記録されます。
   フィールドのデータ型が 文字列型 の場合は、エラーとはなりませんが、
    ヘッダーがデータとして インポートされる事になります
   ですので、ヘッダーがデータとして取り込まれる結果となります。
 
ヘッダーを 読み込まない目的で指定するのではありません。
 
 
引用:
ヘッダーにブランク行があり、ヘッダー有で取り込むとヘッダー部分の
取込エラーとなり、ヘッダー無しで取り込みがしたいというのが目的に
なります。

ヘッダーはフィールド名ではない と言う事でしょうか?
ブランク行 とは何でしょうか?
半角スペース で埋まっている行 なのでしょうか?
 
理解できていませんが、『とにかく1行目を取り込みたくない』 と言う話なら
私なら、1行目除いたファイルを別に生成し、そちらを取り込みます。
 
よろずやさんのおっしゃる様に、エラーテーブルを無視すれば問題ないのでしょうが、
処理を複数繰り返す場合、
  ・エラーテーブルが増え続ける事となり、エラーテーブルの内容を確認しなくなる可能性が高くなり
  ヘッダー以外の問題で取り込めない問題が発生した場合に気づきにくい
 ・エラーテーブルを都度削除する様にVBAで組む事は オブジェクトを頻繁に変更する事になり
  ファイル破損の可能性が高くなると思っているので避けたい
 
なので、私が 定常的に処理するのであれば、事前に1行目を除く処理を組み込みます。
 
 
簡単なのは、
for /f "skip=1" %%i in ('type C:\TEST.txt') do @echo %%i >> C:\New_TEST.txt
 
の様なバッチファイルにて処理するのですが、
バッチとの処理が終わらないうちにインポートが進まない様にする必要があります。
(APIを使って、バッチ終了まで待機の方法もあります そちらは ご自身で検索してみてください)
 
VBAのみでファイルを開き別ファイルを生成の方が難易度は低いでしょう。
https://www.moug.net/tech/acvba/0090005.html
https://www.moug.net/tech/exvba/0060089.html
https://www.moug.net/tech/exvba/0060086.html
 
あたりが参考になるでしょう。
 
 
VBAによる固定長CSVファイル取込方法について
https://www.moug.net/faq/viewtopic.php?t=80276
にておっしゃっていた、ユーザー定義型 を使用する 前段のファイル読み取りの処理です。

トピックに返信