ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

はじめまして。
【Access2003】を使用し、タブ区切りのテキストファイル読込をVBAで行っています。
カンマ区切りはわかるのですが、タブ区切りの方法がわからないので教えていただけませんか?

TransferTextを使用したかったのですが、読み込んだデータ1件1件に対して必須と桁数確認を行い、エラーがあった場合はテキストファイルにそのデータ1行を書き込み、エラーがない場合は1行テーブルに書き込みというように処理を分けたいからなのです。
とりあえず今のところカンマ区切りのCSVファイルを読み込むというようにしており、読み込む前にタブ区切りテキストファイルをカンマ区切りCSVファイルに変換する処理を入れようと思っています。
しかしタブ区切りテキストファイルをそのまま読むことができれば一番いいのですが。
ソースは以下の通りです。

'出力元CSVファイルを開く
lngFileNum = FreeFile()
'データ読込
Open strJsnFol & "\\" & strIriInf For Input As #lngFileNum
'CSVファイルの最初の行を読み込む
'CSVファイルより1件分を読み込み
Line Input #lngFileNum, strData
'カンマで区切って配列に代入
varData = Split(strData, ",", , vbTextCompare)
'データ種別のチェック
If varData(0) <> "XXX" Then
MsgBox "ファイルエラーです。", vbInformation + vbOKOnly
intErrFlg = 1
Exit Sub
End If
'タイムスタンプチェック
strSQL = " SELECT CREATE_TIME FROM TB WHERE    CREATE_TIME = '" & varData(1) & "'"
'SQLを実行
If DBAC.ExecSelect(strSQL) = 0 Then
'同じ処理時間のデータがなければ、タイムスタンプを取得
strCreateTime = varData(1)
Else
MsgBox "すでに処理済です。", vbInformation + vbOKOnly
intErrFlg = 1
Exit Sub
End If

'テーブルを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("IF_TB")
'CSVファイルの全レコードを読み込むループ
Do Until EOF(lngFileNum)
'CSVファイルより1件分を読み込み
Line Input #lngFileNum, strData
'カンマで区切って配列に代入
varData = Split(strData, ",", , vbTextCompare)

'データチェック
If varData(0) = "" Or Len(varData(0)) > 12 Then
intChkErr = 1
End If
If varData(1) = "" Or Len(varData(1)) > 12 Then
intChkErr = 1
End If
If Len(varData(2)) > 1 Then
intChkErr = 1
End If
'エラーがあればエラーファイルに書き込み
If intChkErr <> 0 Then
strFileName = strJsnFol & "\\" & "ERR.csv"
lngFileNum2 = FreeFile()
Open strFileName For Append As #lngFileNum2
End If
Print #lngFileNum2, "ERR1," & strData
Close #lngFileNum2
Else
'各フィールドデータをテーブルに追加
With rst
.AddNew
!K_NO = varData(0)
!S_NO = varData(1)
!CD = varData(2)
!CREATE_TIME = strCreateTime
.Update
End With
End If
intChkErr = 0
Loop
rst.Close
Close #lngFileNum
Exit Sub

何かいい方法があれば教えていただけませんか?
よろしくお願いいたします。

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

A 回答 (1件)

>'カンマで区切って配列に代入


>varData = Split(strData, ",", , vbTextCompare)
ここを変えればいいってことではない?

varData = Split(strData, vbTab, , vbTextCompare)
    • good
    • 0
この回答へのお礼

その通りでした。
ありがとうございました。

お礼日時:2009/05/15 11:42

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

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

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

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

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

QVBAでMSアクセスに、Tab区切りのテキストを入力できますか??

VBAでMSアクセスに、Tab区切りのテキストを入力できますか??

VBAの「DoCmd.TransferText acImportDelim・・・」を使って、
「,」カンマ区切りテキストファイルをインポーしようとしても、
フィールドが一つになってしまいます。
テキストファイルのTabを,に変えると、正常に読めます。

Tab区切りのままで、DoCmd.TransferText ・・・ を使って、正常に
読み込みできるでしょうか??
ご教示をお願いします。

Aベストアンサー

参考)
http://www.accessclub.jp/bbs2/0109/beginter32872.html
No32872.タブを含む固定長テキストファイルのインポート方法
タブの扱いに困るケースは事例があるのでいろいろ探してみましょう。

