先ほども、似たような質問をさせて頂いたのですが、おおもととして、質問していた、textファイルのインポート自体は出来るようになりましたので、
質問を絞って再度、ご質問させて下さい。
textファイルをインポートすると、”データ型の変換エラーが発生しました。”と出ます。
それは、textファイルに、他の行とは違う桁数の、余分な行(先頭行と最終行)があるからです。
先に、textファイルを開き、削除して行えば、問題ありませんが
出来れば、何も編集せずにアクセスで、何行目から何行目までを取り込む。と言った物にしたいです。
csvなどは、簡単に設定できるようですが、textも出来るのでしょうか?
ちなみに、今の構文を書いておきます。
どちらに、その構文を追加すれば、いいのかまで、教えていただけると大変助かります。

Private Sub コマンド64_Click()
Dim strLine As String
Dim dbs As Database
Dim rst As Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("支払明細")
Open CurrentProject.Path & "\支払明細.txt" For Input As #1
Do Until EOF(1)
Line Input #1, strLine
strLine = StrConv(strLine, vbFromUnicode)
With rst
.AddNew
!旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode)
!指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode)
!種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode)
!数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode)
!単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode)
!請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode)
.Update
End With
Loop
Close #1
rst.Close
MsgBox "インポートを終了しました。"
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>早速、chie65536さんの書いてくださった構文を追加して実行してみました。


>しかし、何故か、取り込めませんでした。

If MidB$(strLine, 1, 1) = "D" Then

If MidB$(strLine, 1, 1) = StrConv("D",vbFromUnicode) Then

If StrConv(MidB$(strLine, 1, 1),vbUnicode) = StrConv("D",vbUnicode) Then
に修正して下さい。

比較式の左辺の文字列が「vbFromUnicode」になっているので右辺も「vbFromUnicode」にする、または、両辺を「vbUnicode」にする、と言う処理を忘れていました。

StrConvした文字列は、「"」で囲った文字列と、文字コード体系が異なるのでした。
    • good
    • 0
この回答へのお礼

すごいっ!!出来ました!(^^)!
感謝しております。本当にありがとうございました。

お礼日時:2007/03/14 14:01

次の FileReadNRow関数で指定行を読み込むことが出来ます。



1,AAAA
2,BBBB
3,CCCC

? FileReadNRow("C:\TEMP\Test.txt", 2)
2,BBBBB

Public Function FileReadNRow(ByVal FileName As String, ByVal N As Integer) As String
On Error GoTo Err_FileReadNRow
  Dim I  As Integer
  Dim fso As FileSystemObject
  Dim fil As File
  Dim txs As TextStream
  Dim TEXT As String
  
  Set fso = New FileSystemObject
  Set fil = fso.GetFile(FileName)
  Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)
  For I = 1 To N
    TEXT = txs.ReadLine
  Next I
  FileReadNRow = TEXT
Exit_FileReadNRow:
  Exit Function
Err_FileReadNRow:
  Resume Exit_FileReadNRow
End Function

Microsoft Scripting Runtime を参照する必要があります。

これを、工夫するか、

For I = S To N
  strData=FikeReadNRow(I)
  ・・・・
NEXT I

という風に利用するか・・・。

この回答への補足

アドバイスありがとうございます。
しかし、ド素人の私では理解不可能です。
取り込みたい行を1行だけ指定するのではなく、何行から何行と言った風にもできるのでしょうか??

補足日時:2007/03/14 10:52
    • good
    • 0

こういうテキストファイルは、たいてい



1桁目が1で始まるスタート行
1桁目が2で始まる明細行の1行目(1ブロック目)
 |
1桁目が2で始まる明細行の最終行(1ブロック目)
1桁目が8で始まる合計行(1ブロック目)
1桁目が2で始まる明細行の1行目(2ブロック目)
 |
1桁目が2で始まる明細行の最終行(2ブロック目)
1桁目が8で始まる合計行(2ブロック目)
1桁目が9で始まるエンド行

のようになっている筈です。テキストファイルの構造を良く確かめて下さい。

で、1行の中のどこかの桁に「この行は取り込むべき明細行である」と言う目印があった時だけ、データを取り込むように作りましょう。

「明細行は先頭1文字が『2』の時のみ」と仮定した場合、以下のようにif文を追加します。

Do Until EOF(1)
Line Input #1, strLine
strLine = StrConv(strLine, vbFromUnicode)
if MidB$(strLine, 1, 1) = "2" then '先頭1文字が「2」の時のみ明細行
With rst
.AddNew
!旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode)
!指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode)
!種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode)
!数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode)
!単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode)
!請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode)
.Update
End With
end if '追加したif文の終り
Loop

