ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7114|回复: 19

[原创] 高级字符连接函数,可用于工作表及vba,可接受内存数组及各类型混合参数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-4-15 13:30 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 百度不到去谷歌 于 2014-4-15 13:35 编辑

EXCEL的工作表函数做字符连接极不方便 就是vba的join局限性也很大
为此学习借鉴整理了一个字符连接通用函数,可接受不同类型参数,单元格区域,数组以及单个参数可随意混合组合传入
输出结果可跳过空值,可指定分隔符,在需要大量字符串连接的时候,可以方便的调用
以剩下时间专注于业务逻辑,这个函数我在sql中用作构造 表.z字段非常好用
已知了表头 和表名 表1构造一个表名与字段的连接 字符串用这个极其方便
字段1字段2字段3字段4字段5字段6字段7字段8字段9
debug.Print [ConTxt(",","[表1$]." &A1:D1,"[表2$.]" &E1:I1)]直接可得到以下结果
[表1$].字段1,[表1$].字段2,[表1$].字段3,[表1$].字段4,[表2$.]字段5,[表2$.]字段6,[表2$.]字段7,[表2$.]字段8,[表2$.]字段9

当然还有其他很多好用的地方 希望能帮到有需要的人
工作表中使用实例

QQ截图20140415131359.jpg

代码如下 未严格测试 若有错漏欢迎指正
  1. '-----------Sub ConTxt----------Copyright@百度不到去谷歌 QQ80871835 2014/4/15---------------------------
  2. '功能 : 高级合并文本函数,结果返回一个参数合并后的字符串,忽略空值,使用第一参数做为分隔符,可接受数组参数
  3. '变量 : Dilimitetr  分隔符
  4. '       args        源数据,可接受多个参数及数组参数,以及他们的混合
  5. '---------------------------------------------------------------------------------------------------------
  6. Function ConTxt(Dilimitetr$, ParamArray Args() As Variant) As Variant
  7. '第一参数为分隔符,后续会可选多区域多类型,空值将被忽略
  8. '可传递内存数组参数
  9.     Dim tmptext As Variant, i As Variant, cellv As Variant
  10.     Dim cell As Range
  11.     tmptext = ""
  12.     For i = 0 To UBound(Args) '遍历参数数组
  13.         If Not IsMissing(Args(i)) Then '判断参数是否有效
  14.             Select Case Right(TypeName(Args(i)), 2) '对不同的参数类型采取不同的处理方式,数组类型可能有多种类型,所以判断最后一个字符
  15.             Case "ge" 'Range单元格区域类型,直接遍历
  16.                 For Each cell In Args(i)
  17.                     If cell <> "" Then
  18.                         tmptext = tmptext & Dilimitetr & cell
  19.                     End If
  20.                 Next cell
  21.             Case "()"  '数组类型,
  22.                 For Each cellv In Args(i)
  23.                     If cellv <> "" Then tmptext = tmptext & Dilimitetr & cellv
  24.                 Next cellv
  25.             Case Else '其他类型,即单个值参数
  26.                 If Args(i) <> "" Then tmptext = tmptext & Dilimitetr & Args(i)
  27.             End Select
  28.         End If
  29.     Next i
  30.     ConTxt = Mid(tmptext, 2) '去掉开头多余分隔符
  31. End Function

  32. Public Sub test()
  33.     Dim a As Variant
  34.     a = Split("1 2 3 4", " ")
  35.     Debug.Print ConTxt(",", 0, a, "12")
  36.     Debug.Print ConTxt(",", [D1:D10])
  37.     Debug.Print ConTxt(",", 1, 2, "阿斯顿")
  38. End Sub
复制代码
VBA-自定义字符连接函数.rar (15.71 KB, 下载次数: 393)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-4-15 14:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-15 21:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-23 11:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
复制到自己的自定义函数加载宏中了,目前好用哦!给你16个赞

TA的精华主题

TA的得分主题

发表于 2014-7-23 11:08 | 显示全部楼层
复制到自己的自定义函数加载宏中了,目前好用哦!给你16个赞

TA的精华主题

TA的得分主题

发表于 2016-6-15 10:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-21 14:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-5-4 23:19 | 显示全部楼层
本帖最后由 yzlsc 于 2017-5-4 23:30 编辑

谢谢,学习了。但楼主的代码没有考虑忽略逻辑值,以及合并日期型数据。试着修改了一下,请指教!

  1. Function ConTxt(Delimiter As String, ParamArray SourceArray() As Variant) As String
  2.   
  3.     '功能:合并文本、数值及日期函数,返回一个合并后的字符串,使用第一参数做为分隔符。
  4.     '      忽略空值和逻辑值,可接受数组和单元格区域,也可嵌套IF函数。
  5.     '参数:Delimiter,合并后字符串间的分隔符。
  6.     '      SourceArray,源数组,可接受多个参数,包括单个数值、字符串以及数组和单元格区域,可以混合调用。
  7.    
  8.     '说明:1、如果传递的参数中没有嵌套IF函数,即使有日期型数据,都可以直接调用。
  9.     '      2、如果传递的参数中嵌套了IF函数,并且IF函数判断后的结果中有日期型数据时,
  10.     '         传递参数前,要用TEXT函数把日期型数据转换为字符型。
  11.     '         因为这时实际传递的是数组,日期型数据在数组中其实已是若干“数值”,
  12.     '         与真正的数值型数据是没法区分的。所以,要在传递参数前进行转换。
  13.     '         例如: D列数值型,B列字符型,C列日期型
  14.     '         输入数组公式: =ConTxt(",",IF(D2:D7>5000,B2:B7 & TEXT(C2:C7,"yyyy-m-d")))

  15.     Dim S As String, L As Long, R2 As String, vData
  16.     If IsMissing(SourceArray) Then
  17.         Exit Function
  18.     Else
  19.         '若调用公式形如: = ConTxt(",",) 也退出
  20.         If TypeName(SourceArray(0)) = "Error" Then Exit Function
  21.     End If
  22.    
  23.     For L = 0 To UBound(SourceArray)   '遍历参数数组
  24.         R2 = Right(TypeName(SourceArray(L)), 2)
  25.         If R2 = "ge" Or R2 = "()" Then   'Range类型或数组类型
  26.             For Each vData In SourceArray(L)
  27.                 If vData <> "" And vData <> True And vData <> False Then
  28.                     S = S & Delimiter & IIf(IsDate(vData), Application.Text(vData, "yyyy-m-d"), vData)
  29.                 End If
  30.             Next vData
  31.         Else   '其他类型,即单个值参数
  32.             'If SourceArray(L) <> "" Then S = S & Delimiter & _
  33.             '    IIf(IsDate(SourceArray(L)), Application.Text(SourceArray(L), "yyyy-m-d"), SourceArray(L))
  34.             If SourceArray(L) <> "" Then S = S & Delimiter & SourceArray(L)
  35.         End If
  36.     Next L
  37.     ConTxt = Mid(S, Len(Delimiter) + 1)   '去掉开头多余分隔符
  38.    
  39. End Function
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-4 23:46 | 显示全部楼层
yzlsc 发表于 2017-5-4 23:19
谢谢,学习了。但楼主的代码没有考虑忽略逻辑值,以及合并日期型数据。试着修改了一下,请指教!

挺好的  适用性更广了

TA的精华主题

TA的得分主题

发表于 2017-5-30 23:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
喜欢这种高水平的分享
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-28 21:22 , Processed in 0.060975 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表