Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将多个单元格值粘贴到单个单元格中_Excel_Vba - Fatal编程技术网

Excel 将多个单元格值粘贴到单个单元格中

Excel 将多个单元格值粘贴到单个单元格中,excel,vba,Excel,Vba,我试图将一系列单元格(A1:A50)的值复制到单个单元格(B1)中。我可以手动将单元格复制到剪贴板,然后将剪贴板粘贴到B1的formuala栏中,但除了将单元格复制到剪贴板,我找不到在宏中执行此操作的方法 希望有人能帮我 Sheet1.Range("A1:A50").SpecialCells(xlCellTypeConstants).Select Selection.Copy 我希望B1单元的内容如下所示: 单元格A1的值 单元格A2的值 单元格A3的值 …等等 Sub m

我试图将一系列单元格(A1:A50)的值复制到单个单元格(B1)中。我可以手动将单元格复制到剪贴板,然后将剪贴板粘贴到B1的formuala栏中,但除了将单元格复制到剪贴板,我找不到在宏中执行此操作的方法

希望有人能帮我

Sheet1.Range("A1:A50").SpecialCells(xlCellTypeConstants).Select
Selection.Copy
我希望B1单元的内容如下所示:

单元格A1的值

单元格A2的值

单元格A3的值

…等等

Sub myConcat(rSource As Range, rTarget As Range, Optional sDelimiter = vbCrLf)
Dim oCell As Range
Dim sRes As String
    sRes = vbNullString
    For Each oCell In rSource
        sRes = sRes & sDelimiter & oCell.Text
    Next oCell
    rTarget.Value = Right(sRes, Len(sRes) - Len(sDelimiter))
End Sub
从代码中调用它,就像

Sub tst_myConcat()
    Call myConcat([A1:A50], [B1])
End Sub
当然,此过程可以很容易地转换为函数:

Function myConcat(rSource As Range, Optional sDelimiter = vbCrLf)
Dim oCell As Range
Dim sRes As String
    sRes = vbNullString
    For Each oCell In rSource
        sRes = sRes & sDelimiter & oCell.Text
    Next oCell
    myConcat = Right(sRes, Len(sRes) - Len(sDelimiter))
End Function
在这种情况下,只需写入目标单元格(B1)
=myConcat(A1:A50)

不要忘记在单元格格式中包含

要字符串的第一列
  • FirstColumnToString
    函数(
    UDF
    )有一个固定的分隔符(
    delimiter
    ),可以手动更改。但它可以执行以下操作:

    =FirstColumnToString(A1:A2,A4,A6:C8,Sheet2!A1:A3)
    
    它将丢弃错误值和零长度字符串(
    ),并仅从每个范围的第一列中选择值,例如在范围
    A6:C8
    中,它将从
    A6:A8
    中选择值

代码

Option Explicit

Function FirstColumnToString(ParamArray SourceRanges() As Variant) _
         As String
    
    Const Delimiter As String = vbLf & vbLf
    
    Dim RangesCount As Long
    RangesCount = UBound(SourceRanges) - LBound(SourceRanges) + 1
    Dim data As Variant
    ReDim data(1 To RangesCount)
    Dim Help As Variant
    ReDim Help(1 To 1, 1 To 1)
    
    Dim Element As Variant
    Dim RowsCount As Long
    Dim j As Long
    
    For Each Element In SourceRanges
        j = j + 1
        If Element.Rows.Count > 1 Then
            data(j) = Element.Columns(1).Value
        Else
            data(j) = Help
            data(j)(1, 1) = Element.Columns(1).Value
        End If
        RowsCount = RowsCount + UBound(data(j))
    Next Element
    
    Dim Result As Variant
    ReDim Result(1 To RowsCount)
    Dim Current As Variant
    Dim i As Long
    Dim k As Long
    
    For j = 1 To RangesCount
        For i = 1 To UBound(data(j))
            Current = data(j)(i, 1)
            If Not IsError(Current) Then
                If Current <> vbNullString Then
                    k = k + 1
                    Result(k) = Current
                End If
            End If
        Next i
    Next j
    ReDim Preserve Result(1 To k)
    
    FirstColumnToString = Join(Result, Delimiter)

End Function
选项显式
函数firstColumntString(ParamArray SourceRanges()作为变量)_
作为字符串
常量分隔符为String=vbLf&vbLf
昏暗的牧场
RangesCount=UBound(源范围)-LBound(源范围)+1
作为变量的Dim数据
ReDim数据(1到RangeSunt)
Dim Help作为变体
重拨帮助(1对1,1对1)
作为变体的Dim元素
昏沉的划船声
Dim j尽可能长
对于SourceRanges中的每个元素
j=j+1
如果Element.Rows.Count>1,则
数据(j)=元素。列(1)。值
其他的
数据(j)=帮助
数据(j)(1,1)=元素。列(1)。值
如果结束
ROWSCONT=ROWSCONT+UBound(数据(j))
下一个元素
作为变量的模糊结果
重拨结果(1至RowsCount)
作为变量的弱电流
我想我会坚持多久
暗k一样长
对于j=1至RangeSunt
对于i=1至UBound(数据(j))
电流=数据(j)(i,1)
如果不是IsError(当前),则
如果当前vbNullString,则
k=k+1
结果(k)=电流
如果结束
如果结束
接下来我
下一个j
重拨保留结果(1到k)
FirstColumnToString=Join(结果,分隔符)
端函数

一种更简单的方法是在Excel中使用TREXTJOIN函数:

With Sheet2.Range("A1:A50")
    .AutoFilter Field:=1, Criteria1:="<>"
    Sheet2.Range("B1").Value2 = WorksheetFunction.TextJoin(vbCrLf, True, _
        .SpecialCells(xlCellTypeVisible))
    .AutoFilter
End With
带活页2.范围(“A1:A50”)
.自动筛选字段:=1,标准1:=“”
Sheet2.Range(“B1”).Value2=工作表函数.TextJoin(vbCrLf,True_
.特殊单元格(xlCellTypeVisible))
.自动过滤器
以

1d阵列可能是第一个。您可以通过
Transpose
执行此操作,或者如果您的范围不是全部类型常量,请尝试循环并连接值。您希望如何连接A列值?逗号分隔?捣碎?新线?B1中需要什么类型的值?一串您可以将A1:A50读入数组,使用JOIN函数创建字符串,并将B1的.VALUE2属性设置为结果。不过,我们需要更多信息才能给出更完整的答案。我需要将每个单元格粘贴到新行上(与从列中复制的方式相同(a1:a50).B1单元格是格式化文本。您使用的Excel版本是什么?我使用的是Excel 2010Hi John。感谢您在这方面的帮助。您提供的代码确实有效,但不是我希望的方式。您的方法将所有单元格串成一长行文本。是否有方法粘贴列范围(a1:a50)进入单元格B1,但仍保持相同的格式/布局?这意味着单元格B1将包含单元格a2的值低于a1的值。希望这是有意义的。@Patrick你是说你现在看到的结果是一长行文本吗?别担心,它只是看起来像这样-实际上现在一个单元格中有50行。你只需要k单击Excel以正确显示结果。我将此添加到我的答案中。(顺便说一句,我将
vbCr
常量更改为
vbCrLf
——这将使代码在不同版本的Excel中正确工作,2010年甚至2003年都是如此)非常感谢您的帮助。我将vbCrLf更改为vbLf,这似乎给了我想要的结果。除此之外,它非常完美。非常感谢。