ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-15 22:28 | 显示全部楼层
zopey 发表于 2018-6-15 18:24
被你 “=3-十位第一个数-十位第二个数&3-个位第一个数-个位第二个数” 的 规则 误导了:
去求 k1=2, k2=2 ...

恳请老师帮忙!

TA的精华主题

TA的得分主题

发表于 2018-6-16 09:04 | 显示全部楼层

Sub test2()
tms = Timer
Columns("d:d").ClearContents
Dim arr, k0, brr(), crr()

k0 = [b5].End(4).Row - 4
arr = [b5].Resize(k0, 1)
ReDim crr(1 To k0, 1 To 1)

For i = 1 To k0
    ReDim brr(0 To 2)
    t0 = Left(arr(i, 1), 1): k1 = 0
    For j = i To 1 Step -1
        t1 = Left(arr(j, 1), 1): brr(t1) = brr(t1) + 1: If brr(t1) = 1 Then k1 = k1 + 1
        If k1 = 2 Then crr(i, 1) = "'" & (3 - t0 - t1): Exit For
    Next

    ReDim brr(0 To 2)
    t0 = Right(arr(i, 1), 1): k2 = 0
    For j = i To 1 Step -1
        t2 = Right(arr(j, 1), 1): brr(t2) = brr(t2) + 1: If brr(t2) = 1 Then k2 = k2 + 1
        If k2 = 2 Then crr(i, 1) = crr(i, 1) & (3 - t0 - t2): Exit For
    Next

    If k1 = 1 Or k2 = 1 Then crr(i, 1) = ""
Next

[d5].Resize(k0, 1) = crr
MsgBox Format(Timer - tms, "0.000s")
End Sub


Book2.rar (383.6 KB, 下载次数: 12)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-16 09:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
'4楼代码 添加补充规则

Sub test()
    Dim brr(), sr()
    tms = Timer
    m = Cells(Rows.Count, 2).End(3).Row - 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
        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
    [c5].Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-16 10:02 | 显示全部楼层
本帖最后由 13782671637 于 2018-6-16 10:09 编辑
zopey 发表于 2018-6-16 09:07
'4楼代码 添加补充规则

Sub test()

非常感谢老师的倾心付出!测试后结果显示正确,计算速度很快!53楼的代码Sub test()
    Dim brr(), sr()
    tms = Timer
    m = Cells(Rows.Count, 2).End(3).Row - 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
        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
    [.Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub
如果要修改数据源和代码计算列,是不是只需修改代码第五行的b5和倒数第三行的c5就可以了?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-16 10:17 | 显示全部楼层
zopey 发表于 2018-6-16 09:04
Sub test2()
tms = Timer
Columns("d:d").ClearContents

Sub test2()
tms = Timer
Columns("d:d").ClearContents
Dim arr, k0, brr(), crr()

k0 = [b5].End(4).Row - 4
arr = [b5].Resize(k0, 1)
ReDim crr(1 To k0, 1 To 1)

For i = 1 To k0
    ReDim brr(0 To 2)
    t0 = Left(arr(i, 1), 1): k1 = 0
    For j = i To 1 Step -1
        t1 = Left(arr(j, 1), 1): brr(t1) = brr(t1) + 1: If brr(t1) = 1 Then k1 = k1 + 1
        If k1 = 2 Then crr(i, 1) = "'" & (3 - t0 - t1): Exit For
    Next

    ReDim brr(0 To 2)
    t0 = Right(arr(i, 1), 1): k2 = 0
    For j = i To 1 Step -1
        t2 = Right(arr(j, 1), 1): brr(t2) = brr(t2) + 1: If brr(t2) = 1 Then k2 = k2 + 1
        If k2 = 2 Then crr(i, 1) = crr(i, 1) & (3 - t0 - t2): Exit For
    Next

    If k1 = 1 Or k2 = 1 Then crr(i, 1) = ""
Next

[d5].Resize(k0, 1) = crr
MsgBox Format(Timer - tms, "0.000s")
End Sub老师:如果要修改数据源,是不是和公式所在列是不是只需修改第三行的d:d,第五、六行的b5,倒数第三行的d5就可以了?

TA的精华主题

TA的得分主题

发表于 2018-6-16 10:30 | 显示全部楼层
m = Cells(Rows.Count, 2).End(3).Row - 4

k0 = [b5].End(4).Row - 4   跟这个差不多哦,

都是 读取数据列 共有多少行

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-16 10:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 13782671637 于 2018-6-16 10:59 编辑
zopey 发表于 2018-6-16 10:30
m = Cells(Rows.Count, 2).End(3).Row - 4

k0 = .End(4).Row - 4   跟这个差不多哦,

老师:以53楼为例:如果数据源在K列,公式在N列,需要修改以下:Sub test()
    Dim brr(), sr()
    tms = Timer
    m = Cells(Rows.Count, 11).End(3).Row - 4  
    ar = [k5].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
    [n5].Resize(m) = sr
    MsgBox Format(Timer - tms, "0.000s")
End Sub



TA的精华主题

TA的得分主题

发表于 2018-6-16 10:46 | 显示全部楼层
本帖最后由 lsc900707 于 2018-6-16 10:52 编辑
13782671637 发表于 2018-6-16 10:39
老师:以53楼为例:如果数据源在K列,公式在N列,需要修改以下:Sub test()
    Dim brr(), sr()
    t ...

   m = Cells(Rows.Count, 11).End(3).Row - 4   

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-16 10:49 | 显示全部楼层
lsc900707 发表于 2018-6-16 10:46
m = Cells(Rows.Count, 11).End(3).Row - 4   这行怎么修改?

版主老师:我问的是这行需不需要修改?

TA的精华主题

TA的得分主题

发表于 2018-6-16 10:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
13782671637 发表于 2018-6-16 10:49
版主老师:我问的是这行需不需要修改?

m = Cells(Rows.Count, 2).End(3).Row - 4  
修改成:
m = Cells(Rows.Count, 11).End(3).Row - 4  
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 05:28 , Processed in 0.037260 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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