ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 为C列自定义函数的代码运算提速

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 08:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
YZC51 发表于 2018-6-18 07:54
已经修改
Sub 冷码()
    Dim brr(), sr()

老师:如果我要变更数据源和计算结果列标和指定截止行号三项内容,只需要改动下面红色标注的3个地方吗?

Sub 冷码()
    Dim brr(), sr()
    tms = Timer
    m = [a1] - 4 'Cells(Rows.Count, 1).End(3).Row - 4
    ar = [a5].Resize(m)
    ReDim sr(1 To m, 1 To 1)
     
    ReDim brr(0 To 2)
    For I = 1 To m
        t = ar(I, 1): t1 = Left(t, 1)
        brr(t1) = brr(t1) + 1: If brr(t1) = 1 Then k1 = k1 + 1
        If k1 = 2 Then k1 = I: Exit For
    Next
    s1 = 3 - Left(ar(1, 1), 1) - Left(ar(k1, 1), 1)
    ReDim brr(0 To 2)
    For I = 1 To m
        t = ar(I, 1):  t2 = Right(t, 1)
        brr(t2) = brr(t2) + 1: If brr(t2) = 1 Then k2 = k2 + 1
        If k2 = 2 Then k2 = I: Exit For
    Next
    s2 = 3 - Right(ar(1, 1), 1) - Right(ar(k2, 1), 1)
    s = s1 & s2
   
    If k1 > k2 Then k0 = k1 Else k0 = k2
    For I = k0 To m
        t = ar(I - 1, 1): t11 = Left(t, 1): t12 = Right(t, 1)
        t = ar(I, 1): t21 = Left(t, 1): t22 = Right(t, 1)
        If t11 = t21 Then s1 = Left(s, 1) Else s1 = 3 - t11 - t21
        If t12 = t22 Then s2 = Right(s, 1) Else s2 = 3 - t12 - t22
        s = s1 & s2
        sr(I, 1) = s
    Next
    [b5].Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 08:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
YZC51 发表于 2018-6-18 07:54
已经修改
Sub 冷码()
    Dim brr(), sr()

老师:麻烦您解释一下 m = [a1] - 4 'Cells(Rows.Count, 1).End(3).Row - 4  是什么意思?是指C2单元格吗?如果我要把指定截止行号放在D3里,应该怎么修改?

TA的精华主题

TA的得分主题

发表于 2018-6-18 09:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
13782671637 发表于 2018-6-18 08:46
老师:麻烦您解释一下 m = [a1] - 4 'Cells(Rows.Count, 1).End(3).Row - 4  是什么意思?是指C2单元格吗 ...

m = [a1] - 4
[a1]:公式计算出的数据A列的总行数;减4是从第五行开始。

ar = [a5].Resize(m)
是将A列第五行开始m行数据,存入数组ar

[b5].Resize(m) = sr
是从B列第五行开始存放计算结果

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 09:22 | 显示全部楼层
13782671637 发表于 2018-6-18 08:15
老师:如果我要变更数据源和计算结果列标和指定截止行号三项内容,只需要改动下面红色标注的3个地方吗?
...

老师:指定截止行号的单元格是C2,而不是A1。代码运行错误

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 09:24 | 显示全部楼层
13782671637 发表于 2018-6-18 08:15
老师:如果我要变更数据源和计算结果列标和指定截止行号三项内容,只需要改动下面红色标注的3个地方吗?
...

20180618092306.png 限定代码的计算和显示区域.zip (315.78 KB, 下载次数: 2)

TA的精华主题

TA的得分主题

发表于 2018-6-18 11:05 | 显示全部楼层
实际数据行数要少于截止数据行数!

TA的精华主题

TA的得分主题

发表于 2018-6-18 11:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 YZC51 于 2018-6-18 11:55 编辑


请参考
Sub 冷码()
    Dim brr(), sr()
    tms = Timer
    n = [c2]  '
    Debug.Print n
