[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ:ブックを開かずにテキストファイルを入力』(ろっしい)
今、csv ファイルがあり、そのデータを、新しいブックを開かずにシートに読み込ませる事にトライしています。
参考にしたのは「大村あつし著、Excel VBA 2003 応用編」p.223 です。その中で、一点変えたところは、データcsv.data は2列目に都道府県名が入っており、そこが東京だった場合だけ読み込ませようとしている所です。
ここまでは上手く行ったのですが、実際の業務では、6万行、30列くらいのデータで(今のテストでは4行3列のテストデータを試しました)、Input #1, my_data(1),......,my_data(30)と長く書く必要があります。質問は
\x{fffd}@ここをループで自動的に処理することは可能でしょうか?(Input #1, の後にfor i=1 to ・・・とやったらエラーで失敗しました。)
\x{fffd}A更に、データの列数がファイルによってバラバラなとき、汎用的なプログラムとして自動的にcsvファイルの列数を取得してループで処理することは可能でしょうか?
というものです。
以下、テストプログラムを付記しておきます。ご教授いただければ幸いです。宜しくお願いします。
Option Explicit
Option Base 1
Sub csv_read()
Dim csv_file As String Dim my_data(4) As Variant Dim i, j As Integer
Application.ScreenUpdating = False csv_file = "data.csv" Worksheets("input_data").Activate
Open csv_file For Input As #1
Do Until EOF(1) Input #1, my_data(1), my_data(2), my_data(3) If my_data(2) = "東京" Then i = i + 1 For j = 1 To 3 Cells(i, j) = my_data(j) Next j End If Loop Close #1 End Sub
"10,000","xxx" とかのカンマがないこと また、半角スペースが削られてもいいのなら " xxxx","nnnn "," aaaa " ↓ |xxxx|nnnn|aaaa| inputで読むと、こんな感じにTrimされたようになる。
https://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi?mycmd=read&mypage=[[20050519204538]]
(Jaka)
(ろっしい)
Line Input で一行づつ Dim txt As String, x
Do While EOF(1) Line Input #1, txt If Split(txt,",")(1) = "東京" Then x = Split(txt,",") i = i + 1 Cells(i,1).Resize(,UBound(x) + 1).Value = x End If Loop (seiya)
注)余談です
Open csv_file For Input As #1 の #1 は dim FileNo as int FileNo = FreeFile open ・・・ as #FrileNo ってほうがいい気がします。
Dim txt As String, x でString型とVariant型を同じ行に記載してますが。 型が変わる場合は行を変えたほうがいいような気がします。
個人的な好みですがf^^; (また敵つくってしまいそうな書き込みだっ><;)
あと。CSVを読み込むならデータの取り込みを使うときれいに読み込めますよb
最後の発言の方。名無し投稿は避けたほうが良いと思いますよ。 (うにゅ〜ん)
Dim statementの行を変える云々は100%あなたの 個人的な趣向で何の根拠もない。 HN無しでの無責任な発言は慎むべきだ! (seiya)
>open ・・・ as #FrileNo
投稿するときは推敲をしっかりしましょう。 #FrileNo → #FileNo (MARBIN)
こんにちはぁ 名無しの犯人です><;
>HN無しでの無責任な発言は慎むべきだ! たまに忘れるんですf^^; 許してくださいmm
あと校正あまいですねf^^;
出直してきます つ。;
(Null)
(ろっしい)
書いた部分を差し替えるだけですけど? (seiya)
(ろっしい)
ディクショナリーってのを調べてみると役に立つかもしれないですよb
Existってメソッドがありますからそれを使うと・・・
ちがったらごめんなさいmm(Null)
配列に入れることができないのですか? 配列に入れてからの処理ができないのですか? どちらにしても、その説明ではわかりません。 (seiya)
さて、おかげさまで csv ファイルからシートにデータを持ってくる事ができるようになったのですが、
この先、やりたい事は、「シートを介さないで.csvファイルに書き出す」という事です。今、print とかを
ヘルプで調べていますがなかなか上手く行かない状況です。「1行ずつ.csvファイルから読み込んで条件に
合致したものだけアウトプットファイルの.csvに書き出したい」という事ですが、アドバイス頂けたら
幸いです。宜しくお願いします。
Option Explicit
Option Base 1
Sub csv_read()
Dim txt, csv_file As String Dim x As Variant Dim i, k As Long Dim index(2) As Variant
index(1) = "東京" index(2) = "神奈川"
Dim csv指標名 As String
Application.ScreenUpdating = False csv_file = "data.csv" Worksheets("input_data").Activate
Open csv_file For Input As #1
Do While Not EOF(1) '\x{fffd}@ 'Do Until EOF(1) '\x{fffd}A ちょっと質問なのですが、\x{fffd}@と\x{fffd}Aは同じ意味でしょうか?
Line Input #1, txt csv指標名 = Split(txt, ",")(1) For k = 1 To 2 If index(k) = csv指標名 Then x = Split(txt, ",") i = i + 1 Sheets("input_data").Cells(i, 1).Resize(, UBound(x) + 1).Value = x End If Next k Loop Close #1 End Sub
(ろっしい)
1) 2) は同じ意味です
1) は EOF (End Of File) にならない限りループ 2) は EOF までループ
変数 myTxt As String, myFile As String を宣言して cvs指標名だったら i = i + 1 Sheets("input")... の2行を myTxt = myTxt & txt & vbCr として Close #1の後に Open myFile For OutPut As #1 Print #1, myTxt Close #1 としたらどうでしょう? myFile は出力用のファイル名を指定しておいてください。 (seiya)
(ろっしい)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.