【问题标题】:How to concatenate cells in a row until the first blank cell如何连续连接单元格直到第一个空白单元格
【发布时间】:2016-11-07 20:44:08
【问题描述】:

我目前是第一次深入研究代码/VBA 编码。我有一个文件,我将其转储到当前我正在手动组织和推出的工作表中。当放入工作表时,它会在单元格之间划定界限。前 2-4 个单元格始终是名称的一部分。每次我在给定的一天得到它并转储到工作表中时,这个转储文件都会有不同的行和列长度。例如,一天可能是二十行,一天可能是三十。

这是数据外观的粗略说明,但我的代码可能与下面的示例不匹配 - 我只是想提供一个视觉效果:

所以,我想编写从 A1 开始的代码,并将其后面的单元格连接起来,直到它遇到该行中的空白单元格。然后它将连接的数据放入单元格 A1 并删除它从中提取名称片段的值并将所有数据滑动到左侧。之后,它在下一行继续相同的操作,直到遇到最后一行。如图所示,我不希望空白单元格之后的任何数据受到影响。

这是我第一次编程,所以当您提供帮助时,请您解释一下您的代码以便我学习这些概念吗?这是我认为到目前为止可行的方法......我只是坚持如何进行连接。

我目前拥有的代码:

Sub DN_ERROR_ORGANIZER()
  Dim row As Integer
  NumRows = Range("A1", Range("A1").End(xldown)).Rows.Count
  Range("A1").Select
  For row = 1 To NumRows
      Do Until IsEmpty(ActiveCell)
          ' Code to concatenate
          ActiveCell.Offset(1, 0).Select
      Loop
      ActiveCell.Offset(1, 0).Select
  Next
End sub

【问题讨论】:

  • 根据您的数据,John Doe 的行似乎最终会成为“Doe,John Data”。
  • 您可以找到公式中的最后一个单元格。您可以使用这个人所做的将其转换为连接公式。 excelcampus.com/keyboard-shortcuts/concatenate-range-of-cells
  • @Mat'sMug 我想做的编码类型将在第一次出现空白单元格时停止。对于第 2 行,代码将执行 A2 + "、" + B2 + " " + C2,在 C2 处停止,因为 D2 是一个空白单元格,将循环到目前为止的内容放入 A2,删除原本在 A2、B2 中的内容,和 C2 ,将单元格向左移动,并继续对下一行进行相同的操作。对于第 3 行,代码将改为执行 A3 + ", " + B3,在 B3 处停止,因为 C3 是空白单元格,将循环到目前为止的内容放入 A3,删除最初在 A3 和 B3 中的内容,将单元格移动到离开,然后进入下一行。
  • 知道了。不过,您肯定要避免使用 .Select.Activate

标签: vba excel excel-formula


【解决方案1】:

这是查看问题的另一种方法:假设您的表格在 Sheet2 上,结果反映在 Sheet1 上。

