【问题标题】:Concatenate an unknown number of cells连接未知数量的单元格
【发布时间】:2018-10-24 02:20:37
【问题描述】:

这是我最初的问题的后续问题,它帮助我解决了脚本的第一部分:Autofill unknown amount of cells

我的脚本的第二部分是连接未知数量的单元格。 使用第一个问题中的逻辑,我尝试将我的脚本更改为 myconcatenate = ActiveCell.FormulaArray = "=Concatenate("A5", mylastcell_4)" 但这会导致语法错误。

最初我得到了这段脚本,它自己运行良好,但添加到我的脚本底部时不起作用

  Do
    myconcatenate = myconcatenate & ActiveCell.Value
    ActiveCell.Offset(0, 1).Select
  Loop Until ActiveCell.Address = mylastcell_5

  Range("A5").Select
  ActiveCell.Value = myconcatenate

这会产生 运行时错误“1004”应用程序定义或对象定义错误,并将转到第 5 行的最后一个单元格(即使我目前在第 1 行中只占用了 5 个单元格) ) 并且在它通过所有单元格时什么也不做。有时它会执行脚本的第一部分(将 '' 添加到单元格值中),其他时候则不会。

这是我的完整上下文脚本:Screenshot of full script

最终,我试图从 abcddf 列表中获取 'a'、'b'、'c'、'd'、'e'、'f',进入一个单元格。

最终目标图片:

第 5 行单元格 D 给出了我想要的最终答案,E5 将是 mylastcell_5

这是我使用 VBA 的第一天,我花了一整天的时间在谷歌上搜索并尝试回答问题,但这对我来说没有任何结果。

更新:我已经声明了我以前没有做过的 mylastcell_5。我现在在脚本中没有收到任何错误,它只是在 A5 处闲逛而不是到页面的最后,但它实际上并没有连接。

所以我认为我需要以某种方式更改我的循环,以便它写入第 5 行但从第 4 行读取......但我不知道该怎么做。

Option Explicit
Sub concat()
'
' concat Macro
' 'text','text'
'
' Keyboard Shortcut: Ctrl+Shift+C
'
With ThisWorkbook.Worksheets("Sheet1")
Dim mylastcell_1 As String, mylastcell_2 As String, mylastcell_3 As String, mylastcell_4 As String, mylastcell_5 As String, myconcatenate As String, myconcatenate1 As String
    Range("A1").Select
    Selection.End(xlToRight).Select
    mylastcell_1 = ActiveCell.Address

    Range(mylastcell_1).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_2 = ActiveCell.Address

    Range(mylastcell_2).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_3 = ActiveCell.Address

    Range(mylastcell_3).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_4 = ActiveCell.Address

    Range(mylastcell_4).Select
    ActiveCell.Offset(1, 0).Select
    mylastcell_5 = ActiveCell.Address

    myconcatenate = ActiveCell.Value
    ActiveCell.Offset(0, 1).Select


    Range("A2").Select
    Selection.End(xlToRight).Select
    Range("A2").Select
    Range("A2", mylastcell_2).Select
    Selection.FormulaArray = "''"
    Range("A3").Select
    Range("A3", mylastcell_3).Select
    Selection.FormulaArray = "'',"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "=CONCATENATE(R[-2]C,R[-3]C,R[-1]C)"
    Range("A4").Select
   .Range(.Cells(4, "A"), .Cells(1, .Columns.Count).End(xlToLeft).Offset(3, 0)).Formula = "=concatenate(a2, a1, a3)"
    Range("A5").Select

Do
        myconcatenate = myconcatenate & ActiveCell.Value
        ActiveCell.Offset(0, 1).Select

    Loop Until ActiveCell.Address = mylastcell_5

    Range("A5").Select
    ActiveCell.Value = myconcatenate




End With
End Sub

【问题讨论】:

  • 请更新您的问题以在屏幕截图中包含完整代码。完成后,将Option Explicit 添加到模块顶部并修复所有编译错误。你得到 1004 是因为 mylastcell_5 从未被定义。
  • 哪个版本的 Excel?
  • @Comintern 我已经更新了脚本,不再出现错误,但它仍然没有做任何我想做的事情。
  • @Vasily Excel 版 Professional Plus 2016
  • 您忘记了 editing your question 的部分以包含完整代码而不是 a screenshot of your code

标签: excel vba concat


【解决方案1】:

我不知道你是否总是打算将元素连接成一个单引号括起来的逗号分隔字符串,但如果你这样做,这里有几种方法可以做到这一点(我发现它对于快速将内容插入到例如 SQL 语句)。一个连接垂直字符串(单列),一个连接水平字符串(单行)。这将是一个标准工作表函数,您可以在其中输入 =hjoin(a1:h1)=vjoin(a1:a7) 之类的内容

Function hJoin(inRng As Range) As String
Dim c As Range
Dim outStr As String
Dim rng As Range

Set rng = Range(inRng.Address)


For Each c In rng.Columns
    If c.Address = rng.Cells(rng.Cells.Count).Address Then
            outStr = outStr & " '" & c.Value & "'"
        Else
            outStr = outStr & " '" & c.Value & "',"
        End If
    Next c

hJoin = outStr

End Function

Function vJoin(inRng As Range) As String
Dim c As Range
Dim outStr As String
Dim rng As Range

Set rng = Range(inRng.Address)


For Each c In rng.Rows
    If c.Address = rng.Cells(rng.Cells.Count).Address Then
         outStr = outStr & " '" & c.Value & "'"
    Else
         outStr = outStr & " '" & c.Value & "',"
    End If
Next c

vJoin = outStr

End Function

【讨论】:

  • 嗨 Oxwilder,它要求定义 c,我将其定义为什么?
  • 当输入框出现时,您是否选择了要添加到列表中的单元格范围?您可以用鼠标选择范围或在框中键入一组单元格。
  • 我最终将 c 定义为一个范围,使该部分感到高兴,因此我可以实际运行该工具。但是当我将我选择的值复制到输入框中时,我从 Excel 中收到一个错误,说公式有问题。我试图通过将输入框更改为 Range("A1").Select 将输入框更改为选择集 rng = Selection.End(xlToRight).Select。但它实际上并没有做任何事情。
  • 不,您不想添加这些值。您只需选择值所在的单元格。将鼠标拖到包含要连接的数据的单元格上。
  • 我已经选择了这些值,看起来它做了一些事情,但是根本没有输出。
猜你喜欢
  • 2019-02-11
  • 1970-01-01
  • 2012-10-12
  • 2014-12-14
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多