TransferText をそのまま使うと
イレギュラーなケースは対応できないこと多々あります。

案1)
インポートの直前にインポート対象のファイルに対して
「テキストファイルのTabを,に変える」をVBAで処理させます。

Aファイルをインポート
→Aファイルを加工してBファイルで保存、実際はBファイルでインポート
→Bファイルは削除しておく
とする。

案2)
VBAで対象のファイルを1レコードずつEOFになるまで操作し、
Tabを操作しながらテーブルへインポートする。

QAccessでタブ区切りのテキストをインポートすると、71項目目以降のデータがインポートされない

WindowsXP
Access2000

いつもお世話になります。
どう対処してよいかわからなくなってしまったので質問
させてください。

社内システムから、ダウンロードしてきた、
テキストデータ(1登録あたり106項目、タブ区切りで保存、
登録データの切れ目は改行)があります。

エクセルに貼り付けてみると、↓のような見た目になります。
■=データ有りの意味


 A┃B┃C┃D・・┃・┃・┃BS┃BT┃BU┃BV┃・┃・┃DB
1■┃■┃■┃■・・┃■┃■┃■┃・┃・┃・┃・┃・┃・
2■┃■┃■┃■・・┃■┃■┃■┃・┃・┃・┃・┃・┃・
3■┃■┃■┃■・・┃■┃■┃■┃・┃・┃・┃・┃・┃・
・■┃■┃■┃■・・┃・┃・┃■┃・┃■┃■┃■┃・┃■
・■┃■┃■┃■・・┃・┃・┃■┃・┃■┃■┃■┃・┃■
・■┃■┃■┃■・・┃・┃・┃■┃・┃■┃■┃■┃・┃■

※BTの列は全て空白です。

それを、アクセスに取り込み、管理しようとしています。

登録数は特に決まっていません。
また、106項目は全て埋まっているわけではなく
空白の項目も多々あります。

インポート用のテーブルを用意し、インポートすると
何のエラーもなくインポートが完了するのですが、
なぜかBSの列までのデータは取り込むものの、
BT以降のデータは空白になります。

今回、200件弱のテスト用データで試したところ、
全てのデータにおいて、BT以降のデータが
空白になりました。

インポートできるデータには「○項目めまで」という
決まりがあるのでしょうか?

WindowsXP
Access2000

いつもお世話になります。
どう対処してよいかわからなくなってしまったので質問
させてください。

社内システムから、ダウンロードしてきた、
テキストデータ(1登録あたり106項目、タブ区切りで保存、
登録データの切れ目は改行)があります。

エクセルに貼り付けてみると、↓のような見た目になります。
■=データ有りの意味


 A┃B┃C┃D・・┃・┃・┃BS┃BT┃BU┃BV┃・┃・┃DB
1■┃■┃■┃■・・┃■┃■┃■┃・┃・┃・┃・┃・┃・
2■┃■┃■┃■・・┃■┃■┃■┃・┃・┃・┃・┃・┃・
3■┃■┃■...続きを読む

Aベストアンサー

回答がつかないようですので、たぶん見当違いでしょうが、コメントさせてもらいます。

Excel上で「※BTの列は全て空白です。」というのが気になりますね。

1行目のデータが70項目目の後ろで改行されている、ということはないのでしょうか。

そんなことはないのなら、データの先頭行はフィールド名ではないように見えますので、先頭に仮のフィールド名(例えば、a、b、c、・・・)のデータを1件分106項目、空白なしで加えて、インポートされてみてはいかがでしょうか。それでもだめでしたら、ごめんなさい。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QエクセルVBA テキスト読み込み(区切り文字で読み込み)  サンプルプログラムの改良をしてください。

通常、エクセルでテキストファイルを読み込もうとすると、ウイザードが立ち上がりそれを終えると読み込めます。
私はこのウイザードで、「カンマやタブなどの区切り文字で…」を選択し、次へ。次の画面で「タブ」と「スペース」にチェックを入れます。なお、スペースにチェックを入れると、自動的に「連続した区切り文字は1文字として扱う」にチェックが入ります。
そして次へ→、完了としてテキストを読み込んでいます。

