连接数量未知的单元格

时间:2018-10-24 02:20:37

标签: excel vba concat

这是我最初提出的问题的后续问题,它帮助我解决了脚本的第一部分: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

最终,我试图将abcdedf列表中的“ a”,“ b”,“ c”,“ d”,“ e”,“ f”放入一个单元格中。

最终目标图片:
Ultimate goal picture
第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

1 个答案:

答案 0 :(得分:0)

我不知道您是否总是打算将元素连接成单引号括起来的逗号分隔的字符串,但是如果您在此处这样做,则有两种方法可以做到这一点(我发现它对于将内容快速插入其中很有用。 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