ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 优化数字字符串处理的代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-24 23:09 | 显示全部楼层 |阅读模式
1.gif

优化数字字符串处理的代码.zip (17.7 KB, 下载次数: 8)

运算规则是:以第一参数为准,1.按第三参数的指定字节,去除重复数字;2.去除与第二参数相重复的所有数字【至于附件里的被减数和减数,只是用于主次之分的说明罢了】。

有老师帮忙创建了一个ZFCXJS的自定义函数,可惜只能用普通公式输入。除了B28:G32中黄色填充的计算结果不对【应该按照I29的要求--当被减数与减数任何一列没有数据时,计算结果应该显示空白】外,其它的计算结果都正确!代码如下:

Function ZFCXJS(st1, st2, Optional n% = 1) As String
    Set d = CreateObject("scripting.dictionary")
    For i = 1 To Len(st1) - n + 1 Step n
        d(Mid(st1, i, n)) = Mid(st1, i, n)
    Next
    For i = 1 To Len(st2) - n + 1 Step n
        d(Mid(st2, i, n)) = ""
    Next
    ZFCXJS = Join(d.items, "")
End Function


需要优化的地方:

1.当第一参数或第二参数任何一项没有数据时,计算结果应该显示空白;

2.当数据量过大,达到几万行以后,运行速度就会大减。希望在数据量很大时,能够采取如I25所要求的:增加按区域数组公式输入的功能。如:选定C5:C10000,输入 {   =ZFCXJS(A5:A10000,B5:B10000,1)

3.大多数情况下,第一参数都是一个固定数字【如A5:A24或E5:E24显示的那样】,只有第二参数区域内的数字不同。能不能让第一参数既可以设置为区域,又可以是指定数值【如"0123456789"或“0102030405060708091011”】,第二参数为区域输入区域数组公式{   =ZFCXJS("0123456789",B5:B10000,1)  进行计算?

恳请老师们帮助解决。

TA的精华主题

TA的得分主题

发表于 2019-3-24 23:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
出题大王,哈哈,可以!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 09:28 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 10:39 | 显示全部楼层
恳请老师们帮忙完善和优化代码,使之能够同时用普通公式和区域数组公式两种方法进行输入计算。

TA的精华主题

TA的得分主题

发表于 2019-3-25 11:17 | 显示全部楼层
WYS67 发表于 2019-3-25 10:39
恳请老师们帮忙完善和优化代码,使之能够同时用普通公式和区域数组公式两种方法进行输入计算。

第1项:
  1. If st1 = "" Or st2 = "" Then ZFCXJS = "": Exit Function
复制代码


你也可以自己尝试修改

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-3-25 11:22 | 显示全部楼层
第2、3没必要数组,普通自定义函数即可,公式下拉复制也简单。多了拖慢速度。用到哪,下拉到哪

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 11:30 | 显示全部楼层

老师:这样:
Function ZFCXJS(st1, st2, Optional n% = 1) As String
    Set d = CreateObject("scripting.dictionary")
    If st1 = "" Or st2 = "" Then ZFCXJS = "": Exit Function
    For i = 1 To Len(st1) - n + 1 Step n
        d(Mid(st1, i, n)) = Mid(st1, i, n)
    Next
    For i = 1 To Len(st2) - n + 1 Step n
        d(Mid(st2, i, n)) = ""
    Next
    ZFCXJS = Join(d.items, "")
End Function


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 11:37 | 显示全部楼层
本帖最后由 WYS67 于 2019-3-25 11:38 编辑
yjh_27 发表于 2019-3-25 11:22
第2、3没必要数组,普通自定义函数即可,公式下拉复制也简单。多了拖慢速度。用到哪,下拉到哪

我工作表里的第一、二参数区域的上下标都是事先设定的--在限定的区域内输入区域数组公式后,第二参数输入到哪一行,就会自动显示计算结果到哪一行--这样方便随时查看即时趋势,觉得区域数组公式比普通公式速度更快些。还请老师帮忙!

TA的精华主题

TA的得分主题

发表于 2019-3-25 11:48 | 显示全部楼层
WYS67 发表于 2019-3-25 11:30
老师:这样:
Function ZFCXJS(st1, st2, Optional n% = 1) As String
    Set d = CreateObject("scri ...

可以
再提前一行更好

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 12:00 | 显示全部楼层
yjh_27 发表于 2019-3-25 11:22
第2、3没必要数组,普通自定义函数即可,公式下拉复制也简单。多了拖慢速度。用到哪,下拉到哪

老师:在事前限定好的区域内输入区域数组公式后,第二参数输入到哪一行,就会自动显示计算结果到哪一行--这样方便随时查看即时趋势,觉得区域数组公式比普通公式速度更快些。还请老师帮忙!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 23:56 , Processed in 0.037415 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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