ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > 综合应用 > 将列数据加字符后合并至单元格内的方法及探讨

将列数据加字符后合并至单元格内的方法及探讨

作者:绿色风 分类: 时间:2022-08-18 浏览:175
楼主
lrlxxqxa
先看下问题:如何将C4:C13的数据用函数提取并用"/"合并在B2单元格中?


 

一、函数解法:

方法1:在D4输入
  1. =IF(C5<>"",C4&"/"&D5,C4&D5)
下拉填充


 

方法2:先用&连接区域列内各个单元格与"/",再利用SUBSTITUTE清除多余的"/";此处利用了REPT和COUNT的配合来统计多余的"/"的个数
  1. =SUBSTITUTE(C4&"/"&C5&"/"&C6&"/"&C7&"/"&C8&"/"&C9&"/"&C10&"/"&C11&"/"&C12&"/"&C13,REPT("/",10-COUNT(C4:C13)),)
方法3:思路与解二相通,细节处理是先利用了空格来连接多个单元格,然后利用TRIM的特性(去除字符串首尾空格,各字符间只留一个空格)来去除首尾空格并保留中间的每一个空格,再把空格替换为需要的字符(此题中为"/")
  1. =SUBSTITUTE(TRIM(C4&" "&C5&" "&C6&" "&C7&" "&C8&" "&C9&" "&C10&" "&C11&" "&C12&" "&C13)," ","/")
方法4:先构建辅助列将源数据列中的数值转化为文本格式,然后利用PHONETIC的文本连接功能(先连接行后连接列,忽略数值)实现要求效果


 

此处引发的一点思考也与大家分享一下:见附件中的“讨论区”


 

在构建辅助列的时候,我们可以利用=TEXT(A2,"[>0]0.0;;;")来保留源格式中小数点后第二个0,也可以用=OFFSET($A$1,ROW(A1),)&"/"实现;但二者的结果还是不能被PHONETIC处理,于是想到用=TEXT(OFFSET($A$1,ROW(A1),),"[>0]0.0;;;")&"/"处理,可也不满足PHONETIC的参数要求是REFERENCE的要求;再想到INDIRECT,用=INDIRECT(TEXT({21;31;41;51;61;71;81;91;101;111},"r00c0"),)得到的结果是{100;200;300;400.5;500.6;800.9;0;0;0;0},又成了数值,所以套用PHONETIC函数后得到的是{"";"";"";"";"";"";"";"";"";""};至此搁置。我们再来看看其他解法。

二、VBA解法:

解1:自定义函数
  1. Function joinrng(rng As Range) As String
  2.   Application.Volatile
  3.   Dim rng0 As Range, str1 As String, i As Long, j As Long
  4.   For Each rng0 In rng.Areas
  5.     arr = rng0.Value
  6.     For i = 1 To UBound(arr, 1)
  7.       For j = 1 To UBound(arr, 2)
  8.         If arr(i, j) <> "" Then str1 = str1 & "/" & arr(i, j)
  9.     Next j, i
  10.   Next
  11.   joinrng = Mid(str1, 2)
  12. End Function
解2:
  1. Function abc(rng As Range) As String
  2. Dim rng1 As Range
  3.   For Each rng1 In rng
  4.     If Len(rng1) > 0 Then abc = abc & "/" & rng1
  5.   Next
  6. abc = Mid(abc, 2)
  7. End Function
解3:

  1. Sub test()
  2. Dim rng As Range, str As String
  3. For Each rng In [C4:C13]
  4.   If Len(rng.Value) <> 0 Then
  5.      str = str & "/" & CStr(rng.Value)
  6.   End If
  7. Next
  8. [B2] = Right(str, Len(str) - 1)
  9. End Sub
解4:
  1. Function test(rng As Range)
  2. arr = rng.Value
  3. Dim arrr()
  4. a = 1
  5. For Each rngg In arr
  6. If rngg <> "" Then
  7. ReDim Preserve arrr(1 To a)
  8. arrr(a) = rngg
  9. End If
  10. a = a + 1
  11. Next
  12. test = Join(arrr, "/")
  13. End Function


三、基础操作实现:


 

在查找内容中按CTRL+ENTER或者ALT+10(小键盘)
提取并合并.rar
2楼
larkzh
强!学习了。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap