Excel 将多个单元格值粘贴到单个单元格中
我试图将一系列单元格(A1:A50)的值复制到单个单元格(B1)中。我可以手动将单元格复制到剪贴板,然后将剪贴板粘贴到B1的formuala栏中,但除了将单元格复制到剪贴板,我找不到在宏中执行此操作的方法 希望有人能帮我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
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,这似乎给了我想要的结果。除此之外,它非常完美。非常感谢。