2017-07-06 92 views
0

我是VBA的新手,但是我得到了該項目的工作。我有這個excel宏文件,它以用戶輸入的形式接收特定的日期(月,日,年),並使用從所選日期的文件中讀取的數據顯示當天的圖形。每個文件都被命名爲「xxxx_20170706.csv」。我需要修改此文件以實現以下目的。VBA:將數據添加到圖表

每個文件每天生成一次,包含每分鐘記錄的溫度。問題在於,由於每個文件每天只生成一次,並且包含前一天的溫度數據(數據在00:00至23:59之間保持記錄),因此無法檢查或使用今天的數據。基本上,如果你想看一天的圖表,你必須等到第二天。

爲了解決這個問題,我們決定每天每小時生成一個文件(即每天生成24個文件),並且每個文件都包含前一小時的數據。例如,在一天中的凌晨1點,生成一個包含一天中凌晨0點至凌晨0點59分的時間溫度數據的文件。這樣,即使在今天我們也能看到數據。

這意味着,在早上5點30分,應該生成5個不同的文件。

我遇到的問題是,我不知道如何從多個文件生成圖形。用戶輸入將保持不變,只提示他們想要查看溫度數據的特定日期。輸出需要是反映該點存在日期的溫度數據的一個圖形。

每個文件將被命名爲「xxxx_20170706_YY.csv」,其中YY是2位數小時(從00到23)。

我嘗試使用循環遞增我並將其添加到文件名的末尾,以便它可以繼續閱讀所選日期的現有文件。但是,它不起作用,只顯示上次讀取文件的數據圖。 如果一天有5個文件,那麼所有這5個文件都必須用於圖形。

這怎麼可能實現?我提出的一個想法是,我創建了一個新的excel文件,並且每次在for循環中讀取一個文件時,我都一直在文件底部添加數據,並在最後讀取一次新的excel文件,並生成圖。

還有其他更好的方法嗎?在此先感謝您的幫助!

+0

這很容易實現。您可以基於一天內的5個或更多文件創建ADODB.Recordset。 –

回答

0

我會做到這一點是這樣的:

  1. 遍歷小時當前小時來獲取文件名
  2. 循環創建查詢(串)內
  3. 創建連接
  4. 創造記錄
  5. 將數據轉儲到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

非常歡迎。不,你沒有。這是完整的代碼,可以將每個文件的完整數據整合到一張工作表中。根據這些數據,您可以創建圖表。 –