• 締切済み

複数の.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

みんなの回答

回答No.3

>ファイルは上記一つだけでなく、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まで回して、ファイル名の時間に相当する所を、文字列式で生成する事も可能です。

回答No.2

>ファイルがフォルダ内に入っているからでしょうか。 指定したファイルがカレントドライブのカレントフォルダに無い場合、ファイル名だけ指定しても開けません。 filnames = Array("C:\Users\ユーザー名\Desktop\HU20150513_110000_AI2.csv") のように、ファイルの場所を明示的に指定するか filnames = Array("HU20150513_110000_AI2.csv") ChDrive "C" ChDir ""C:\Users\ユーザー名\Desktop" のように、カレントドライブを変更してから、カレントフォルダを変更して下さい。

komet115
質問者

補足

filnames = Array("C:\Users\ユーザー名\Desktop\HU20150513_110000_AI2.csv") のように変更して、実行してみましたところ、また「型が一致しません」と出ます。 ファイルは上記一つだけでなく、HU20150513_120000_AI1 ・・のように1h毎に一つあります。 それらの指定数値だけまとめて別に表示させるようにしたいのです。

回答No.1

>コードの該当行'ファイル名を配列変数に格納 のところを、 >上記ファイル名にしても、「型が一致しません」とエラーが出るのですが、 ファイル名を「固定の値、1つだけ」にするには 'ファイル名を配列変数に格納 filnames = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", MultiSelect:=True) を 'ファイル名を配列変数に格納 filnames = Array("HU20150513_110000_AI2.csv") に変えます。 'ファイル名を配列変数に格納 filnames = "HU20150513_110000_AI2.csv" ってやっちゃうと「バリアント型には、固定長の文字列型(String)と、ユーザー定義型は代入できない」ので「型が一致しません」エラーになります。

komet115
質問者

補足

回答ありがとうございます。 早速試したところ、 上記「ファイルが見つかりません」とエラーが出ました。 ファイルがフォルダ内に入っているからでしょうか。