ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按指定条件连接A列数据

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 13:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
micch 发表于 2018-12-20 13:44
那你这自定义函数够费劲的,为了使用,还得先选中足够大的区域才行;

至少要比第一参数区域的1/3要大 ...

老师:您从1楼下面的代码里,能够看出计算结果开始显示时的行号是哪一句吗?

TA的精华主题

TA的得分主题

发表于 2018-12-20 14:02 | 显示全部楼层
WYS67 发表于 2018-12-20 13:47
其实,平时用的时候并不需要这么大区域,只需根据实际需要预定就可。

嗯,如果你把函数作为区域数组函数使用,那么如果你选中的区域比函数返回的结果大,那么超出部分就得到错误值,如果比函数返回的结果小,那你选中的区域就显示不全返回的结果。

只有你选中区域和结果大小一致,才能正确返回结果。

如果我这样理解是对的话,那么这个函数每次使用岂不是还得先知道结果是多少组才行??

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 14:07 | 显示全部楼层
lsdongjh 发表于 2018-12-20 13:50
先问个小问题:【用53除以3,得出整数18和余数2】

你能告诉我,数学哪位老师教的,你去狠狠地削一顿:53 ...

老师:B2里的公式是:=MOD(A2-2,3),中间那个“2”,代表减去D1显示的A列最后两个数据。原附件和截图有错误,感谢老师提醒,已在1楼里更正。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 14:37 | 显示全部楼层
micch 发表于 2018-12-20 14:02
嗯,如果你把函数作为区域数组函数使用,那么如果你选中的区域比函数返回的结果大,那么超出部分就得到错 ...

      如果选中的区域比函数返回的结果大,那么超出部分显示为空白。区域公式的预置区域肯定会比源数据大!所以不存在比函数返回的结果小,选中的区域就显示不全返回的结果;只有在第三参数显示位置的指定行号包括的行数,少于A列数据连接成的三位数总个数时,才会出现计算结果显示不全的现象,解决办法是:如指定H5为30,在G5:G100000里输入公式{ =SSLJ(A5:A100000,0,H1),则代表计算结果只能显示在G5:G30的26个单元格里。如果A列数据连接成的三位数总个数超过26个,采取截头方法--去掉上边的三位数,只显示最后26个三位数,以确保A列最后一个三位数恰好显示在G30单元格里。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 14:42 | 显示全部楼层
micch 发表于 2018-12-20 14:02
嗯,如果你把函数作为区域数组函数使用,那么如果你选中的区域比函数返回的结果大,那么超出部分就得到错 ...

原附件的模拟结果有错,经lsdongjh老师提醒,已在1楼里出现上传了正确的附件。

TA的精华主题

TA的得分主题

发表于 2018-12-20 14:43 | 显示全部楼层
我得继续琢磨琢磨去,得出结果容易,就是这个参数不大懂,还得再研究研究

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 14:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
micch 发表于 2018-12-20 14:43
我得继续琢磨琢磨去,得出结果容易,就是这个参数不大懂,还得再研究研究

老师:您可以把1楼的代码复制粘贴进附件里,再把I22:I27的公式也复制粘贴进C:H列,通过增减A列源数据,显示的计算结果,就能看出端倪。

TA的精华主题

TA的得分主题

发表于 2018-12-20 15:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

  1. Function SSLJ(rgData As Range, Optional LineType As Variant = "", Optional DispLocation As Variant = "") As Variant
  2.     Dim rgFormula As Range '公式所在区域
  3.     Dim arrData As Variant, strResult() As String
  4.     Dim lngRows As Long, lngCols As Long
  5.     Dim lngR As Long, lngC As Long
  6.     Dim strTemp As String, strLast As String
  7.     Dim lngLen As Long, lngMod As Long
  8.     Dim arrTemp As Variant, lngIndex As Long
  9.     Dim lngLineType As Long, lngDispLocation As Long
  10.    
  11.    
  12.    
  13.     Set rgFormula = Application.Caller
  14.     lngRows = rgFormula.Rows.Count
  15.     lngCols = rgFormula.Columns.Count
  16.     ReDim strResult(1 To lngRows, 1 To lngCols) As String
  17.    
  18.     If LineType = "" Then
  19.         lngLineType = 0
  20.     Else
  21.         lngLineType = Val(LineType)
  22.     End If
  23.    
  24.     If DispLocation = "" Then
  25.         lngDispLocation = 0
  26.     Else
  27.         lngDispLocation = Val(DispLocation) - rgFormula.Row
  28.     End If
  29.    
  30.    
  31.     If rgData.Rows.Count < 3 Then Exit Function '如果不足3行,直接退出
  32.    
  33.     arrData = rgData
  34.     arrData = Application.WorksheetFunction.Transpose(arrData)
  35.     strTemp = Join(arrData, ""):    strTemp = Replace(strTemp, Space(1), "")
  36.     lngLen = Len(strTemp)
  37.     strLast = Mid(strTemp, lngLen - 1):    strTemp = Mid(strTemp, 1, lngLen - 2)
  38.     lngLen = lngLen - 2: lngMod = lngLen Mod 3: lngLen = lngLen \ 3
  39.     strTemp = Mid(strTemp, lngMod + 1)
  40.    
  41.     ReDim arrTemp(1 To lngLen)
  42.     For lngMod = 1 To lngLen
  43.         arrTemp(lngMod) = Mid(strTemp, 1 + (lngMod - 1) * 3, 3)
  44.     Next
  45.    
  46.     lngDispLocation = lngDispLocation - lngLen + 1
  47.     If lngDispLocation < 0 Then lngDispLocation = 0
  48.    
  49.     For lngIndex = 1 To lngLen
  50.         strResult(lngIndex + lngDispLocation, 1) = arrTemp(lngIndex)
  51.     Next
  52.    
  53.     If lngLineType <> 0 Then strResult(lngIndex + lngDispLocation, 1) = strLast
  54.    
  55.     SSLJ = strResult
  56. End Function
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 16:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 WYS67 于 2018-12-20 16:34 编辑

老师:代码运行速度很快!显示的计算结果除了特殊情况【指定行号内的单元格个数少于数据源A列连接而成的三位数个数】下的G:H列外,都很正确!如下面截图所示: 20181220161143.png

A列数据连接的最后一个三位数,在G:H列,也必须恰好显示在H1指定的行号里

    F1指定的行号包括的单元格个数大于数据源A列连接而成的三位数个数,所以E:F列显示结果很正确;

     但指定H1为30,在G5:G100000里输入公式{ =SSLJ(A5:A100000,0,H1),则代表计算结果只能显示在G5:G30的26个单元格里。如果A列数据连接成的三位数总个数超过26个,采取截头方法--去掉上边的三位数,从G5开始自动显示最后的26个三位数,以确保A列最后一个三位数恰好显示在G30单元格里。

恳请老师完善代码。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-20 17:19 | 显示全部楼层

老师:恳请您在代码里假如29楼描述的功能---不考虑数据源能够连接成的三位数有多少,自动在第三参数指定的行号中,恰好显示顺排下来的最后一个三位数。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-16 07:49 , Processed in 0.041356 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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