このたび、この操作が面倒なので、マクロで実行しようといろいろ調べていたら、自分のやりたいことと一番近いサンプルマクロを見つけました。以下です。
http://www.bekkoame.ne.jp/~poetlabo/COMP/Excel/VBASAMP/IMP_TXT.TXT

このマクロをそのまま書いて実行すると、区切り文字を指定でき、読み込めます。
ただし、このままだと区切り文字を1つしか指定できません。
先ほど書いたように、今回は「スペース」「タブ」で区切って開きたいのですが、上記のサンプルプログラムをどう改変すればよいのでしょうか?

通常、エクセルでテキストファイルを読み込もうとすると、ウイザードが立ち上がりそれを終えると読み込めます。
私はこのウイザードで、「カンマやタブなどの区切り文字で…」を選択し、次へ。次の画面で「タブ」と「スペース」にチェックを入れます。なお、スペースにチェックを入れると、自動的に「連続した区切り文字は1文字として扱う」にチェックが入ります。
そして次へ→、完了としてテキストを読み込んでいます。

このたび、この操作が面倒なので、マクロで実行しようといろいろ調べていたら、自分のや...続きを読む

Aベストアンサー

こんにちは。

別に元のコード自体を評価するというような気持ちではありませんが、このコードは、シーケンシャルファイル用(拡張子は、.dat)にも適用できるマクロです。それで、問題は発生はしないけれども、全体的に、インポートは遅いはずです。

それと、誰もご指摘にならないようですが、元のサンプルのコードは、Excel97 用です。

Excel2000以上なら、テキストラインで、このようなことは必要ないはずです。
Call ReadLine(CurTxt, DeLimiter, rn)

Split 関数で十分なはずです。ただし、デリミタは、一つに限るので、その前に、Replace 関数で、置換しておく必要があります。

今風の書き方ではないし、プロシージャが分散しすぎて読みにくいように思います。新たに、書き直したほうがよい様な気もしてくるのですが。

記録マクロに関して、

>どうも思うのと違うため、今のところ保留にしています。
>「読み込み」と「開く」は違うみたいで、手動でやっているのと同じ結果にはなるのですが、新しいファイルが開いて、そこにテキストファイルが開かれたり…。

それは、インポートの方法が違っているからです。これは、VBAのオブジェクトで言えば、QueryTable といいますが、ワークシートでは、[外部データの取り込み]のことを指します。オプション自体は、複雑なこともありますので、記録マクロを利用するのが一番です。なお、Tab と Comma 共存の場合は、QueryTable が優れています。

VBA入門レベルでも、記録マクロと組み合わせれば可能かと思います。というか、よほど、インポート間で加工しなければ、このまま使えると思います。

例:

Sub TestMacro1()
  Dim Fname As Variant
  On Error Resume Next
  ActiveSheet.QueryTables(1).Delete 'QueryTableがあったら削除
  On Error GoTo 0
  Fname = Application.GetOpenFilename( _
  "テキストファイル (*.txt; *.csv),*.txt;*.csv", 1, "OpenTextFile")
  If VarType(Fname) = vbBoolean Then Exit Sub
'-------------------細かいオプションは、記録マクロから取り出してください。---
  With ActiveSheet.QueryTables.Add( _
    Connection:="TEXT;" & Fname, _
    Destination:=Cells(1, 1))
    .AdjustColumnWidth = False '列幅の自動調整
    .TextFileCommaDelimiter = True 'カンマ切り
    .Refresh BackgroundQuery:=False 'バックグラウンドの再入力(一回きり)
    .TextFileTabDelimiter = True 'タブデリミタあり
  End With
'-------------------
  ActiveSheet.QueryTables(1).Delete
End Sub
  

こんにちは。

別に元のコード自体を評価するというような気持ちではありませんが、このコードは、シーケンシャルファイル用(拡張子は、.dat)にも適用できるマクロです。それで、問題は発生はしないけれども、全体的に、インポートは遅いはずです。

それと、誰もご指摘にならないようですが、元のサンプルのコードは、Excel97 用です。

Excel2000以上なら、テキストラインで、このようなことは必要ないはずです。
Call ReadLine(CurTxt, DeLimiter, rn)

