在Excel中合并数据

在Excel中合并数据,excel,vba,Excel,Vba,使用包含3000多个列的Excel文件,并且存在多个重复列标题的问题。当这些数据被送入另一个系统时,就会出错。正在寻找在电子表格中合并列的方法。相同的标题可以出现在两到六列中,但每行数据只填充一列 我看到一篇文章合并了重复项的列标题,它们彼此相邻,我可以这样做(正如我在示例数据中所做的那样),但那篇文章只合并标题数据 不知道如何附加示例数据,但希望大家能看到: 1350725 1350725 1350740 1350813 1351468 1351468 B

使用包含3000多个列的Excel文件,并且存在多个重复列标题的问题。当这些数据被送入另一个系统时,就会出错。正在寻找在电子表格中合并列的方法。相同的标题可以出现在两到六列中,但每行数据只填充一列

我看到一篇文章合并了重复项的列标题,它们彼此相邻,我可以这样做(正如我在示例数据中所做的那样),但那篇文章只合并标题数据

不知道如何附加示例数据,但希望大家能看到:

1350725  1350725  1350740  1350813  1351468 1351468
B                          A        C
         A        C        B                E
C                 D        C        E  
A                 C        C        D
B                          E                B

这可能适合您:

Sub Test()

Dim lastcol As Long, lastrow As Long, lastrow2 As Long, i As Long, j As Long, k As Long

lastcol = ActiveSheet.Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column

For i = 1 To lastcol
    For j = i To lastcol
        If Cells(1, i).Value = Cells(1, j).Value And i <> j Then 'Merge em
            lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, i).End(xlUp).Row
            lastrow2 = ActiveSheet.Cells(ActiveSheet.Rows.Count, j).End(xlUp).Row

            If lastrow < lastrow2 Then
                lastrow = lastrow2
            End If

                For k = 2 To lastrow
                    If Cells(k, j).Value <> "" Then
                        Cells(k, i).Value = Cells(k, j).Value
                    End If
                Next k

                Columns(j).Delete Shift:=xlToLeft
                Exit For
        End If
    Next j
Next i

End Sub
子测试()
变暗lastcol为长,lastrow为长,lastrow2为长,i为长,j为长,k为长
lastcol=ActiveSheet.Cells(1,ActiveSheet.Columns.Count)。End(xlToLeft)。Column
对于i=1到lastcol
对于j=i到lastcol
如果单元格(1,i).Value=单元格(1,j).Value和ij,则将它们合并
lastrow=ActiveSheet.Cells(ActiveSheet.Rows.Count,i).End(xlUp).Row
lastrow2=ActiveSheet.Cells(ActiveSheet.Rows.Count,j).End(xlUp).Row
如果lastrow
测试数据:

关于您的测试数据:


不知道为什么我的照片没有通过。。。很抱歉。编辑:看起来它现在正在工作。

这可能适合您:

Sub Test()

Dim lastcol As Long, lastrow As Long, lastrow2 As Long, i As Long, j As Long, k As Long

lastcol = ActiveSheet.Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column

For i = 1 To lastcol
    For j = i To lastcol
        If Cells(1, i).Value = Cells(1, j).Value And i <> j Then 'Merge em
            lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, i).End(xlUp).Row
            lastrow2 = ActiveSheet.Cells(ActiveSheet.Rows.Count, j).End(xlUp).Row

            If lastrow < lastrow2 Then
                lastrow = lastrow2
            End If

                For k = 2 To lastrow
                    If Cells(k, j).Value <> "" Then
                        Cells(k, i).Value = Cells(k, j).Value
                    End If
                Next k

                Columns(j).Delete Shift:=xlToLeft
                Exit For
        End If
    Next j
Next i

End Sub
子测试()
变暗lastcol为长,lastrow为长,lastrow2为长,i为长,j为长,k为长
lastcol=ActiveSheet.Cells(1,ActiveSheet.Columns.Count)。End(xlToLeft)。Column
对于i=1到lastcol
对于j=i到lastcol
如果单元格(1,i).Value=单元格(1,j).Value和ij,则将它们合并
lastrow=ActiveSheet.Cells(ActiveSheet.Rows.Count,i).End(xlUp).Row
lastrow2=ActiveSheet.Cells(ActiveSheet.Rows.Count,j).End(xlUp).Row
如果lastrow
测试数据:

关于您的测试数据:


不知道为什么我的照片没有通过。。。很抱歉。编辑:看起来它现在正在工作。

您可以使用电源查询轻松完成此操作。它是Excel 2010+的外接程序(在Excel 2016中默认情况下称为“获取和转换”)。在那里,您可以直接将Excel与任何数据源连接,然后在查询编辑器中转换数据。对于您的情况,请遵循以下步骤:


您可以通过电源查询轻松实现这一点。它是Excel 2010+的外接程序(在Excel 2016中默认情况下称为“获取和转换”)。在那里,您可以直接将Excel与任何数据源连接,然后在查询编辑器中转换数据。对于您的情况,请遵循以下步骤:


希望这能奏效。 我使用存储阵列的字典来消除列的重复。 请注意,必须在注释中设置引用(或进行一些小更改以使用后期绑定)。此外,您还需要更改源和结果工作表的名称,以与您的数据保持一致

