Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel,循环2列,如果值相同,则从另一列计算值_Excel_Vba_Loops_Duplicates - Fatal编程技术网

VBA Excel,循环2列,如果值相同,则从另一列计算值

VBA Excel,循环2列,如果值相同,则从另一列计算值,excel,vba,loops,duplicates,Excel,Vba,Loops,Duplicates,我有以下问题,需要帮助: 我有这张桌子 A-------B-------C-------开始日期---结束日期 第1.1阶段——第1阶段——分析员——2018年1月1日——2019年1月3日 第1.1阶段——第1阶段——分析员——2018年1月2日——2020年1月4日 第1.1阶段——第1阶段——分析员——2018年1月3日——2019年1月5日 第1.1阶段——第1阶段——经理——2018年1月2日——2019年1月7日 第1.1阶段——第1阶段——经理——2018年1月1日——2019年1

我有以下问题,需要帮助:

我有这张桌子

A-------B-------C-------开始日期---结束日期

第1.1阶段——第1阶段——分析员——2018年1月1日——2019年1月3日

第1.1阶段——第1阶段——分析员——2018年1月2日——2020年1月4日

第1.1阶段——第1阶段——分析员——2018年1月3日——2019年1月5日

第1.1阶段——第1阶段——经理——2018年1月2日——2019年1月7日

第1.1阶段——第1阶段——经理——2018年1月1日——2019年1月5日

第1.1阶段——第2阶段——分析员——2018年1月1日——2019年1月3日

我想循环此表,检查B列的值是否与移动到C列的值相同(重复),并且对于C列中的相同值,计算“开始日期”列的最小值和“结束日期”列的最大值。
然后在新的excel工作表中写入行 因此,对于C列中的每个条目,我有一行,开始和结束日期取决于B列。 此外,A列总是相同的,应该复制而不是更改。 结果应该是这样的:

A------B------C------开始日期------结束日期

第1.1阶段——第1阶段——分析员——2018年1月1日——2020年4月1日

第1.1阶段——第1阶段——经理——2018年1月1日——2019年7月1日

第1.1阶段——第2阶段——分析员——2018年1月1日——2019年3月1日

我的手机是这样的:


感谢您的支持这里有一种通过VBA实现的方法

Sub rowLoop()
Dim lRow As Long, lRow2 As Long
Dim ws1 As Worksheet, ws2 As Worksheet
Dim startDate As String, endDate As String

Set ws1 = Sheets("Data") 'set this to be the worksheet with data
Set ws2 = Sheets("Results") 'set this to the worksheet you want the results to go

lRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row 'find last used row

ws2.Range("B2:C" & lRow).Value = ws1.Range("B2:C" & lRow).Value 'copy over Column B values
ws2.Range("$B$2:$C$" & lRow).RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo 'remove duplicates


lRow2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row 'find last used row
For i = 2 To lRow2 'loop through rows to determin start and end date
    ws2.Range("A" & i).Value = i - 1

    For j = 2 To lRow
        If ws2.Range("B" & i).Value = ws1.Range("B" & j).Value And ws2.Range("C" & i).Value = ws1.Range("C" & j).Value Then
            If startDate = "" Then
                startDate = ws1.Range("D" & j).Value
            Else
                If ws1.Range("D" & j).Value < startDate Then
                    startDate = ws1.Range("D" & j).Value
                End If
            End If

            If endDate = "" Then
                endDate = ws1.Range("E" & j).Value
            Else
                If ws1.Range("E" & j).Value > endDate Then
                    endDate = ws1.Range("E" & j).Value
                End If
            End If
        End If
    Next j
    ws2.Range("D" & i).Value = startDate
    ws2.Range("E" & i).Value = endDate
    startDate = ""
    endDate = ""
Next i

End Sub
子行循环()
变暗lRow为长,lRow2为长
将ws1标注为工作表,将ws2标注为工作表
Dim startDate作为字符串,endDate作为字符串
设置ws1=工作表(“数据”)'将其设置为包含数据的工作表
Set ws2=Sheets(“Results”)'将其设置为希望结果显示的工作表
lRow=ws1.Cells(Rows.Count,“A”).End(xlUp).Row'查找最后使用的行
ws2.Range(“B2:C”和lRow).Value=ws1.Range(“B2:C”和lRow).Value”复制B列的值
范围($B$2:$C$”&lRow)。RemovedUpplicates列:=Array(1,2),头:=xlNo'删除重复项
lRow2=ws2.Cells(Rows.Count,“B”).End(xlUp).Row'查找最后使用的行
对于i=2到lRow2'循环行以确定开始和结束日期
ws2.Range(“A”&i).Value=i-1
对于j=2至lRow
如果ws2.Range(“B”&i).Value=ws1.Range(“B”&j).Value,而ws2.Range(“C”&i).Value=ws1.Range(“C”&j).Value,则
如果startDate=“”,则
startDate=ws1.Range(“D”&j).值
其他的
如果ws1.Range(“D”&j).值<起始日期,则
startDate=ws1.Range(“D”&j).值
如果结束
如果结束
如果endDate=“”,则
endDate=ws1.Range(“E”和j).Value
其他的
如果ws1.Range(“E”&j).Value>endDate,则
endDate=ws1.Range(“E”和j).Value
如果结束
如果结束
如果结束
下一个j
ws2.Range(“D”和i).Value=startDate
ws2.Range(“E”和i).Value=endDate
startDate=“”
endDate=“”
接下来我
端接头

您好,欢迎来到StackOverflow。如果您对问题进行编辑,使表格的布局更加清晰,并让我们知道您迄今为止为解决此问题所做的努力,您可以提高问题的质量;我们是来帮你的,不是来帮你做事的!;)既然可以使用公式,为什么还要使用VBA?@OurManinBananas或只是一个枢轴-table@Luuklag在透视表中,如果有可能的值,你就看不到开始日期或结束日期,因此你总是要折叠它们以查看开始日期,例如,你为什么相信这一点?你可以完全按照你想要的结果制作表格。0向下投票接受Hay thanx很多关于你的答案我正在测试它现在有一个小问题:在新的表格中,B列和C列被正确复制,但开始和结束日期不正确。错误是在开始日期和结束日期在新的纸张的值是随机的一个范围内,例如分析师是一个在中间,而不是最小或最大的一个。你知道为什么吗?这个代码对我来说非常有效。这可能是因为两张纸上的格式不同。你可以一步一步地看代码,看看日期是如何变化的,看看哪里没有捕捉到正确的日期,而没有看到你的实际数据,我不能肯定。但您在问题中给出的示例数据适用于此代码。实际上,一个想法是在计算lRow后放置一个中断。检查是否设置为实际的最后一行。可能是因为行中有一些空格,代码不会在工作表末尾显示。我可以向您发送我的数据吗@VBA_SQL_程序员