0

此问题在 Excel .xls 文件中。

最简单的用例:

A 列有一行。B 列有 5 行。B 列中的 5 行需要合并为一行,由换行符分隔。

我有一个巨大的 .xls 文档,其中 A 列中有大量 ID。A 列的每一行平均有 3 到 10 行。

如何知道 B 列的哪些行属于 A 列?通过细胞的定位。一列 A 行的右侧可能有 5 列 B 行。

我没有任何VBA经验。我四处寻找宏和函数,但没有找到任何与此问题匹配的东西。

编辑:我现在正试图弄清楚如何让脚本忽略在 A 列和 B 列之间具有一对一映射的行。

再次编辑 - 2012 年 6 月 20 日:现在我可以附加图像,这是我想要获取的图像的屏幕截图。
Brian 和 Mark 的行应该被忽略,而 Scott 和 Tim 会复制他们的值。

我正在寻找的结果


编辑:取消合并列 A,使用 Andy 提供的代码,然后使用这个 VB 脚本就可以了:

Sub mergeA()
For i = 2 To Cells(65535, 1).End(xlUp).Row
If IsEmpty(Cells(i, 1)) Then Range(Cells(i - 1, 1), Cells(i, 1) ).Merge
Next
End Sub

该VB脚本将A列中的单元格重新组合在一起
我没有制作脚本,它来自这个网页:
http ://www.vbforums.com/showthread.php?t=601304

4

1 回答 1

1

这会将左侧显示的数据转换为右侧的输出:

在此处输入图像描述 在此处输入图像描述

Option Explicit

Sub Make_Severely_Denormalized()
  Const HEADER_ROWS As Long = 1
  Const OUTPUT_TO_COLUMN As Long = 3
  Const DELIMITER As String = vbNewLine
  Dim A_Range As Range
  Dim B_Range As Range
  Dim A_temp As Range
  Dim B_temp As Range
  Dim B_Cell As Range
  Dim Concat As String

On Error GoTo Whoops
  Set A_Range = Range("A1").Offset(HEADER_ROWS)
  Do While Not A_Range Is Nothing
    Set B_Range = A_Range.Offset(0, 1)

    ' some helper ranges
    If A_Range.Offset(1, 0).Value = "" Then
      Set A_temp = Range(A_Range, A_Range.End(xlDown).Offset(-1, 0))
    Else
      Set A_temp = A_Range.Offset(1, 0)
    End If
    Set B_temp = Range(B_Range, B_Range.End(xlDown)).Offset(0, -1)

    ' determine how high "B" is WRT no change in "A"
    Set B_Range = Range(B_Range, B_Range.Resize( _
      Application.Intersect(A_temp, B_temp, ActiveSheet.UsedRange).Count))

    ' loop through "B" and build up the string
    Concat = ""
    For Each B_Cell In B_Range
      Concat = Concat & B_Cell.Value & DELIMITER
    Next
    Concat = Left(Concat, Len(Concat) - Len(DELIMITER))

    ' do the needful
    A_Range.Offset(0, OUTPUT_TO_COLUMN - 1).Value = Concat

    ' find the next change in "A"
    If A_Range.Offset(1, 0).Value = "" Then
      Set A_Range = Application.Intersect(A_Range.End(xlDown), ActiveSheet.UsedRange)
    Else
      Set A_Range = A_Range.Offset(1, 0)
    End If
  Loop
  Exit Sub
Whoops:
  MsgBox (Err & " " & Error)
  Stop
  Resume Next
End Sub
于 2012-06-08T00:02:03.013 回答