なお「ちゃんと処理する」と言う視点から見ると「テキストファイルに合計行があるなら、読み込んだ明細行の合計と、合計行に書かれた合計が正しいかチェックする」とか「テキストファイルの特定の行の特定の桁に固定の数字や文字が入っているなら、その位置にその固定の数字や文字があるかチェックする」と言う処理も必要です。

こういうチェックをちゃんとしないと
「1万件のデータを読み込ませた後で、全然違う構造の全然違うテキストファイルを間違って読み込ませた事に気が付いた。元のデータは間違って読んだテキストファイルのデータで上書きされて元に戻せない。1万件のデータを伝票から全件手入力するハメに」
「途中で切れたファイルを読みこませたらしく、合計金額が合わないのに誰も気付かない。誰かが気付いた時には全データを全部の伝票と照らし合わせないとならない」
「修正したファイルを読み込ませたつもりが、間違って古いのを読み込ませ、合計金額が合わないのに誰も気付かない。誰かが気付いた時には全データを全部の伝票と照らし合わせないとならない」
なんて事が起きます。

「チェックもしないで、それがそこにある筈」と言う作り方をするのは「アマチュアが家庭で使う自作プログラム」だけにしましょう。

この回答への補足

ありがとうございます。
このPGは、私が使用するだけで、元々目視で行っている、チェックにプラスアルファでやろうと思っているだけなので、
chie65536さんの心配して下さっているような事はありません。
これから、もっと勉強して、人にも使って貰えるような物が作れるようになればいいですが。。。
ちょっと私の脳ではついていけない感じです。なんて言っても、ド素人なので^_^;

早速、chie65536さんの書いてくださった構文を追加して実行してみました。
しかし、何故か、取り込めませんでした。
エラーは出ずに、インポート終了しました。と出ました。
インポート先のテーブルがおかしいのでしょうか?

取込たいデータの仕組みは、chie65536さんの言うとおり
見分けがつき、下記のような感じです。
B** ***
D********** ********
D********** ********
T** ***** *****
Dで始まる行だけを取込みたいです。

テーブルの、項目は、
ID オートナンバー
旧請求年月日 数値型
指定伝票番号 数値型
種類 テキスト型
数量 数値型
単価 数値型
請求金額 数値型
です。

修正後の構文は
Private Sub コマンド64_Click()
Dim strLine As String
Dim dbs As Database
Dim rst As Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("支払明細")
Open CurrentProject.Path & "\支払明細.txt" For Input As #1

Do Until EOF(1)
Line Input #1, strLine
strLine = StrConv(strLine, vbFromUnicode)
If MidB$(strLine, 1, 1) = "D" Then
With rst
.AddNew
!旧請求年月日 = StrConv(MidB$(strLine, 14, 6), vbUnicode)
!指定伝票番号 = StrConv(MidB$(strLine, 20, 7), vbUnicode)
!種類 = StrConv(MidB$(strLine, 64, 8), vbUnicode)
!数量 = StrConv(MidB$(strLine, 84, 5), vbUnicode)
!単価 = StrConv(MidB$(strLine, 89, 7), vbUnicode)
!請求金額 = StrConv(MidB$(strLine, 96, 11), vbUnicode)
.Update
End With
End If
Loop
Close #1
rst.Close
MsgBox "インポートを終了しました。"
End Sub
です。

お手数ですが、再度、ご教授お願いいたします。

補足日時:2007/03/14 10:51
    • good
    • 0

> strLine = StrConv(strLine, vbFromUnicode)



> !~ = StrConv(MidB$(strLine, ~, ~), vbUnicode)
の部分で、気になってるのですが・・・

・OSとAccessのバージョンは何ですか?
・「支払明細.txt」の文字コードは何で出力されてきてますか?

Accessは、2000以降Unicodeが標準とされ、Windowsは、XP以降(2000も、そうだっけ?)、Unicodeが標準となってます

要するに、最初のvbFromUnicodeでシステム既定の文字(Unicode)に変換してあるのでは?と思ったりしているのですが・・・UnicodeをMIDBで、切れば文字としてしか扱えず、自動的に型の変換が出来なくて、
> ”データ型の変換エラーが発生しました。”
が、起こってるのでは?と思ったりしたのですが・・・

この回答への補足

アドバイスありがとうございます。
WINDOWS XP のACCESS2003です。
なんせ、素人ですので、文字コードが何で、出力されているのか、わからないのですが
1行目と最終行だけ、データの形式が違うと言うか、空白の数が違い
それを、テキストで開いて、先に削除してしまってから、取り込めばうまくいきました。

