2017-07-06 273 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

非常欢迎。不,你没有。这是完整的代码,可以将每个文件的完整数据整合到一张工作表中。根据这些数据,您可以创建图表。 –