プロが教える店舗&オフィスのセキュリティ対策術

日付時分秒単位,対象サーバ、種類、値の4項目で作成された
1か月分のcsvファイル(yyyymmdd_対象サーバ名_種類.csv)を
VBAで1件づつ読み込み、日付単位で最大値、平均値を求めた結果を
エクセルシートに出力するVBAのサンプルコードを教えてください。

※csvファイルは日付時間でソート済み
※エクセルシートに出力されるのは1ファイルで1か月分に集計された結果のみで
レイアウトは日付、対象サーバ、種類、最大値、平均値

お手数ですが、サンプルコードがあるURLだけでもよいのでよろしくお願いいたします。

A 回答 (2件)

こんにちわ



このコードは、一つのcsvファイルを読み込んで処理する物です。


Option Explicit

Dim FullFilePass As String
Dim dMaxArr() As Double, dTotalArr() As Double
Dim iCountArr() As Long
Dim iRow As Long
Dim myDic As Object


Sub CallSubCsvLineInput()
Dim i As Long, j As Long
Dim outArea, myDicKeys
Dim TempArr

iRow = -1
Set myDic = CreateObject("Scripting.Dictionary")


FullFilePass = "D:\AAA\BBB\yyyymmdd_対象サーバ名_種類_01.csv"
'Pass は、実際の物にする
Call CsvLineInput

' FullFilePass = "D:\AAA\BBB\yyyymmdd_対象サーバ名_種類_02.csv"
' 'Pass は、実際の物にする
' Call CsvLineInput


myDicKeys = myDic.keys
ReDim outArea(UBound(dMaxArr), 4)
For i = 0 To UBound(dMaxArr)
TempArr = Split(myDicKeys(i), "■")
outArea(i, 0) = TempArr(0)
outArea(i, 1) = TempArr(1)
outArea(i, 2) = TempArr(2)
outArea(i, 3) = dMaxArr(i)
outArea(i, 4) = dTotalArr(i) / iCountArr(i)
Next i


TempArr = Split("日付、対象サーバ、種類、最大値、平均値", "、")
'シート名は、実際の物にする
Sheets("Sheet1").Cells(1, "A").Resize(1, 5).Value = TempArr
Sheets("Sheet1").Cells(2, "A").Resize(UBound(dMaxArr) + 1, 5).Value = outArea

Set myDic = Nothing
Erase dMaxArr, dTotalArr, iCountArr
End Sub



Private Sub CsvLineInput()
Dim intFF As Long
Dim strTemp As String
Dim TempArr
Dim DblTemp As Double
Dim DicKey As String
Dim i As Long, j As Long


intFF = FreeFile
Open FullFilePass For Input As #intFF
'Line Input #intFF, strTemp '必用があれば一行目を読み飛ばす


Do While Not EOF(intFF)
Line Input #intFF, strTemp
TempArr = Split(strTemp, ",")
'Split(TempArr(0), " ")(0)・・・日付時分秒から、日付け部分だけを取り出す。
'実物のデータを見ないとこれで良いかは不明
DicKey = Split(TempArr(0), " ")(0) & "■" & TempArr(1) & "■" & TempArr(2)
DblTemp = CDbl(TempArr(3))


If Not myDic.exists(DicKey) Then
iRow = iRow + 1
myDic(DicKey) = iRow
ReDim Preserve dMaxArr(iRow)
ReDim Preserve dTotalArr(iRow)
ReDim Preserve iCountArr(iRow)
dMaxArr(iRow) = DblTemp
dTotalArr(iRow) = DblTemp
iCountArr(iRow) = 1
Else
i = myDic(DicKey)
If dMaxArr(i) < DblTemp Then dMaxArr(i) = DblTemp
dTotalArr(i) = dTotalArr(i) + DblTemp
iCountArr(i) = iCountArr(i) + 1
End If
Loop

Close #intFF
End Sub


フォルダの全部のcsvファイルを処理するとか、
ダイアログを開いて、csvファイルを選択するとかの変更を
望む場合、新しく質問を建ててください。
    • good
    • 1

>※エクセルシートに出力されるのは1ファイルで1か月分に集計された結果のみで


>レイアウトは日付、対象サーバ、種類、最大値、平均値
無理せずに、csvファイルのデータをエクセルに取り込むVBA

集計結果を表示するピボットテーブルに分けて考えてみては如何でしょうか。

参考までに
CSVファイルをエクセルに取り込むコード
https://www.moug.net/tech/exvba/0060086.html
同じフォルダーに複数のCSVファイルなら
Dir()関数で検索してみて下さい。

ピボットテーブル、グループ化 で検索すると
最大値、平均値
がご希望のグループごとに集計してくれます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
csvデータの取り込みは頂いたURLで実現出来そうですが、
最大値、平均値は全件をエクセルに取り込まず(容量が大きくなる為)に
内部で処理した結果をエクセルに取り込みたいため
ピポットやグループ化は考えおりません。

ですので、引き続き内部ロジックで平均値や最大値を求める
vbaのサンプルコードがあればよろしくお願いいたします。

お礼日時:2016/08/28 20:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!