VBA:将表格分成3组并比较时间(Excel)

时间:2012-10-11 22:46:12

标签: vba excel-vba excel

我有一个包含3组的表(由B列中的值'1G,3G或5G'定义),如下所示。

对于值1G的每次(A列),我需要测试3G的10分钟内出现的值(如A列所示)。如果是这样,那么我需要测试一个值5G是否在20分钟内出现(价值1G的时间)。

因此读取时间'1G'然后读取时间'3G'并且如果=< 10分钟,然后读取时间'5G'=< 20分钟。

'Time'    'Group Name'  'Data'
----------
12:08 am       1G        747
12:45 am       1G        745
1:00 am        1G        746
12:36 am       3G        743
12:45 am       3G        747
1:03 am        3G        74
12:50 am       5G        75
1:00 am        5G        741

格式'时间':9/25/2012 8:37:00 pm

我希望将结果写在包含每行所有数据的新工作表上。

我在本网站和其他网站上查看了答案,但未找到答案。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

此宏将在10分钟内提取所有拥有3G的1G线路,并在20分钟内提取5G线路。

   Sub Macro2()
Dim lLastRow As Long, shtOrg As Worksheet, shtDest As Worksheet, rgLoop As Range

'turn off updates to speed up code execution
With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With

Set shtOrg = ActiveSheet
Set shtDest = Sheets.Add

lLastRow = shtOrg.Cells(Rows.Count, 1).End(xlUp).Row

shtOrg.Range("D2:D" & lLastRow).FormulaR1C1 = _
        "=IF(RC[-2]=""1G"",IF(COUNTIFS(C[-3],"">="" &RC[-3],C[-3],""<=""&RC[-3]+10/1440,C[-2],""3G"")*COUNTIFS(C[-3],"">="" &RC[-3],C[-3],""<=""&RC[-3]+20/1440,C[-2],""5G"")>0,TRUE,""""),"""")"
shtOrg.Range("E2:E" & lLastRow).FormulaR1C1 = _
        "=N(IF(RC[-3]=""3G"",COUNTIFS(C[-1],TRUE,C[-4],""<=""&RC[-4],C[-4],"">=""&RC[-4]-10/1440),IF(RC[-3]=""5G"",COUNTIFS(C[-1],TRUE,C[-4],""<=""&RC[-4],C[-4],"">=""&RC[-4]-20/1440),"""")))>0"

shtOrg.Range("A1:E" & lLastRow).AutoFilter field:=4, Criteria1:="TRUE"

shtOrg.Range("A1:C" & lLastRow).SpecialCells(xlCellTypeVisible).Copy shtDest.Cells(1, 1)

shtOrg.Range("A1:E" & lLastRow).AutoFilter
shtOrg.Range("A1:E" & lLastRow).AutoFilter field:=5, Criteria1:="TRUE"
shtOrg.Range("A2:C" & lLastRow).SpecialCells(xlCellTypeVisible).Copy shtDest.Cells(Rows.Count, 1).End(xlUp).Offset(1)

shtOrg.Columns("D:E").ClearContents
shtOrg.Range("A1:E" & lLastRow).AutoFilter


With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
End With


End Sub

答案 1 :(得分:0)

在第一行数据中输入此公式(我假设第2行):

=AND(B2="1G",SUM((B3:$B$8="3G")*(A3:$A$8<=A2+"00:10")*(A3:$A$8>=A2)),SUM((B3:$B$8="5G")*(A3:$A$8<=A2+"00:20")*(A3:$A$8>=A2)))

将公式中的$ B $ 8和$ A $ 8更改为最后一行数据。

输入公式后,按Enter ,而不是按Ctrl+Shift+Enter。公式周围应该出现圆括号。

现在拖动公式。评估为真的任何东西都符合您的条件。它只在当前位置下方搜索,因此最好订购您的数据。

现在使用自动过滤器获取相关行。如果我理解正确,您可以在另一张纸上使用数据表,但我不知道如何完成:)