ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 写个文本合并函数练习,类似TEXTJOIN,老师们请勿笑话

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-12-2 08:29 | 显示全部楼层
cjc209 发表于 2020-12-1 21:27
内置的第一参数 可以为数组 这个不行 怎么改?

把第1参数的类型改为Validation,在代码中用Isarray函数判断后分别处理。

TA的精华主题

TA的得分主题

发表于 2020-12-2 09:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ggmmlol 发表于 2020-12-2 08:29
把第1参数的类型改为Validation,在代码中用Isarray函数判断后分别处理。

谢谢 我试一试

TA的精华主题

TA的得分主题

发表于 2020-12-2 10:26 | 显示全部楼层
ggmmlol 发表于 2020-12-2 08:29
把第1参数的类型改为Validation,在代码中用Isarray函数判断后分别处理。

改写不来 我试了一下 始终都是错误

TA的精华主题

TA的得分主题

发表于 2020-12-2 10:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ggmmlol 发表于 2020-12-2 08:29
把第1参数的类型改为Validation,在代码中用Isarray函数判断后分别处理。

过程形式 就可以
改写成函数 就不知道怎么带参数进入了 就是难在分给符参数
Sub TEXTJOIN1()    'Variant  '联结文本
    Dim tmptext As Variant, Rng As Variant, cel As Variant
    tmptext = ""
    Delimiter = [{"-","#"}]
    args = [a1:h1]
    gs = UBound(args, 1)
    For Each Rng In args
       If Rng <> "" Then
            If IsArray(Delimiter) Then
              If i = 0 Then
                If Len(Rng) Or Not ignore_empty Then tmptext = Rng
                Else
                tmptext = tmptext & Delimiter(i) & Rng
                End If
             End If
       On Error Resume Next
       a = Error(Delimiter(i + 1))
       i = i + 1
       If Err.Number = 9 Then i = 1
      End If
    Next
    TEX = tmptext
End Sub

TA的精华主题

TA的得分主题

发表于 2020-12-2 10:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如果能改写成功 就是真正的textjoin 了

TA的精华主题

TA的得分主题

发表于 2020-12-16 10:28 | 显示全部楼层
留下脚印,收藏学习,太棒了

TA的精华主题

TA的得分主题

发表于 2020-12-16 10:30 | 显示全部楼层
cjc209 发表于 2020-12-2 10:36
如果能改写成功 就是真正的textjoin 了

老师,您有进展吗?期待您的佳作

TA的精华主题

TA的得分主题

发表于 2020-12-16 10:47 | 显示全部楼层
niko88819 发表于 2020-12-16 10:30
老师,您有进展吗?期待您的佳作

我写出来了
Function 文本连接(分隔符组, 忽略空值, ParamArray 引用或数组() As Variant) As Variant
    '第一参数为分隔符,后续会可选多区域多类型,空值将被忽略
    '可传递内存数组参数
    Dim tmptext As Variant, i As Variant, cellv As Variant
    Dim cell As Range
    tmptext = ""
    sz = IsArray(分隔符组)
    If sz Then sb = UBound(分隔符组)
    If Not sz Then
        For i = 0 To UBound(引用或数组) '遍历参数数组
            If Not IsMissing(引用或数组(i)) Then '判断参数是否有效
                Select Case Right(TypeName(引用或数组(i)), 2) '对不同的参数类型采取不同的处理方式,数组类型可能有多种类型,所以判断最后一个字符
                    Case "ge" 'Range单元格区域类型,直接遍历
                        For Each cell In 引用或数组(i)
                            If 忽略空值 = 0 Then GoTo 1
                            If cell <> "" Then
1
                                If k = 0 Then
                                    tmptext = cell.Value
                                    k = k + 1
                                Else
                                    tmptext = tmptext & 分隔符组 & cell.Value
                                    k = k + 1
                                End If
                                If 忽略空值 = 0 Then GoTo 2
                            End If
2
                        Next cell
                    Case "()"  '数组类型,
                        For Each cellv In 引用或数组(i)
                            If 忽略空值 = 0 Then GoTo 3
                            If cellv <> "" Then
3
                                If k = 0 Then
                                    tmptext = cellv
                                    k = k + 1
                                Else
                                    tmptext = tmptext & 分隔符组 & cellv
                                    k = k + 1
                                End If
                                If 忽略空值 = 0 Then GoTo 4
                            End If
4
                        Next cellv
                    Case Else '其他类型,即单个值参数
                        If 忽略空值 = 0 Then GoTo 5
                        If 引用或数组(i) <> "" Then
5
                            If k = 0 Then
                                tmptext = 引用或数组(i)
                                k = k + 1
                            Else
                                tmptext = tmptext & 分隔符组 & 引用或数组(i)
                                k = k + 1
                            End If
                            If 忽略空值 = 0 Then GoTo 6
                        End If
6
                End Select
            End If
        Next i
    Else
        For i = 0 To UBound(引用或数组) '遍历参数数组
            If Not IsMissing(引用或数组(i)) Then '判断参数是否有效
                Select Case Right(TypeName(引用或数组(i)), 2) '对不同的参数类型采取不同的处理方式,数组类型可能有多种类型,所以判断最后一个字符
                    Case "ge" 'Range单元格区域类型,直接遍历
                        For Each cell In 引用或数组(i)
                            If 忽略空值 = 0 Then GoTo 7
                            If cell <> "" Then
7
                                If k = 0 Then
                                    tmptext = cell.Value
                                    k = k + 1
                                Else
                                    kk = k Mod sb
                                    If kk = 0 Then kk = sb
                                    tmptext = tmptext & 分隔符组(kk) & cell.Value
                                    k = k + 1
                                End If
                                If 忽略空值 = 0 Then GoTo 8
                            End If
8
                        Next cell
                    Case "()"  '数组类型,
                        For Each cellv In 引用或数组(i)
                            If 忽略空值 = 0 Then GoTo 9
                            If cellv <> "" Then
9
                                If k = 0 Then
                                    tmptext = cellv
                                    k = k + 1
                                Else
                                    kk = k Mod sb
                                    If kk = 0 Then kk = sb
                                    tmptext = tmptext & 分隔符组(kk) & cellv
                                    k = k + 1
                                End If
                                If 忽略空值 = 0 Then GoTo 10
                            End If
10
                        Next cellv
                    Case Else '其他类型,即单个值参数
                        If 忽略空值 = 0 Then GoTo 11
                        If 引用或数组(i) <> "" Then
11
                            If k = 0 Then
                                tmptext = 引用或数组(i)
                                k = k + 1
                            Else
                                kk = k Mod sb
                                If kk = 0 Then kk = sb
                                tmptext = tmptext & 分隔符组(kk) & 引用或数组(i)
                                k = k + 1
                            End If
                            If 忽略空值 = 0 Then GoTo 12
                        End If
12
                End Select
            End If
        Next i
    End If
    文本连接 = tmptext
End Function
和Excel高版本的textejoin 完全一样的应用

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-12-16 10:52 | 显示全部楼层
本帖最后由 niko88819 于 2020-12-16 11:07 编辑

老师,您太厉害了,太棒了,对小师妹来说没有高版本,用您方法写出公式解决2019同样的功能
对没有高版本,又想解高版的问题,总算解决了,这样可以借用老师的手帮助更多朋友. 因为写出来公式就是等于高版本公式.

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 12:42 | 显示全部楼层
image.png
一直没用过高版,也不知道textjoin到底有哪些功能。说重写代码一直没重写。回头抽空学习一下  cjc209 老师的代码,重写一个
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 09:46 , Processed in 0.038240 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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