補足日時:2007/03/14 10:31
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS テーブルに2行目から取り込む方法

Access2013で、
指定の場所に置いてあるCSVファイルに対して、
「リンクテーブルを作成してソースデータにリンクする」設定にてテーブルを作成し、
このCSVファイルが更新されても最新の状態にてレポートを出力できるようにしています。

しかしこのCSVデータが作成される仕様により、1行目に余計な文字列、2行目に項目名、3行目以降にデータが入っているため、毎回CSVデータの1行目を削除する手作業が発生しています。
2行目以降をリンクするようにするとか、テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?

Aベストアンサー

>2行目以降をリンクするようにするとか、
>テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?
D:\ナントカ\コントカ\オリジナル.csv
に余計な一行があったとして下記のコードを標準モジュールに作成し

Sub LineCut1()
Dim fSo As Object
Dim buf As Variant
Dim f As Object
Set fSo = CreateObject("Scripting.FileSystemObject")

With fSo.GetFile("D:\ナントカ\コントカ\オリジナル.csv").OpenAsTextStream
.SkipLine
buf = .readall
.Close
End With

Set f = fSo.OpenTextFile("D:\ナントカ\コントカ\オリジナル_改.csv", 2, True)
f.Write buf
f.Close
End Sub

出来た"D:\ナントカ\コントカ\オリジナル_改.csv"をリンクテーブルとさせればよいのでは?

オリジナル.csv が更新される都度実行する必要がありますが
>2行目以降をリンクするようにするとか、
CSVのようなテキストファイルでは無いかと。
>テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?
一旦取り込んでからだとデータ型の変更などが必要になりそうなので
厄介です。

オリジナル.csv の使われ方がイマイチ不明なのですが
上記のSub LineCut1() を、 Function LineCut1() に改名して
autoexec マクロに
プロシージャの実行に、LineCut1()
としても良いかもですね。

>2行目以降をリンクするようにするとか、
>テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?
D:\ナントカ\コントカ\オリジナル.csv
に余計な一行があったとして下記のコードを標準モジュールに作成し

Sub LineCut1()
Dim fSo As Object
Dim buf As Variant
Dim f As Object
Set fSo = CreateObject("Scripting.FileSystemObject")

With fSo.GetFile("D:\ナントカ\コントカ\オリジナル.csv").OpenAsTextStream
.SkipLine
buf = .readall
.Close
...続きを読む

QAccess CSVファイルインポート時にタイトルを省く

毎日送られてくる会員データ(CSVファイル)を
Accessで管理しようと考えております。
そのとき、先頭のタイトルを省いてインポートしたいのですがどのようにすればいいのでしょうか。
現在、フォーム上からCSVファイルを選択し「実行」コマンドを
クリックするとインポートするようにしているのですが
一行目のタイトルを省く方法がわかりません。

Private Sub 実行_Click()
TextConv Me.テキスト1, "インポート_定義", "T_会員データ"
End Sub

よろしくお願いします。

Aベストアンサー

TextConv という関数は Access に標準装備されている関数ではないですよね?
その中でどのように処理をしているのか不明なのでなんとも答えようがありません。

もし DoCmd.TransferText メソッドを使っているのであれば Transfertext メソッドの引数 "HasFieldNames" に True を指定すれば 1行目をデータとして読み込まなくなります。

Q【VBA】テキストファイルを指定行数からの読み込み

こんばんは。

EXCEL VBAでテキストファイルを読み込む事について質問です。

VBAでテキストファイルをこちらから指定する行数(上から何番目という感じで)からデーターを読み込みたいのですが、どの関数をつかっていいかわからず困っています。
1行ずつ読みこむ「Input Line関数」では、無駄な行まで読み込むので動作が遅くなります。
読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。

ちなみに指定する行数は、ファイルによって違います。
あらかじめ「Input Line関数」で、ある文字が何行目にあるかを探す行為をあらかじめ行っています。

みなさまのアイデアを拝借したく、よろしくお願いします。

Aベストアンサー

速度は分かりませんが、これとか
http://officetanaka.net/excel/vba/filesystemobject/textstream10.htm

あるいは、丸ごと読みこんで、改行コードでSplitして、文字列配列を相手に該当行検索も含めて処理するとか。
昨今のPCでは、相当大きなテキストファイルでもメモリー内で処理できると思います。
http://officetanaka.net/excel/vba/filesystemobject/textstream07.htm

