Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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中合并重复的单元格值及其和_Vba_Excel_Merge_Duplicates - Fatal编程技术网

使用VBA在Excel中合并重复的单元格值及其和

使用VBA在Excel中合并重复的单元格值及其和,vba,excel,merge,duplicates,Vba,Excel,Merge,Duplicates,我正在尝试使用VBA在Excel中合并重复的单元格值。 以下是数据示例: Col1 Col2 运行1 运行2 见9 转到5 见1 我需要合并此信息,以便数据如下所示: Col1 Col2 运行3次 见10 去5 也就是说,我需要合并第1列中的重复值,并在第2列中对其相应的值求和 我已经在这里咨询并尝试过类似的情况: 其中一项建议是以下宏: Sub Macro1() Dim ColumnsCount As Integer ColumnsCount = ActiveSheet.UsedRange.

我正在尝试使用VBA在Excel中合并重复的单元格值。 以下是数据示例:

Col1 Col2
运行1
运行2
见9
转到5
见1

我需要合并此信息,以便数据如下所示:

Col1 Col2
运行3次
见10
去5

也就是说,我需要合并第1列中的重复值,并在第2列中对其相应的值求和

我已经在这里咨询并尝试过类似的情况:

其中一项建议是以下宏:

Sub Macro1()
Dim ColumnsCount As Integer

ColumnsCount = ActiveSheet.UsedRange.Columns.Count

ActiveSheet.UsedRange.Activate


Do While ActiveCell.Row <= ActiveSheet.UsedRange.Rows.Count
    If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
        For i = 1 To ColumnsCount - 1
            ActiveCell.Offset(0, i).Value = ActiveCell.Offset(0, i).Value + ActiveCell.Offset(1, i).Value
        Next
        ActiveCell.Offset(1, 0).EntireRow.Delete shift:=xlShiftUp
    Else
        ActiveCell.Offset(1, 0).Select
    End If
Loop
End Sub
Sub宏1()
Dim ColumnsCount为整数
ColumnsCount=ActiveSheet.UsedRange.Columns.Count
ActiveSheet.UsedRange.Activate
当ActiveCell.Row运行时,请执行以下操作(先排序,然后运行代码):

子合并()
Dim ColumnsCount为整数
作为整数的Dim i
范围(“A1”)。排序键1:=范围(“A1”)、顺序1:=xl升序、标题:=xlGuess、_
OrderCustom:=1,方向:=xlTopToBottom,数据选项1:=xlSortNormal
当ActiveCell.Row运行时,请执行以下操作(先排序,然后运行代码):

子合并()
Dim ColumnsCount为整数
作为整数的Dim i
范围(“A1”)。排序键1:=范围(“A1”)、顺序1:=xl升序、标题:=xlGuess、_
OrderCustom:=1,方向:=xlTopToBottom,数据选项1:=xlSortNormal

当ActiveCell.Row时执行以下操作:假设表从单元格A1开始,列C之后为空(如果不是空,则合并行上的数据将丢失)

子合并类别值()
长得一样长
使用ActiveSheet
lngRow=.Cells(.LastCell.Row,1).End(xlUp).Row
.Cells(1).CurrentRegion.Sort键1:=.Cells(1),header:=xlNo'如果您的表有头单元格,则将其更改为xlYes
做
如果.Cells(lngRow-1,1)=.Cells(lngRow,1),则
.Cells(lngRow-1,2)=.Cells(lngRow-1,2)+.Cells(lngRow,2)
.Rows(lngRow)。删除
如果结束
lngRow=lngRow-1
循环直到lngRow<2
以
端接头

以下假设表格从单元格A1开始,而C列之后的列为空(如果不是空的,则合并行中的数据将丢失)

子合并类别值()
长得一样长
使用ActiveSheet
lngRow=.Cells(.LastCell.Row,1).End(xlUp).Row
.Cells(1).CurrentRegion.Sort键1:=.Cells(1),header:=xlNo'如果您的表有头单元格,则将其更改为xlYes
做
如果.Cells(lngRow-1,1)=.Cells(lngRow,1),则
.Cells(lngRow-1,2)=.Cells(lngRow-1,2)+.Cells(lngRow,2)
.Rows(lngRow)。删除
如果结束
lngRow=lngRow-1
循环直到lngRow<2
以
端接头

如果是我,我必须使用VBA(而不是使用透视表或
SUMIF
公式)来完成这项工作,那么我将按第1列对数据进行排序,然后从最后一行向上合并到第一行;它将为您提供更整洁的代码。如果您愿意,可以提供示例。编辑:抱歉,你刚刚意识到你可能想保持col 1值的原始外观顺序,这会使事情稍微复杂一些,但不会太复杂。举个例子将不胜感激。非常感谢。PS:Col1值的顺序不重要(可以在后面处理),重要的是在Col2中求和它们相应的值。我在下面给出了一个VBA答案,但我认为最好使用透视表,这似乎是组织此数据的最简单方法。您也可以使用Excels Data Menui中的小计功能进行此操作,如果是我,我必须使用VBA进行此操作(而不是使用透视表或
SUMIF
公式)然后我将按第1列对数据进行排序,然后从最后一行向上合并到第一行;它将为您提供更整洁的代码。如果您愿意,可以提供示例。编辑:抱歉,你刚刚意识到你可能想保持col 1值的原始外观顺序,这会使事情稍微复杂一些,但不会太复杂。举个例子将不胜感激。非常感谢。PS:Col1值的顺序并不重要(可以在后面处理),重要的是将它们对应的值在Col2中求和。我在下面给出了一个VBA答案,但我认为最好使用透视表。透视表似乎是组织此数据的最简单方法。您也可以使用Excels数据菜单中的小计函数来完成此操作
Sub Merge()

Dim ColumnsCount As Integer
Dim i As Integer

Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

Do While ActiveCell.Row <= ActiveSheet.UsedRange.Rows.Count
    If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
        For i = 1 To ColumnsCount - 1
            ActiveCell.Offset(0, i).Value = ActiveCell.Offset(0, i).Value +     ActiveCell.Offset(1, i).Value
        Next
        ActiveCell.Offset(1, 0).EntireRow.Delete shift:=xlShiftUp
    Else
        ActiveCell.Offset(1, 0).Select
    End If
Loop

End Sub
Sub mergeCategoryValues()
Dim lngRow As Long

With ActiveSheet

    lngRow = .Cells(.LastCell.Row, 1).End(xlUp).Row

    .Cells(1).CurrentRegion.Sort key1:=.Cells(1), header:=xlNo 'change this to xlYes if your table has header cells

    Do

        If .Cells(lngRow - 1, 1) = .Cells(lngRow, 1) Then
            .Cells(lngRow - 1, 2) = .Cells(lngRow - 1, 2) + .Cells(lngRow, 2)
            .Rows(lngRow).Delete
        End If

        lngRow = lngRow - 1

    Loop Until lngRow < 2

End With

End Sub