[[20070327154723]] 『マクロ:ブックを開かずにテキストファイルを入力』(ろっしい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ:ブックを開かずにテキストファイルを入力』(ろっしい) 

今、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 さんに書いていただいたプログラムが理解できない状況にあります。少し落ち着いたら頑張って勉強します。もしかしたら、そのときにまた質問させていただくかと思いますが宜しくお願いします。とりあえずお礼まで。皆さんありがとうございましたm(__)m

(ろっしい)


 書いた部分を差し替えるだけですけど?
 (seiya)

すみません。言葉足らずでした。実は本当にやりたいことはもう少し拡張した感じで、別ブックの別シートに取り出す都道府県が東京、神奈川、千葉・・・・と1列目に縦に並んでいます。これを一度配列に入れて、ループで If 文をと考えているところでが、ちょっとまだ上手く行っていません・・・

(ろっしい)


 ディクショナリーってのを調べてみると役に立つかもしれないですよb

 Existってメソッドがありますからそれを使うと・・・

 ちがったらごめんなさいmm(Null)

 配列に入れることができないのですか?
 配列に入れてからの処理ができないのですか?
 どちらにしても、その説明ではわかりません。
 (seiya)

レス遅くなり大変申し訳ありませんでしたm(__)m また、いい加減な質問をしてすみませんでした。
配列に入れるというのは以下のようなイメージです。作っていただいたマクロでは東京だけを取り出して
いましたが、東京、神奈川、千葉・・・・と複数あるときにあらかじめ配列(ベクトルですが)にその情報を
入れておいて、その条件に合致する行だけを抽出してくるというものです。以下、作成したプログラムです。

さて、おかげさまで 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)


上手くできました! 非常に丁寧なご回答ありがとうございましたm(__)m

(ろっしい)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.