テキストファイルの構造によってはADOで処理する案も考えられますが、Recordsetにはファイルの先頭から(あるいは末尾先頭で)入っている事が保証されているのか、ちょっと心配。参考URLはCSVになっていますが、タブ区切りテキストファイル(拡張子.txt)でもいけます。
http://home.att.ne.jp/zeta/gen/excel/c04p47.htm

以上ご参考まで。

Qインポート時のエラー「データ型の変換エラー」

ACCESS2000を使用しています。
CSVファイルをマクロを使い、インポートしようとしているのですが、ある列に「33300G2」というデータがあります。
インポートのマクロを実行するとそのデータのみがインポートエラー(エラー内容は「データ型の変換エラー」)となってしまいます。
ちなみに、エラーが出る列は、「33300G2」以外全てが数字のみなのですが関係あるのでしょうか。
もし原因らしきものがわかればアドバイスよろしくお願いいたします。

Aベストアンサー

インポート定義をして下さい。
インポート→設定→データ型を変更して下さい。
何かあれば補足して下さい。
がんばれ

Qマクロにてaccessへテキストファイルをインポートする方法

マクロを利用しaccessへテキストファイルをインポートしようとしているのですが、
どのHPを参照しても、
マクロを利用してのテキストインポートはできないみたいなことが書かれてます。
一度、CSVに落として実行するしか方法はないのでしょうか?

Aベストアンサー

1度、「ファイル」「外部データの取り込み」でテキストファイルを参照
左下の「設定」ボタンでフィールドの設定をして定義を保存します。

マクロにて「テキスト変換」を選び
[変換の種類]区切り記号付きインポート 又は 固定長インポート
[定 義 名]上記で保存した定義
[テーブル名]保存するテーブル
[ファイル名]テキストファイル名(パス付き)

これでできると思いますが...

QACCESS VBAでファイルを開くダイアログを表示させたい

ACCESSのフォームからコマンドボタンを押すことで、
ファイル開くダイアログが表示されて、
そこでファイル名をクリック指定することで、
実際にそのファイルがインポートされるように仕組みを作りたいと思っています。

VBAでどう記述するのでしょうか?
類似ケースの質問内容も調べましたがピンと来るものがありませんでした。
ご存知の方、教えて頂けるとありがたいです。よろしくお願いします。

Aベストアンサー

CSVファイルの場合ですが、こちらを参考に。
http://www.accessclub.jp/bbs3/0364/superbeg109189.html

Excelの場合は
DoCmd.TransferSpreadsheet acImport, 8, "テーブル名", strFileName, True, ""
のようになります。
詳しくは、TransferSpreadsheet をヘルプで調べてください。
マクロの「ワークシート変換」を 作成し
「マクロを Visual Basic に変換」で
VBA のコードにしてみるのも良いでしょう。

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESSにCSVインポート時の文字化け

お世話になります。
あるCSVデータをアクセスの外部データの取り込み作業をする際、
例えば
レ003005 は Ś003005
レ003002 は ±003002
カ025002 は ¶025002
の様に文字化けをおこします。
なぜこのような文字化けが起こるのか、また対処法がおわかりの方、よろしくお願いします。
なおACCESS2000を使用しています。

Aベストアンサー

souta_nさん、こんにちは。

テキストインポートウィザードの最初の画面で、
左下に「設定」ボタンがないですか?

ここをクリックすると、
文字コードを設定できる画面に入れますので、
ここで適当な文字コードに設定してやってください。
(ShiftJISとかUnicodeとか。)

文字コードがわからないときは、
手当たり次第にやってみると、文字化けしないものが見つかると思います。

QAccessでボタンを押したらエクセルデータを読み込み処理をしたい

よろしくお願いします。
AccessからExcelを開けるようにしたいのですが、
コードの記述方法がいまいちわかりません。
教えて頂けますでしょうか。

最終的には、ボタンをクリックしたら、ExcelファイルにあるデータをAccessに取り込み、それでDM用のラベルを作りたいと考えています。
勉強が必要なので、少しずつやろうと考え、
開く為のコードからいろいろいじってみようと考えました。
もし、他に効率の良い学習方法があればそちらもお願い致します。

Aベストアンサー

お世話になります。

>コードの記述方法がいまいちわかりません。
と言う事でしたので,最も簡単な方法を。

(1)Accessのマクロを作ります.
 [アクション]で[ワークシート変換]を選択し,
 画面の下部にある,[アクションの引数]に
 適宜入力します。
 
 作成したマクロを適当な名前をつけて保存します。

(2)Accessメニューバーの
 [ツール]→[マクロ]→[マクロを VisualBasicに変換]を選択し,変換します。

変換されたモジュールを見てみれば,
どんな感じでAccessテーブルにインポートするか
解ると思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報