[[20041122160517]] 『CSVファイルを取り込む』(ウメ坊) ページの最後に飛ぶ

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

 

『CSVファイルを取り込む』(ウメ坊)

マクロで
CSVファイルをExcelに取込み、あるキーワード(氏名など)で
集約(集計)したいと思っています。

しかし、CSVファイルのレコードが65536行以上ある場合があるので、
一度に全データをExcelに取り込むことができません。

1レコードずつ取り込みながら、処理を行うということは
出来るのでしょうか?

(氏名で集約しながら取込をすることができれば
65536行以内に収まるのです)

なんとか、上手く取り込める方法を教えてください。
お願いします。


 >氏名で集約しながら取込をすることができれば
 この方法は良く判りませんが、処理的には65000行を超えるデータに掛かる時間を考えたら、
 CSVファイルのほうを50000行程度に分けて、エクセルに直接取り込めるようにして、
 そこでフィルタ掛けた方が早いような気がしますけど、実際のところはどうなんでしょうね。
 (川野鮎太郎)

確かに、それが一番簡単なんですが。
CSVファイルは複数あり、レコード数も未知なのです。

毎月手作業で CSVファイルの分割を行うというのは
運用的に負担が大きい・ミス発生の可能性大
なので自動化をしたいのです。

1レコードずつ読み込み、
キーワードが一致する行の1つのセルに作業工数等を加算していく
という方法など、やりたいのです。。。(ウメ坊)


 あら、そうなんですか・・・(^_^A;
 では詳しい方の回答を待ってみましょう^^v
 (川野鮎太郎)

 VBAを書くことになるのでは・・・
こちら↓を参考にしたらいかがでしょうか?(Hatch)
エクセル・マイスター(4)
https://www.excel.studio-kazu.jp/mag2/backnumber/mm20040622.txt

 試作してみました。CSVを一行ずつ読み、データ先頭が"あ"であれば、
アクティブシートへデータ書き込みを行います。
 
 Sub CSV取り込み()
     Dim MyString As String
     Dim MyVar As Variant
     Dim i As Long
     Rem 対象ファイル名
     Const MyFile As String = "C:\WINDOWS\デスクトップ\Book1.csv"
     Rem CSVを展開
     Open MyFile For Input Access Read As #1
     Rem 書込開始行
     i = 1
     Rem ファイル終端まで繰り返し
     While Not EOF(1)
     Rem 展開したテキストを一行分、変数へ格納
         Line Input #1, MyString
         Rem 変数にSplit関数で配列として格納
         MyVar = Split(MyString, ",")
         Rem 配列の先頭が"あ"であればアクティブシートへ書き込み
         If MyVar(0) = "あ" Then
             ActiveSheet.Cells(i, 1) = MyVar(0)
             ActiveSheet.Cells(i, 2) = MyVar(1)
             Rem 書込行を1行下へ
             i = i + 1
         End If
     Wend
     Rem CSVを閉じる
     Close #1
 End Sub
 
(みやほりん)
#書き忘れ
#上記は2列だけのデータを想定したもの。


みなさんアドバイス等ありがとうございました。
みやほりんさんの教えてくださった内容で出来そう!と思い
今日作成してみたのですが・・・
「split関数」が使えないんです。実は私の会社Excel97なんです。
何か、代用できる関数っていうのはあるのでしょうか?

VBA等初心者のため、関数のことなどがわからないのです。

教えてください。


 >ActiveSheet.Cells(i, 1) = MyVar(0)
 >ActiveSheet.Cells(i, 2) = MyVar(1)

 横道ーーー 
 レコード数が確定しないデータのとき
 dim n as long
 for n = 0 to ubound(MyVar)
  ActiveSheet.Cells(i, n+1) = MyVar(n)
 Next

 Split("1,2,3,4,5",",")
 上のやつは 文字列 の中身を , で分けなさい って意味になります

 (Null)

 一点集中レス。

 >「split関数」が使えないんです。実は私の会社Excel97なんです。
 
SplitってVB6相当(多分Excel2000以降)じゃないと使えないんですよねぇ…便利なんだけど。

 >何か、代用できる関数っていうのはあるのでしょうか?
 
同等機能の関数を自作するしかないかなーと思います。
 
追記:
作ってみました。
 
Sub test()
    Dim arr() As String
    Dim i As Integer
    arr = Split("スペース 区切")
    For i = LBound(arr) To UBound(arr)
        MsgBox arr(i)
    Next
    arr = Split("カンマ,区切", ",")
    For i = LBound(arr) To UBound(arr)
        MsgBox arr(i)
    Next
End Sub
 
Public Function Split(ByVal TargetString As String, Optional ByVal SplitChar As String = " ") As Variant
    Dim strRet() As String
    Dim intCount As Integer
    Dim intPos As Integer
    intCount = -1
    Do
        intCount = intCount + 1
        ReDim Preserve strRet(0 To intCount)
        intPos = InStr(TargetString, SplitChar)
        If intPos = 0 Then
            strRet(intCount) = TargetString
            TargetString = ""
        Else
            strRet(intCount) = Mid(TargetString, 1, intPos - 1)
            TargetString = Mid(TargetString, intPos + 1)
        End If
    Loop While TargetString <> ""
    Split = strRet
End Function

 但し、TargetStringが空文字の場合の動作だけは真似できないのでそれは事前に判断の事。
さらに追記修正:空文字の場合はarr(0) = ""の文字列配列を返す事にしました。
(ご近所PG)

 [Null]さん、手抜き部分の修正アイデアありがとう!流用させていただきます。
さらに、[ご近所PG]さん、代替関数ありがとう!! 後光が見える・・・
月末で仕事が押しててなかなかレスつけられないうえに、
一度作成したものを不注意で「ぽい」しちゃいました。
初歩的ミス。とりあえず復元。
'///////////////////////////////////////////////////////////
 Sub CSV取り込み()
 Dim MyString As String
 Dim MyVar() As String
 Dim i As Long, s As Long, n As Long, MyCount As Long
     Rem 対象ファイル名
     Const MyFile As String = "C:\WINDOWS\デスクトップ\Book1.csv"
     Rem CSVを展開
     Open MyFile For Input Access Read As #1
     Rem 書込開始行
     i = 1
     Rem ファイル終端まで繰り返し
     While Not EOF(1)
     Rem 展開したテキストを一行分、変数へ格納
         Line Input #1, MyString
         Rem 変数にカンマ基準で配列として格納
         MyString = MyString & ","
         Rem 変数初期化
         ReDim MyVar(0)
         MyCount = 1
         For s = 1 To Len(MyString)
             If Mid(MyString, s, 1) = "," Then
                 MyVar(UBound(MyVar())) = Mid(MyString, MyCount, s - MyCount)
                 MyCount = s + 1
                 If s <> Len(MyString) Then ReDim Preserve MyVar(UBound(MyVar()) + 1)
             End If
         Next s
         Rem 配列の先頭が"あ"であればアクティブシートへ書き込み
         If MyVar(0) = "あ" Then
             For n = 0 To UBound(MyVar)
                 ActiveSheet.Cells(i, n + 1) = MyVar(n)
             Next n
             Rem 書込行を1行下へ
             i = i + 1
         End If
     Wend
     Rem CSVを閉じる
     Close #1
 End Sub
'///////////////////////////////////////////////////////////
貧弱PCでは65536行の処理をさせるのに3分もかかってしまった。
しかし、97だとSplit関数使えないんですね。 
MyVar(UBound(MyVar()))はちょっと胡散臭い書き方か?
(みやほりん)

 >MyVar(UBound(MyVar()))はちょっと胡散臭い書き方か?
自分もよく書きます。
(ご近所PG)それだけ…

コメント返信:

[ 一覧(最新更新順) ]


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