[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『CSVファイルを取り込む』(ウメ坊)
マクロで
CSVファイルをExcelに取込み、あるキーワード(氏名など)で
集約(集計)したいと思っています。
しかし、CSVファイルのレコードが65536行以上ある場合があるので、
一度に全データをExcelに取り込むことができません。
1レコードずつ取り込みながら、処理を行うということは
出来るのでしょうか?
(氏名で集約しながら取込をすることができれば
65536行以内に収まるのです)
なんとか、上手く取り込める方法を教えてください。
お願いします。
>氏名で集約しながら取込をすることができれば この方法は良く判りませんが、処理的には65000行を超えるデータに掛かる時間を考えたら、 CSVファイルのほうを50000行程度に分けて、エクセルに直接取り込めるようにして、 そこでフィルタ掛けた方が早いような気がしますけど、実際のところはどうなんでしょうね。 (川野鮎太郎)
毎月手作業で 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列だけのデータを想定したもの。
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.