Split 関数で十分なはずです。ただし、デリミ...続きを読む

QACCESSのVBAでCSVを取込処理について

ACCESS初心者です。
ACCESSのVBAでCSV取込をしようとしていますが、
うまくいきません。
CSVとテーブルの項目の場所が違ったりオートナンバーが設定されていたりしているので、
そこのところが全くわかりません。
いろいろ調べて試しましたが、うまくいがず行き詰っています。
VBAでなくてもクエリやマクロといったやり方でもいいので、
教えてください。
-------------------------------------------------------------------
VBAプログラム
'処理実行確認画面
rc = MsgBox("処理を実行しますか?", vbOKCancel, "注文データ処理")
If rc = vbCancel Then
Exit Sub
End If

'[ファイルを開く]ダイアログボックスを作成
Set dlgOpen = Application.FileDialog(msoFileDialogOpen)

'ダイアログボックスの初期値をセット
dlgOpen.AllowMultiSelect = False
dlgOpen.Filters.Clear
dlgOpen.Filters.Add "CSVファイル", "*.csv"
dlgOpen.InitialFileName = CurrentProject.Path

'ダイアログボックス表示
retDialog = dlgOpen.Show

'[キャンセル]ボタン
If retDialog = 0 Then
Exit Sub

'[開く]ボタン
Else
'選択したファイル名を表示
Me!txtファイル名IN = dlgOpen.SelectedItems(1)
End If

Const ForRading = 1

strFilePath = txtファイル名IN

Set Con = CurrentProject.Connection
Rec.Open "order_list", Con, adOpenDynamic, adLockOptimistic


Open strFilePath For Input As #FNo
'ファイルの1行目の項目名部分を読み込む(何も処理しない)
Line Input #FNo, txtData

On Error GoTo ErrHndl
'エラーが発生した場合にデータのインポートをなかったこと(ロールバック)
'にするためにトランザクション処理として実行
Con.BeginTrans
'実際のデータ部分(2行目)からの処理
Do While Not EOF(FNo)
Line Input #FNo, txtData
Debug.Print txtData
Loop

Con.CommitTrans

Close #FNo

MsgBox ("処理が完了しました。")

Exit Sub

ErrHndl:
Close #FNo
Con.RollbackTrans
MsgBox "以下のエラーが発生したためロールバックしました。" & vbCrLf & _
Err.Description, vbCritical
----------------------------------------------------------------------------------------

ACCESS初心者です。
ACCESSのVBAでCSV取込をしようとしていますが、
うまくいきません。
CSVとテーブルの項目の場所が違ったりオートナンバーが設定されていたりしているので、
そこのところが全くわかりません。
いろいろ調べて試しましたが、うまくいがず行き詰っています。
VBAでなくてもクエリやマクロといったやり方でもいいので、
教えてください。
-------------------------------------------------------------------
VBAプログラム
'処理実行確認画面
rc = MsgBox("処理を実行します...続きを読む

Aベストアンサー

CSVファイルにタイトル行が有り、テーブルのフィールド名と同じ、
列数も同じ(オートナンバー型フィールドは除く)、
ならTransferTextメソッドでインポートはだめですか。
安全のためインポート定義を利用するべき
オートナンバー型フィールドは考えなくとも自動的に処理されます。
トランザクション処理が出来ないからNGか・・・。

インポート出来ないデータ型(数値に文字など)の場合は
インポートエラーテーブルが自動生成され記録されます。
テキスト型に255超の文字数の場合、超過分は黙って切り捨てられ
エラーは記録されません。

姑息な方法かもしれませんがインポート前にオートナンバーの最大値を控え
インポート処理後にエラーテーブルの有無・レコード数の増加をチェックし
変化が有れば削除クエリで元に戻す。
オートナンバーが大きく飛ぶので最適化で修正
Access VBA 自身を最適化 でGoogleとVBAサンプルもあるけど。。。

・・・
現状の方向だと
dim v() as variant,i as integer
v=split(txtData,",") '配列に格納
for i= lbound(v(i)) to ubound(v(i))
debug.print i,v(i) '添え字と値(タイトル)の確認
next

with rec
.addnew
!購入者氏名(漢字)= v(2)
!注文日時= cdate(v(0) ) 'Cdate 要らないかも?
・・のように対応する配列を指定
.update
end with
のようになるかと思います。
ただ、CSVファイルを、,カンマで分割して配列に入れているだけなので
ExcelでCSV出力した時のようなフォーマット
(位取り有りの数値にダブルクォートがついて、"1,100")
区切り以外でカンマが使われていると項目数・データとも崩れます。
Rollbackすることに。

CSVファイルにタイトル行が有り、テーブルのフィールド名と同じ、
列数も同じ(オートナンバー型フィールドは除く)、
ならTransferTextメソッドでインポートはだめですか。
安全のためインポート定義を利用するべき
オートナンバー型フィールドは考えなくとも自動的に処理されます。
トランザクション処理が出来ないからNGか・・・。

インポート出来ないデータ型(数値に文字など)の場合は
インポートエラーテーブルが自動生成され記録されます。
テキスト型に255超の文字数の場合、超過分は黙って切...続きを読む

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QExcel VBA Tabコードの出力

シーケンシャルファイルをオープンしPrint#ステートメントを用いて任意のテキストファイルを作成しようとしています。
このテキスト中にTabコードを入れたいのですが、どのようにすれば良いのか教えていただけませんか。

Aベストアンサー

制御文字は「chr(nn)]」で記述します。

