- 締切済み
複数の.csvファイルから指定数値を取り出す
毎度御世話になります。 あるフォルダ内の複数の.csvファイル一つ一つから 指定数値(B列6行目のみ)を取り出して、 デスクトップ上、別のExcelシートの(B列1行毎に日付と時間が書いてある) 隣のC列にまとめて自動で書いてくれるプログラムを考えます。 使用するファイル名は HU20150513_110000_AI2.csv です。 コードの該当行'ファイル名を配列変数に格納 のところを、 上記ファイル名にしても、「型が一致しません」とエラーが出るのですが、 どこか他に変更点があるのでしょうか。詳しい方、宜しく御願い申し上げます。 ■VBAコード Sub 値取得() '配列変数を宣言 Dim filnames As Variant Dim myfile As Variant Dim cnt As Long Dim mybook As Workbook Dim outbook As Worksheet Dim fname As String Dim mySerial As Date Dim myRng As Variant Dim key As String '出力先の先頭行番号 cnt = 1 '出力先のブックを格納 Set outbook = ActiveWorkbook.ActiveSheet 'ファイル名を配列変数に格納 filnames = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", MultiSelect:=True) 'キャンセル時の処理 If IsArray(filnames) = False Then Exit Sub 'ファイルの数だけ繰り返し Application.ScreenUpdating = False For Each myfile In filnames 'ファイル開く Set mybook = Workbooks.Open(Filename:=myfile, ReadOnly:=True) 'ファイル名からシリアル値の作成 fname = Format(Left(mybook.Name, 12), "0000/00/00 00:00") mySerial = DateValue(fname) + TimeValue(fname) '値を取得・出力先へ書き出し mybook.Activate key = Year(mySerial) & Month(mySerial) & Day(mySerial) & Hour(mySerial) For Each myRng In outbook.Columns("B").SpecialCells(xlCellTypeConstants, 23) If IsDate(myRng) Then If Year(myRng) & Month(myRng) & Day(myRng) & Hour(myRng) = key Then myRng.Offset(0, 1).Value = ActiveSheet.Range("B6").Value Exit For End If End If Next myRng 'ファイル閉じる Application.DisplayAlerts = False Workbooks(mybook.Name).Close Application.DisplayAlerts = True 'カウントアップ cnt = cnt + 1 Next myfile Application.ScreenUpdating = True End Sub
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>ファイルは上記一つだけでなく、HU20150513_120000_AI1 ・・のように1h毎に一つあります。 であれば、 Dim filelists(24) As String Dim filnames As Variant filelists(1) = "C:\Users\ユーザー名\Desktop\HU20150513_000000_AI1.csv" filelists(2) = "C:\Users\ユーザー名\Desktop\HU20150513_010000_AI1.csv" filelists(3) = "C:\Users\ユーザー名\Desktop\HU20150513_020000_AI1.csv" filelists(4) = "C:\Users\ユーザー名\Desktop\HU20150513_030000_AI1.csv" filelists(5) = "C:\Users\ユーザー名\Desktop\HU20150513_040000_AI1.csv" filelists(6) = "C:\Users\ユーザー名\Desktop\HU20150513_050000_AI1.csv" (略) filelists(22) = "C:\Users\ユーザー名\Desktop\HU20150513_210000_AI1.csv" filelists(23) = "C:\Users\ユーザー名\Desktop\HU20150513_220000_AI1.csv" filelists(24) = "C:\Users\ユーザー名\Desktop\HU20150513_230000_AI1.csv" ってやって filnames = Array(ファイル名) を filnames = filelists に変えましょう。 リストを1時間毎に24個代入する所は、for分を使って1~24まで回して、ファイル名の時間に相当する所を、文字列式で生成する事も可能です。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>ファイルがフォルダ内に入っているからでしょうか。 指定したファイルがカレントドライブのカレントフォルダに無い場合、ファイル名だけ指定しても開けません。 filnames = Array("C:\Users\ユーザー名\Desktop\HU20150513_110000_AI2.csv") のように、ファイルの場所を明示的に指定するか filnames = Array("HU20150513_110000_AI2.csv") ChDrive "C" ChDir ""C:\Users\ユーザー名\Desktop" のように、カレントドライブを変更してから、カレントフォルダを変更して下さい。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>コードの該当行'ファイル名を配列変数に格納 のところを、 >上記ファイル名にしても、「型が一致しません」とエラーが出るのですが、 ファイル名を「固定の値、1つだけ」にするには 'ファイル名を配列変数に格納 filnames = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", MultiSelect:=True) を 'ファイル名を配列変数に格納 filnames = Array("HU20150513_110000_AI2.csv") に変えます。 'ファイル名を配列変数に格納 filnames = "HU20150513_110000_AI2.csv" ってやっちゃうと「バリアント型には、固定長の文字列型(String)と、ユーザー定義型は代入できない」ので「型が一致しません」エラーになります。
補足
回答ありがとうございます。 早速試したところ、 上記「ファイルが見つかりません」とエラーが出ました。 ファイルがフォルダ内に入っているからでしょうか。
補足
filnames = Array("C:\Users\ユーザー名\Desktop\HU20150513_110000_AI2.csv") のように変更して、実行してみましたところ、また「型が一致しません」と出ます。 ファイルは上記一つだけでなく、HU20150513_120000_AI1 ・・のように1h毎に一つあります。 それらの指定数値だけまとめて別に表示させるようにしたいのです。