2017-07-06 17 views
0

私はVBAを初めて使っていますが、私はこのプロジェクトを手に入れました。私は、特定の日付(月、日、年)をユーザー入力として取り込み、選択した日付のファイルから読み取られたデータを使用してその日のグラフを表示する、このExcelマクロファイルを持っています。各ファイルの名前は "xxxx_20170706.csv"のようになります。私はこのファイルを以下のように変更する必要があります。VBA:グラフにデータを追加する

1分ごとに記録された温度を含む1日1回、各ファイルが生成されます。問題は、各ファイルが1日に1回しか生成されず、前日の温度データ(データは00:00から23:59まで記録され続ける)を含んでいるため、今日のデータをチェックしたり使用することができないということです。基本的には、1日のグラフを見たい場合は翌日まで待たなければなりません。

この問題を解決するために、毎日1時間に1つのファイル(1日に24ファイル生成)を生成することにしました。各ファイルには1時間前のデータが含まれています。たとえば、1日の午前1時に、0時から0時59分までの時間の温度データを含むファイルが生成されます。このようにして、今日のデータを見ることができます。

これは、朝の5:30に5つの異なるファイルが生成されることを意味します。

問題は、複数のファイルからグラフを生成する方法がわかりません。ユーザーの入力は同じままで、温度データの表示を希望する特定の日付の入力を促すだけです。出力は、その時点に存在する日付の温度データを反映する1つのグラフである必要があります。

各ファイルの名前は "xxxx_20170706_YY.csv"となります。ここで、YYは2桁の時間(00〜23まで)です。

ループを増分してファイル名の最後に追加して、選択した日付の既存ファイルを読み込めるようにしました。しかし、それは動作せず、最後に読み込まれたファイルからのデータのグラフしか表示されませんでした。 1日に5つのファイルがある場合、これらの5つのファイルのすべてをグラフに使用する必要があります。

これはどのように達成できますか?私が思いついたアイデアは、新しいExcelファイルを作成し、forループでファイルを読み込むたびに、ファイルの最後にデータを追加し、最後にその新しいExcelファイルを一度読み込みます、グラフを生成する。

他にも良い方法がありますか?あなたの助けを前もってありがとう!

+0

これはかなり簡単です。ある日から5つ以上のファイルに基づいてADODB.Recordsetを作成することができます。 –

答えて

0

私は、この方法で行うだろう:ループ内のファイル名

  • を取得するために、現在の時間に時間を通じて

    1. ループをクエリ(文字列)
    2. を作成し、接続
    3. を作成するレコードセットを作成
    4. グラフのソースとして使用されるExcelシートにデータをダンプします。

    、コードの下で私のコメントを読んでください:

    Option Explicit 
    
    'needs reference to MS ActiveX Data Objects x.x Library 
    Sub GetCsvData() 
        Dim sPath As String, sFileName As String 
        Dim i As Integer, iCurrHour As Integer 
        Dim sSQL As String, sConn As String 
        Dim oConn As ADODB.Connection, oRst As Recordset, oWsh As Worksheet 
    
        On Error GoTo Err_GetCsvData 
    
        iCurrHour = Hour(Now) - 1 
        For i = 0 To iCurrHour 
         sFileName = "xxxx_" & Format(Date, "yyyyMMdd") & "_" & Right("00" & CStr(i), 2) & ".csv" 
         sSQL = sSQL & "SELECT * FROM " & sFileName & vbCr & "UNION ALL" & vbCr 
        Next 
    
        sSQL = "SELECT fnl.*" & vbCr & "FROM (" & vbCr & sSQL & ") AS fnl;" 
    
        MsgBox sSQL 
    
        'temporary exit sub; remove below line 
        GoTo Exit_GetCsvData 
    
        sPath = "c:\txtFilesFolder\" 'path have to ends with "\" 
    
        'change HDR=Yes if the first row of csv file contains the names of columns 
        sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath & ";Extended Properties='text;HDR=No;FMT=Delimited';" 
    
        Set oConn = New ADODB.Connection 
        With oConn 
         .ConnectionString = sConn 
         .Open 
        End With 
    
        Set oRst = New ADODB.Recordset 
        oRst.Open sSQL, oConn, adOpenStatic, adLockReadOnly 
    
        Set oWsh = ThisWorkbook.Worksheets("SourceSheetForChart") 
        oWsh.Range("A1").CopyFromRecordset oRst 
    
    
    Exit_GetCsvData: 
        Set oWsh = Nothing 
        If Not oRst Is Nothing Then oRst.Close 
        Set oRst = Nothing 
        If Not oConn Is Nothing Then oConn.Close 
        Set oConn = Nothing 
        Exit Sub 
    
    Err_GetCsvData: 
        MsgBox Err.Description, vbExclamation, Err.Number 
        Resume Exit_GetCsvData 
    
    End Sub 
    

    を注:テキストファイルは非常に特定の区切り文字または小数点区切り文字が含まれている場合、あなたはschema.iniというファイルを作成しています。

    詳細については、以下を参照してください。
    Much ADO about text files
    Schema.ini File

    幸運を!

  • +0

    ありがとう!私は複数のデータ(気温だけではない)を持っていますが、その場合、グラフごとにこのコードを書く必要がありますか? –

    +0

    また、読み取られたファイルはExcelの.csvファイルなので、各データは各セルで区切られます –

    +0

    大歓迎です。いいえ、あなたはしません。これは、各ファイルから1つのワークシートにすべてのデータを取得する完全なコードです。そのデータに基づいて、グラフを作成できます。 –

    関連する問題