此外,假设源数据表是此工作表上的唯一内容,它从
A1
开始。
LastRowCol
功能检测数据的端点

如果源数据表不符合这些要求,则需要进行更改以检测正确的数据区域

'Set reference to Microsoft Scripting Runtime
Option Explicit
Sub CombineColumns()
    Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
    Dim vSrc As Variant, vRes As Variant
    Dim dD As Dictionary
    Dim I As Long, J As Long
    Dim lLastRowCol() As Long
    Dim V() As Variant

'set Source and REsults worksheets, ranges
 Set wsSrc = Worksheets("sheet5")
 Set wsRes = Worksheets("sheet6")
    Set rRes = wsRes.Cells(1, 1)

'Get source data into vba array
With wsSrc
    lLastRowCol = LastRowCol(wsSrc.Name)
    vSrc = .Range(.Cells(1, 1), .Cells(lLastRowCol(0), lLastRowCol(1)))
End With

'Collect and merge the data
Set dD = New Dictionary
ReDim V(2 To UBound(vSrc, 1))
For J = 1 To UBound(vSrc, 2)
    If Not dD.Exists(vSrc(1, J)) Then 'set new dictionary item
        For I = 2 To UBound(vSrc, 1)
            V(I) = vSrc(I, J)
        Next I
        dD.Add Key:=vSrc(1, J), Item:=V
    Else 'combine the columns
        For I = 2 To UBound(vSrc, 1)
            If vSrc(I, J) <> "" Then
                V = dD(vSrc(1, J))
                V(I) = vSrc(I, J)
                dD(vSrc(1, J)) = V
            End If
        Next I
    End If
Next J

'Write results to output array
ReDim vRes(0 To UBound(vSrc, 1) - 1, 1 To dD.Count)

'Headers
J = 0
Dim V1 As Variant
For Each V1 In dD.Keys
    J = J + 1
    vRes(0, J) = V1
Next V1

'Data
For J = 1 To UBound(vRes, 2)
    I = 0
    For Each V1 In dD(vRes(0, J))
        I = I + 1
        vRes(I, J) = V1
    Next V1
Next J

'write the results
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    With .Rows(1)
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
    .EntireColumn.AutoFit
End With

End Sub

Private Function LastRowCol(Worksht As String) As Long()
    Dim WS As Worksheet, R As Range
    Dim LastRow As Long, LastCol As Long
    Dim L(1) As Long
Set WS = Worksheets(Worksht)
With WS
    Set R = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlValues, searchorder:=xlByRows, _
                    searchdirection:=xlPrevious)

    If Not R Is Nothing Then
        LastRow = R.Row
        LastCol = .Cells.Find(what:="*", after:=.Cells(1, 1), _
                    LookIn:=xlValues, searchorder:=xlByColumns, _
                    searchdirection:=xlPrevious).Column
    Else
        LastRow = 1
        LastCol = 1
    End If
End With

L(0) = LastRow
L(1) = LastCol
LastRowCol = L
End Function
“设置对Microsoft脚本运行时的引用”
选项显式
子组合列()
将wsSrc标注为工作表,wsRes标注为工作表,rRes标注为范围
尺寸vSrc作为变型,vRes作为变型
词典
我和我一样长,我和我一样长
Dim lLastRowCol()的长度与
Dim V()作为变量
'设置源和结果工作表、范围
设置wsSrc=工作表(“表5”)
设置wsRes=工作表(“表6”)
设置rRes=wsRes.Cells(1,1)
'将源数据获取到vba数组中
与wsSrc
lLastRowCol=LastRowCol(wsSrc.Name)
vSrc=.Range(.Cells(1,1),.Cells(lLastRowCol(0),lLastRowCol(1)))
以
'收集并合并数据
Set dD=新字典
重拨V(2至UBound(vSrc,1))
对于J=1至UBound(vSrc,2)
如果不存在dD.Exists(vSrc(1,J)),则“设置新字典项”
对于I=2至UBound(vSrc,1)
V(I)=vSrc(I,J)
接下来我
dD.添加键:=vSrc(1,J),项:=V
“Else”合并列
对于I=2至UBound(vSrc,1)
如果vSrc(I,J)“,则
V=dD(vSrc(1,J))
V(I)=vSrc(I,J)
dD(vSrc(1,J))=V
如果结束
接下来我
如果结束
下一个J
'将结果写入输出数组
重拨VRE(0到UBound(vSrc,1)-1,1到dD.Count)
'标题
J=0
Dim V1作为变型
对于dD.键中的每个V1
J=J+1
vRes(0,J)=V1
下一个V1
"数据,
对于J=1至UBound(vRes,2)
I=0
对于dD中的每个V1(vRes(0,J))
I=I+1
vRes(I,J)=V1
下一个V1
下一个J
“写下结果
设置rRes=rRes。调整大小(UBound(vRes,1)+1,UBound(vRes,2))
与rRes
.全部清除
.Value=vRes
带.行(1)
.Font.Bold=True
.HorizontalAlignment=xlCenter
以
.全自动装配
以
端接头
私有函数LastRowCol(Worksht作为字符串)作为Long()
将WS设置为工作表,R设置为范围
调暗LastRow和LastCol一样长
尺寸L(1)与长度相同
设置WS=工作表(Worksht)
与WS
设置R=.C