先ほども、似たような質問をさせて頂いたのですが、おおもととして、質問していた、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
No.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した文字列は、「"」で囲った文字列と、文字コード体系が異なるのでした。
No.3
- 回答日時:
次の 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行だけ指定するのではなく、何行から何行と言った風にもできるのでしょうか??
No.2
- 回答日時:
こういうテキストファイルは、たいてい
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
です。
お手数ですが、再度、ご教授お願いいたします。
No.1
- 回答日時:
> 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行目と最終行だけ、データの形式が違うと言うか、空白の数が違い
それを、テキストで開いて、先に削除してしまってから、取り込めばうまくいきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
Access インポート
Access(アクセス)
-
ACCESS テーブルに2行目から取り込む方法
その他(Microsoft Office)
-
ACCESS2000でExcelから特定フィールドをインポートしたい
Access(アクセス)
-
-
4
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
5
Accessにインポートしたら並び順が変わっちゃった
Access(アクセス)
-
6
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
7
テキストファイルの特定行の削除方法
Visual Basic(VBA)
-
8
テーブルリンク エクセルの4行目を先頭行にしたい
Access(アクセス)
-
9
【VBA】テキストファイルを指定行数からの読み込み
Visual Basic(VBA)
-
10
AccessからExcelのファイルを起動する
その他(データベース)
-
11
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
12
Access2003で特定列の改行コードを削除してCSVへエクスポート
Excel(エクセル)
-
13
Access 1レコードずつcsvで出力したい
その他(データベース)
-
14
Access→Excelへエクスポートすると日付の表示形式が変化する
Excel(エクセル)
-
15
エクセルからアクセスにインポートすると、エラーが出てしまいます。原因を教えていただけませんか。
Access(アクセス)
-
16
空白をそのままインポートする方法について
その他(データベース)
-
17
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
18
ACCESSで値を代入できないとは?
Visual Basic(VBA)
-
19
パラメータが少なすぎます。1を指定して下さい。""
Excel(エクセル)
-
20
AccessのRefresh・Requery・Repaintの違い
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「内訳」と「明細」の違い
-
三井住友カードはメールで問い...
-
クレジットカード不正利用?
-
VISA国内利用vsカンタンケッサイサービス ...
-
クレジットカード明細にある「...
-
キャバクラや風俗をクレカで支...
-
明細と詳細
-
自己破産申請したら全クレジッ...
-
楽天カードの明細が見たいのに...
-
エクセルで抽出したい。
-
【クリーニング店のレシート(明...
-
PayPayカードの利用明細について
-
XMLをエクセルに取り込むマクロ
-
アメリカの通販サイトでの本人...
-
楽天カードの明細はその月の利...
-
クレジットカード代金取り消し
-
docomo.携帯請求書が急に届かな...
-
YouTubeのメンバーシップについ...
-
ヨドバシでキャンセルしました...
-
ワードの差込印刷で金額にコン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
確定申告を自宅のパソコンでし...
-
VISA国内利用vsカンタンケッサイサービス ...
-
キャバクラや風俗をクレカで支...
-
「内訳」と「明細」の違い
-
クレジットカード明細にある「...
-
クレジットカード不正利用?
-
三井住友カードはメールで問い...
-
歯科医院で明細書が出ない所
-
「d払いご利用可能額」とご利用...
-
クレジットカードの書類提出に...
-
自己破産申請したら全クレジッ...
-
Accessサブレポートの内容が重...
-
docomoからahamoへ契約変更した...
-
E*TRADEの株を現金化したい
-
給料が早めに振り込まれること...
-
アクセスにtxtファイルの指定行...
-
明細と詳細
-
XMLをエクセルに取り込むマクロ
-
ETC利用料の明細
-
docomo.携帯請求書が急に届かな...
おすすめ情報