'    m = Cells(Rows.Count, 1).End(3).Row - 4
    m = Cells(n, 1).End(3).Row - 4
    Debug.Print m
    If m = 0 Then m = n - 4
    ar = [a5].Resize(m)
    ReDim sr(1 To m, 1 To 1)
     
    ReDim brr(0 To 2)
    For I = 1 To m
        t = ar(I, 1): t1 = Left(t, 1)
        brr(t1) = brr(t1) + 1: If brr(t1) = 1 Then k1 = k1 + 1
        If k1 = 2 Then k1 = I: Exit For
    Next
    s1 = 3 - Left(ar(1, 1), 1) - Left(ar(k1, 1), 1)
    ReDim brr(0 To 2)
    For I = 1 To m
        t = ar(I, 1):  t2 = Right(t, 1)
        brr(t2) = brr(t2) + 1: If brr(t2) = 1 Then k2 = k2 + 1
        If k2 = 2 Then k2 = I: Exit For
    Next
    s2 = 3 - Right(ar(1, 1), 1) - Right(ar(k2, 1), 1)
    s = s1 & s2
   
    If k1 > k2 Then k0 = k1 Else k0 = k2
    For I = k0 To m
        t = ar(I - 1, 1): t11 = Left(t, 1): t12 = Right(t, 1)
        t = ar(I, 1): t21 = Left(t, 1): t22 = Right(t, 1)
   '     On Error Resume Next
        If t11 = t21 Then s1 = Left(s, 1) Else s1 = 3 - t11 - t21
        If t12 = t22 Then s2 = Right(s, 1) Else s2 = 3 - t12 - t22
        s = s1 & s2
        sr(I, 1) = s
    Next
    [b5].Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 14:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
YZC51 发表于 2018-6-18 11:14
请参考
Sub 冷码()
    Dim brr(), sr()

这次代码非常完美地实现了我预想!结果正确,速度很快! 感谢YZC51老师的热心帮忙!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 19:06 | 显示全部楼层
YZC51 发表于 2018-6-18 11:14
请参考
Sub 冷码()
    Dim brr(), sr()

老师:学生愚鲁,代码【已修改过数据源和结果列标】复制粘贴进实际工作表后,出现如下面截图错误,请看附件: 什么原因?.zip (615.88 KB, 下载次数: 2) 20180618190005.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-18 19:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 13782671637 于 2018-6-18 19:25 编辑
YZC51 发表于 2018-6-18 11:14
请参考
Sub 冷码()
    Dim brr(), sr()

老师:是不是代码无法计算文本类数字?为什么下面蓝桥玄霜版主的代码能显示正确结果呢?Sub 冷码1()
    Dim brr(), sr()
    tms = Timer
    m = [c2].Value - 4
    ar = [b5].Resize(m)
    ReDim sr(1 To m, 1 To 1)
     
    ReDim brr(0 To 2)
    For i = 1 To m
        t = ar(i, 1): t1 = Left(t, 1)
        brr(t1) = brr(t1) + 1: If brr(t1) = 1 Then k1 = k1 + 1
        If k1 = 2 Then k1 = i: Exit For
    Next
    s1 = 3 - Left(ar(1, 1), 1) - Left(ar(k1, 1), 1)
    ReDim brr(0 To 2)
    For i = 1 To m
        t = ar(i, 1):  t2 = Right(t, 1)
        brr(t2) = brr(t2) + 1: If brr(t2) = 1 Then k2 = k2 + 1
        If k2 = 2 Then k2 = i: Exit For
    Next
    s2 = 3 - Right(ar(1, 1), 1) - Right(ar(k2, 1), 1)
    s = s1 & s2
   
    If k1 > k2 Then k0 = k1 Else k0 = k2
    For i = k0 To m
        If ar(i - 1, 1) <> "" Then t = ar(i - 1, 1): t11 = Left(t, 1): t12 = Right(t, 1)
        If ar(i, 1) <> "" Then
        t = ar(i, 1): t21 = Left(t, 1): t22 = Right(t, 1)
        If t11 = t21 Then s1 = Left(s, 1) Else s1 = 3 - Val(t11) - Val(t21)
        If t12 = t22 Then s2 = Right(s, 1) Else s2 = 3 - Val(t12) - Val(t22)
        s = s1 & s2
        sr(i, 1) = s
        End If
    Next
    [c5].Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 21:08 , Processed in 0.042258 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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