Sub PutInOrder()
  filledcells = 0
  '''lastrow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row

  For i = 1 To 100
     If Sheet2.Cells(i, 1) = "" Then Exit For 
     For a = 1 To 4
        If Sheet2.Cells(i, a) = "" Then Exit For
          If Sheet2.Cells(i, a) <> "" Then
             filledcells = filledcells + 1
        End If
    Next

Select Case filledcells
    Case Is = 2

        Sheet1.Cells(i, 1) = Sheet2.Cells(i, 1) + ", " + Sheet2.Cells(i, 2)
        Sheet1.Cells(i, 3) = Sheet2.Cells(i, 4)
        Sheet1.Cells(i, 4) = Sheet2.Cells(i, 5)
        Sheet1.Cells(i, 5) = Sheet2.Cells(i, 6)
        Sheet1.Cells(i, 6) = Sheet2.Cells(i, 7)


    Case Is = 3

        Sheet1.Cells(i, 1) = Sheet2.Cells(i, 1) + ", " + Sheet2.Cells(i, 2) + " " + Sheet2.Cells(i, 3)
        Sheet1.Cells(i, 3) = Sheet2.Cells(i, 5)
        Sheet1.Cells(i, 4) = Sheet2.Cells(i, 6)
        Sheet1.Cells(i, 5) = Sheet2.Cells(i, 7)
        Sheet1.Cells(i, 6) = Sheet2.Cells(i, 8)


    Case Is = 4

        Sheet1.Cells(i, 1) = Sheet2.Cells(i, 1) + ", " + Sheet2.Cells(i, 2) + " " + Sheet2.Cells(i, 3) + " " + Sheet2.Cells(i, 4)
        Sheet1.Cells(i, 3) = Sheet2.Cells(i, 6)
        Sheet1.Cells(i, 4) = Sheet2.Cells(i, 7)
        Sheet1.Cells(i, 5) = Sheet2.Cells(i, 8)
        Sheet1.Cells(i, 6) = Sheet2.Cells(i, 9)

   End Select
   filledcells = 0
 Next
 End Sub

【讨论】:

  • 您使代码看起来比我最初处理它的方式要简单得多。但是,每个案例的 cat 行下方的行的目的是什么?我还收到“lastRow = Sheet2.Cells(Rows.Count, 1).End(xlUp).row”行的“运行时错误'424':需要对象”。您能否指导我完成声明 lastRow 的操作,以便我可以尝试解决问题?
  • lejaregg,这条线-
  • lejaregg, "lastrow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row" 行计算包含数据的行数,不多。我假设数据在另一张纸上,您需要将结果反映在其他纸上。所以上面的代码在 Sheet2 上查找数据。而且,为了使代码在不产生错误消息的情况下工作,Sheet2 应该有一些数据应该是显而易见的)。顺便说一句,我无法弄清楚您的问题:“每个案例的“猫”行下方的行的目的是什么?但是,让我说选择案例中的代码将您的数据放在您想要的位置。
  • Sheet1.Cells(i, 3) = Sheet2.Cells(i, 4) Sheet1.Cells(i, 4) = Sheet2.Cells(i, 5) Sheet1.Cells(i, 5) = Sheet2.Cells(i, 6) Sheet1.Cells(i, 6) = Sheet2.Cells(i, 7)
  • lejaregg,您在评论中添加的代码将 sheet2 中的 4 个数据单元格放入 Sheet1 中以 C 列开头的单元格中。如在此示例中,您的数据从 D 列到 I 列传播,选择案例决定将 Sheet2 中的哪些数据放入 Sheet1 上的单元格中,从 C 列到 F 列中的单元格开始。
【解决方案2】:

你能试试这个,让我知道你的情况吗?根据您的精确布局,它可能需要一些调整。我的方法略有不同。

 Sub x()

Dim n As Long, r1 As Range, r2 As Range, v

For n = 1 To Range("A" & Rows.Count).End(xlUp).Row
    On Error Resume Next
    Set r1 = Cells(n, 1).EntireRow.SpecialCells(xlCellTypeConstants).Areas(1)
    Set r2 = Cells(n, 1).EntireRow.SpecialCells(xlCellTypeConstants).Areas(2)
    If Not r1 Is Nothing And Not r2 Is Nothing Then
        v = Join(Application.Transpose(Application.Transpose(r1)), ", ")
        Cells(n, 1) = WorksheetFunction.Proper(v)
        Cells(n, 2).Resize(, r1.Count).Clear
        r2.Cut Cells(n, 3)
    End If
Next n

End Sub

【讨论】:

  • 我收到运行时错误“1004”:未找到单元格。进入调试器时,它会突出显示 for 循环中的第一行?
  • 我已经修改了上面的代码。如前所述,错误可能是由于您的布局可能与我假设的不同(A1 中的数据向下和交叉)。
  • 不幸的是,代码现在根本没有做任何事情。但是,您假设格式是正确的 - 就是这样。
  • 我刚刚根据您图片中设置的数据对其进行了测试,并且效果很好。你的实际布局一定不一样?我认为您不能在此处发布文件(?),但也许您可以在其他地方上传示例并链接?
  • 抱歉,我应该代表所有应该显示的数据。这更准确地代表了我所拥有的一切。 i.imgur.com/2a1T1gY.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2017-09-27
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多