TABコードは「9」なので
Print #1,"NANTOKA" & Chr(9) & "KANTOKA"と記述します。

ダブルコーテーションもこの方法で記述できます(コードは34)

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QAccessのデータをテキストファイルで出力する方法を教えてください。

Accessのデータをテキストファイルで出力する方法を教えてください。

クエリで抽出したデータをテキストファイルに出力したいのですが、下記のような記述では""や,で区切られてしまいます。
DoCmd.TransferText acExportDelim, "", "クエリ名", "出力ファイル.txt"

フィールドごとに改行して出力する方法はないでしょうか?


<クエリ結果>
フィールド1  フィールド2  フィールド3
aaa      bbb      ccc

<出力テキストファイル>
aaa
bbb
ccc

Aベストアンサー

ADO の GetString メソッドを使って直に文字列を作って出力してみてはいかがでしょうか。
(GetStringのヘルプを参照してください)

列間の区切り、および行間の区切りに vbCrLf を指定します。
出来上がった文字列の最終には vbCrLf が付いているので、それを削除した文字列を出力します。


記述例)

Private Sub Sample()
  Dim rs As New ADODB.Recordset
  Dim vTmp As Variant
  Dim ffn As Integer
  Const sQueryName As String = "クエリ名"
  Const sOutputFileName As String = "C:\Hoge\HogeTest.txt" '出力ファイル名

  rs.Open sQueryName, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  If (Not rs.EOF) Then
    vTmp = rs.GetString(adClipString, , vbCrLf, vbCrLf)
  End If
  rs.Close

  If (Not IsEmpty(vTmp)) Then
    ffn = FreeFile
    Open sOutputFileName For Output As #ffn
    Print #ffn, Left(vTmp, Len(vTmp) - Len(vbCrLf))
    Close #ffn
  End If
End Sub

ADO の GetString メソッドを使って直に文字列を作って出力してみてはいかがでしょうか。
(GetStringのヘルプを参照してください)

列間の区切り、および行間の区切りに vbCrLf を指定します。
出来上がった文字列の最終には vbCrLf が付いているので、それを削除した文字列を出力します。


記述例)

Private Sub Sample()
  Dim rs As New ADODB.Recordset
  Dim vTmp As Variant
  Dim ffn As Integer
  Const sQueryName As String = "クエリ名"
  Const sOutputFileName As String = "C:\Hoge\H...続きを読む

Q文字列からタブコードを取り除きたい

お世話になります。
文字列からタブ文字をスペースに置き換えるにはどうすればよいでしょうか?
strREC = Replace(strREC, ○, " ")
と書いて、○のところに"\t"などをいれてみたのですが、うまくいきません。

Aベストアンサー

strREC = Replace(strREC, vbTab, " ")
または
strREC = Replace(strREC, chr(9), " ")
でどうでしょう


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

人気Q&Aランキング

おすすめ情報