根据公用单元格连接(Excel)行,包括不同的列

时间:2018-09-19 19:51:57

标签: excel vba csv

我一直在寻找一种基于常见单元格来连接我的Excel(或任何其他工具/软件处理表)行的方法。例如:

我有这个制表位分隔表。每个值都在单独的行中:

angeb*    12      16      18    
zyste*        60      61        
zynisch*      12            
zyste*        60            
abstreit*     70            
anflunker*    70            
angeb*    70    

我想以这样的方式串联行:

angeb*    12      16      18      70
zyste*        60      61        
zynisch*      12                    
abstreit*     70            
anflunker*    70

它确实可以按照this tutorial中的建议进行工作,但是它仅将单个单元格值连接到另一个单个单元格中。我还尝试过this so question提出的基本方法,最后将我引向VLOOKUP(description)。但是它们都串联在细胞中。

基本上很简单,我需要合并具有相同列1的单元格,但要保留这些列,只是将它们串联起来。一旦将第二行添加到第一行,便可以将其删除。我尝试改编以上脚本,但无法一步一步地完成工作,只能将逗号分隔的值转换为单元格并将其复制到新列中。我不是VBA的专家,但这似乎是一个非常简单的功能,我可能会缺少一些东西。任何帮助是极大的赞赏。

2 个答案:

答案 0 :(得分:0)

enter image description here

我已经完成了每个部分的编写和颜色编码,但这是常规方法:

  1. 按字母A-Z排序所有数据
  2. 使用CountIf语句计算特定数据行显示的次数。
  3. 假设有3列数据,找到MaxRows的MAX(),然后相乘(此处,观察到的3列x 2行最多=最多6个数据)。
  4. 复制标签,删除重复的标签[绿色],这样您就可以得到一张简明的表格。
  5. 使用IndexMatch公式以及IF和IFERROR语句对数据进行重新排序。请注意,P-Q列为+1)

问题-您仍然可以保持差距,但是现在都在同一行中!

以下是有关我的制作方法的快速YouTube视频。 TSpinde Answer 1

答案 1 :(得分:0)

您的问题让我有些困惑,所以我只串联了完全相同的名称。

所以我的代码的工作方式是创建一个标签数组,当遇到一个已经存在的标签时,它会寻找原始行中的下一个空插槽。然后,它将值添加到其中并执行此操作,直到它击中新行中的空白单元格为止。降低lastrow值并更改其所在的行有些有趣的事情,但这对于在下一个周期中移至正确的数据行很有必要。

此宏假定所有可能的数据条目都是并排的,例如,如果D2为空,则C2和E2中将没有值。

Sub macro()

Dim LastRow As Long
Dim LastCol As Long
Dim TagArray() As String
Dim count As Long
Dim i As Long
Dim j As Long
Dim PreExisting As Boolean
Dim Targetrow As Long

ReDim TagArray(1 To 1)
LastRow = Worksheets(1).Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastCol = Worksheets(1).Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
TagArray(1) = Worksheets(1).Range("A1").Value

For i = 2 To LastRow
    PreExisting = False

    For j = 1 To UBound(TagArray)
        If Worksheets(1).Cells(i, 1) = TagArray(j) Then
            PreExisting = True
            Targetrow = j
            Exit For
        End If
    Next j

    If PreExisting Then
        For j = 2 To LastCol
            If Not IsEmpty(Worksheets(1).Cells(i, j)) Then
                For count = 1 To LastCol
                    If IsEmpty(Worksheets(1).Cells(Targetrow, count)) Then
                        Worksheets(1).Cells(Targetrow, count) = Worksheets(1).Cells(i, j)
                        Exit For
                    Else
                        If count = LastCol Then
                            LastCol = LastCol + 1
                            Worksheets(1).Cells(Targetrow, LastCol) = Worksheets(1).Cells(i, j).Value
                        End If
                    End If
                Next count
            Else
                Exit For
            End If
        Next j
        Worksheets(1).Rows(i).Delete
        LastRow = LastRow - 1
        i = i - 1
    Else
        ReDim Preserve TagArray(1 To UBound(TagArray) + 1)
        TagArray(UBound(TagArray)) = Worksheets(1).Cells(i, 1)
    End If

Next i

End Sub

希望,如果您想在VBA中使用它而不是工作表功能,那么您会发现它很有用。