根据另一列上的数据获取数组

时间:2018-01-23 13:54:51

标签: excel vba excel-vba

我正在编写一个填充此表单表格的vba代码,给出一组数据如下:

在表格中,我有兴趣获得每天的最大值和最小值,Lastrow是数据表中的最后一行,Año,Mes,Dia是我当前的年/月/日,它指的是值将在哪里粘贴在桌子上。

这是在几个for循环中循环遍历数据表上的每个当前日期,在for循环内我初始化变量和代码如下:

For Dia=1 to 31

    Cuenta = Sht.Range("C2", "C" & Lastrow).Find(DateSerial(Año, Mes, Dia)).Row           
    s = 0
    max = 0
    min = 0
    While Sht.Range("C" & Cuenta).Value = DateSerial(Año, Mes, Dia)

        'this counter is for how much data I'm averaging over

        s = s + 1  

        'Store the first data for the day
        If s = 1 Then
            max = Sht.Range("B" & Cuenta).Value
            min = Sht.Range("B" & Cuenta).Value
        End If

        'if another data piece is bigger or smaller than currently stored max or min, replace it

        If Sht.Range("B" & Cuenta).Value >= max Then
            max = Sht.Range("B" & Cuenta).Value
        End If

        If Sht.Range("B" & Cuenta).Value <= min Then
            min = Sht.Range("B" & Cuenta).Value
        End If

        Md = Md + Sht.Range("B" & Cuenta).Value

        'this counter is to move through data for each day starting on the first appearence of said date

        Cuenta = Cuenta + 1

    Wend

    Md = Md / s

    WS.Cells(Dia + 2, 3 * (Mes - 1) + 2) = min
    WS.Cells(Dia + 2, 3 * (Mes - 1) + 3) = Md
    WS.Cells(Dia + 2, 3 * (Mes - 1) + 4) = max

Next Dia

问题是,我的代码适用于所有值,但第一个月的第一天,Idk为什么,但第1天的数据没有考虑到当月的第一个值,无论哪种方式,我确定有给定使用VBA在另一列上的一些数据的外观,从数据表中获取最大值或最小值的更简单方法。

顺便说一下:即使表格将ene-17作为第一个日期条目,但事情会破坏我的代码,它真的是01-01-2017,它只是格式不同

Table

Data example

1 个答案:

答案 0 :(得分:0)

我建议采用完全不同的方法。在VBA窗口中,转到Tools-&gt; references并添加对Microsoft ActiveX data Objects 6.1 Library的引用。这将允许您对Excel表运行SQL语句,以便您可以利用SQL语言的强大功能。这是一个代码示例。但是,您必须编写符合您需求的SQL查询:

Dim oConn As ADODB.Connection, rs As ADODB.Recordset

sWorkbookName = ThisWorkbook.FullName
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" & 
sWorkbookName & """;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX = 1"""

sSheet="myDataSheet"
oConn.Open connString
'just an example of SQL, you have to customize it
sSQL = "SELECT [FIELD1], [FIELD2] FROM [" & sSheet & "$] " & " WHERE 
[FIELD1] =(SELECT MAX([FIELD1]) FROM [" & sSheet2 & "$]) ORDER BY [FIELD2] DESC"

rs.Open sSQL, oConn, adOpenStatic, adLockOptimistic, adCmdText

'dump results on a temporary sheet 
ThisWorkbook.Worksheets("tmp_sheet").Range("A2").CopyFromRecordset rs

rs.Close
oConn.Close