ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] yjh自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-10 09:58 | 显示全部楼层

1.gif 1.gif

最后行列.zip (22.57 KB, 下载次数: 10)

老师:如上图,有几点不明白,相烦老师解释一下--

1.  E11的       ""        UsedRange  , UsedRange  代表什么意思,百度了一下,解释为:每个sheet中的一个矩形区域的左上角到右下角的单元格引用。这个矩形区域是恰好能容纳所有已使用单元格的最小矩形。比如,Sheets(1)的B3,E2,D4有数据,那么,这个Sheet的UsedRange的Address属性的值就是$B$2:$E$4;如此说来,=EndRc("A1:D16",,0)  指定的最小区域就是A4:C12了吧?


2.本工作表的最大行列号是E83,可是在C5输入公式=EndRc("") 后,却显示为0?


3.如上边右图,在C5输入公式=EndRc("") 时,会弹出循环引用警告!请问,在哪些单元格里输入公式=EndRc(""),才能显示E83这个正确结果?

TA的精华主题

TA的得分主题

发表于 2020-3-10 16:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
老师:麻烦您看看11楼反映的问题是怎么回事,如何解决?

TA的精华主题

TA的得分主题

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

老师:麻烦您看看11楼反映的问题是怎么回事,如何解决?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-10 17:31 | 显示全部楼层
WYS67 发表于 2020-3-10 16:41
老师:麻烦您看看11楼反映的问题是怎么回事,如何解决?

参见E13单元格说明。
这个自定义函数用于工作表是有限制的。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-10 17:46 | 显示全部楼层
yjh_27 发表于 2020-3-10 17:31
参见E13单元格说明。
这个自定义函数用于工作表是有限制的。

不能在工作表里输入公式 =EndRc("")   。感觉把C5里的公式=EndRc("")  清除后,就正常了!谢谢老师!虽然还是对需设置手动计算Application.Calculation = xlManual或启用迭代计算Application.Iteration = True 不理解,但绝大多数情况下,用不到=EndRc("") 这个公式。

TA的精华主题

TA的得分主题

发表于 2020-3-13 06:06 | 显示全部楼层
1.gif

可以右拉下拉的动态区域.zip (31.04 KB, 下载次数: 15)

老师:EndRC的参数设置是 =ENDRC(指定区域,工作表名称,返回模式),DataRC的参数设置是:=DataRC(返回模式,指定区域,工作表名称),我觉得那个定区域参数,最好不要用"",如:选定J23,输入公式 =ENDRC(J5:J22)  可以右拉复制公式至Q23,返回指定区域内各列的最大行号;同理,选定R5,输入公式 =ENDRC(J5:Q5)  可以下拉复制公式至R22,返回指定区域内各行的最大列号

本来公式可以右拉下拉,但是把指定区域用""号围起来后,就不能智能复制公式了。

    '参数形式如:MyRange     指定范围,如果忽略则为UsedRange
    '                "A:B"     整列
    '                "6:26"    整行
    '                "a6:h26"  矩形区域
    '                "-1"      负数,函数范围caller
    '                ""        UsedRange

而 MyRange 的几个参数,除了最下边的 "",剩余的取消引号,直接输入,必要时可以加 $  进行绝对或相对引用,便于拖曳。

一点小小的建议,供老师参考。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-13 10:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
WYS67 发表于 2020-3-13 06:06
老师:EndRC的参数设置是 =ENDRC(指定区域,工作表名称,返回模式),DataRC的参数设置是:=DataRC(返 ...

按你的建议,做成不同的函数。你试试

最大最小使用行列号_自定义函数.rar

28.11 KB, 下载次数: 27

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-13 11:02 | 显示全部楼层
yjh_27 发表于 2020-3-13 10:07
按你的建议,做成不同的函数。你试试

老师:已测试,很完美!如果能够像16楼截图里的R21那样,输入公式=ENDRC(J21:Q21)  ,当指定区域没有数据时,屏蔽显示的#VALUE!错误为空白就更好了!
老师,应该在ENDRC和DATARC的哪个地方,添加什么样的代码,才能实现:当指定区域没有数据时,屏蔽显示的#VALUE!错误为空白的功能?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-13 11:08 | 显示全部楼层
WYS67 发表于 2020-3-13 11:02
老师:已测试,很完美!如果能够像16楼截图里的R21那样,输入公式=ENDRC(J21:Q21)  ,当指定区域没有数据 ...

end function 前

if IsError (ENDRC) then ENDRC=""

TA的精华主题

TA的得分主题

发表于 2020-3-13 11:21 | 显示全部楼层
yjh_27 发表于 2020-3-13 11:08
end function 前

if IsError (ENDRC) then ENDRC=""

老师,像下面那样,倒数第二句?  不行啊,仍然显示#VALUE!错误。

Function ENDRC(Optional MyRange As Range, Optional MySht As String, Optional mode = 0)
    '得到有数据的最后行号,两个参数均可选
    '参数形式如:MyRange     指定范围,如果忽略则为UsedRange
    '                A:B       整列
    '                6:26      整行
    '                a6:h26    矩形区域
    '                ""        UsedRange
    '            MySht       指工作表名,如果忽略则为活动工作表
    '                        在工作表中使用且MySht=活动工作表时,会引起循环引用,需设置手动计算Application.Calculation = xlManual或启用迭代计算Application.Iteration = True
    '            mode        返回模式,0~9最大行(行扫描优先),>9最大列(列扫描优先)
    '                0         最后相对地址
    '                1         最后行号
    '                2         最后列号
    '                3         最后列字母
    '                4         "最后行号,最后列号"
    '                5         最后绝对地址
    Dim rng As Range, sht As Worksheet, ar, i As Long, j As Long
    If MySht <> "" Then Set sht = Sheets(2) Else Set sht = ActiveSheet
    If MyRange Is Nothing Then Set rng = sht.UsedRange Else Set rng = Intersect(sht.UsedRange, sht.Range(MyRange.Address))
    If Not rng Is Nothing Then
        ar = rng.Value
        If Not IsArray(ar) Then
            If Len(ar) > 0 Then EndR = rng.Row: EndC = rng.Column
        ElseIf mode < 10 Then
            For i = UBound(ar) To 1 Step -1
                For j = UBound(ar, 2) To 1 Step -1
                    If Len(ar(i, j)) Then
                        EndR = i - 1 + rng.Row
                        EndC = j - 1 + rng.Column
                        i = 1
                        Exit For
                    End If
                Next
            Next
        Else
            For j = UBound(ar, 2) To 1 Step -1
                For i = UBound(ar) To 1 Step -1
                    If Len(ar(i, j)) Then
                        EndR = i - 1 + rng.Row
                        EndC = j - 1 + rng.Column
                        j = 1
                        Exit For
                    End If
                Next
            Next
            mode = mode Mod 10
        End If
        If mode = 1 Then
            ENDRC = EndR
        ElseIf mode = 2 Then
            ENDRC = EndC
        ElseIf mode = 3 Then
            ENDRC = Split(Cells(EndR, EndC).Address, "$")(1)
        ElseIf mode = 4 Then
            ENDRC = EndR & "," & EndC
        ElseIf mode = 5 Then
            ENDRC = Cells(EndR, EndC).Address
        Else
            ENDRC = Cells(EndR, EndC).Address(0, 0)
        End If
    End If
    If IsError(ENDRC) Then ENDRC = ""
End Function

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

本版积分规则

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

GMT+8, 2024-11-19 01:18 , Processed in 0.053575 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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