我正在编写一个填充此表单表格的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,它只是格式不同答案 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