ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] yjh自定义函数

[复制链接]

TA的精华主题

TA的得分主题

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

if IsError (ENDRC) then ENDRC=""

不行啊,把if IsError (ENDRC) then ENDRC=""加在倒数第二句,还是显示#VALUE!错误

TA的精华主题

TA的得分主题

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

if IsError (ENDRC) then ENDRC=""

另外发现,ENDRC和DATARC,虽然指定区域要用"",但可以直接引用单元格,如16楼截图所示,在R5里输入公式=ENDRC(S5),可以下拉复制公式;

而修改的ENDRC2,则必须这样 =ENDRC(INDIRECT(S5))才行。

TA的精华主题

TA的得分主题

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

if IsError (ENDRC) then ENDRC=""

1.gif

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

请老师看看怎样使T21:U21显示为空白?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-13 15:47 | 显示全部楼层
WYS67 发表于 2020-3-13 15:23
请老师看看怎样使T21:U21显示为空白?

参见附件。

可以右拉下拉的动态区域.zip

35.37 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-13 16:46 | 显示全部楼层

Function DataRC(Optional mode = 6, Optional MyRange As String, Optional MySht As String, Optional R1 = 0, Optional C1 = 0, Optional Rs = 0, Optional Cs = 0)
    '得到有数据的最后(最前)行列号,三个参数均可选
    '参数形式如:MyRange     指定范围,如果忽略则为UsedRange
    '                "A:B"     整列
    '                "6:26"    整行
    '                "a6:h26"  矩形区域
    '                "-1"      负数,函数范围caller
    '                ""        UsedRange
    '            MySht       指工作表名,如果忽略则为活动工作表
    '                        在工作表中使用且MySht=活动工作表时,会引起循环引用,需设置手动计算Application.Calculation = xlManual或启用迭代计算Application.Iteration = True
    '
    '            mode        返回模式,
    '                >0        1~9最大行(行扫描优先),>9最大列(列扫描优先)
    '                <0        -1~-9最小行(行扫描优先),<-9最小列(列扫描优先)
    '                1         最大行号
    '                2         最大行号对应最后列号
    '                3         最大行号对应最后列字母
    '                4         "最大行号,对应最后列号"
    '                5         最大行最后列绝对地址
    '                6         最大行最后列相对地址(默认)
    '                7         "最大行号,最大列号"
    '                8         最大行列绝对地址
    '                9         最大行列相对地址
    '                11         最大列号最前行号
    '                12         最大列号
    '                13         最大列字母
    '                14         "对应最前行号,最大列号"
    '                15         最大列对应最前行绝对地址
    '                16         最大列对应最前行相对地址
    '                17         "最大行号,最大列号"
    '                18         最大行列绝对地址
    '                19         最大行列相对地址
    '                -1         最小行号
    '                -2         最小行号对应最前列号
    '                -3         最小行号对应最前列字母
    '                -4         "最小行号,对应最前列号"
    '                -5         最小行对应最前列绝对地址
    '                -6         最小行对应最前列相对地址
    '                -7         "最小行号,最小列号"
    '                -8         最小行列绝对地址
    '                -9         最小行列相对地址
    '                -11         最小列号最前行号
    '                -12         最小列号
    '                -13         最小列字母
    '                -14         "对应最前行号,最小列号"
    '                -15         最小列对应最前行绝对地址
    '                -16         最小列对应最前行相对地址
    '                -17         "最小行号,最小列号"
    '                -18         最小行列绝对地址
    '                -19         最小行列相对地址
    Dim rng As Range, sht As Worksheet, ar, i As Long, j As Long
    If MySht <> "" Then Set sht = Sheets(MySht) Else Set sht = ActiveSheet
    If MyRange = "" Then
        Set rng1 = sht.UsedRange
    ElseIf Val(MyRange) < 0 Then
        Set rng1 = Application.Caller
    Else
        Set rng1 = sht.Range(MyRange)
    End If
    If Rs * Cs > 0 Then
        Set rng = rng1.Offset(R1, C1).Resize(Rs, Cs)
    ElseIf Rs > 0 Then
        Set rng = rng1.Offset(R1, C1).Resize(Rs)
    ElseIf Rs > 0 Then
        Set rng = rng1.Offset(R1, C1).Resize(, Cs)
    Else
        Set rng = rng1.Offset(R1, C1)
    End If
    Set rng = Intersect(sht.UsedRange, rng)
    If Not rng Is Nothing Then
        If rng.Count = 1 Then
            If Not IsEmpty(rng.Cells(1, 1)) Then EndR = rng.Row: EndC = rng.Column
        ElseIf Abs(mode) Mod 10 > 6 Then
            Rmax = rng.Row
            Cmax = rng.Column
            Rmin = rng.Row + rng.Rows.Count - 1
            Cmin = rng.Column + rng.Columns.Count - 1
            For Each rg In rng
                If Not IsEmpty(rg) Then
                    If Rmax < rg.Row Then Rmax = rg.Row
                    If Cmax < rg.Column Then Cmax = rg.Column
                    If Rmin > rg.Row Then Rmin = rg.Row
                    If Cmin > rg.Column Then Cmin = rg.Column
                End If
            Next
            If mode >= 0 Then
                EndR = Rmax
                EndC = Cmax
            Else
                EndR = Rmin
                EndC = Cmin
            End If
        ElseIf mode < -10 Then
            For j = 1 To rng.Columns.Count
                For i = 1 To rng.Rows.Count
                    If Not IsEmpty(rng.Cells(i, j)) Then
                        EndR = rng.Cells(i, j).Row
                        EndC = rng.Cells(i, j).Column
                        j = rng.Columns.Count
                        Exit For
                    End If
                Next
            Next
        ElseIf mode < 0 Then
            For i = 1 To rng.Rows.Count
                For j = 1 To rng.Columns.Count
                    If Not IsEmpty(rng.Cells(i, j)) Then
                        EndR = rng.Cells(i, j).Row
                        EndC = rng.Cells(i, j).Column
                        i = rng.Rows.Count
                        Exit For
                    End If
                Next
            Next
        ElseIf mode < 10 Then
            For i = rng.Rows.Count To 1 Step -1
                For j = rng.Columns.Count To 1 Step -1
                    If Not IsEmpty(rng.Cells(i, j)) Then
                        EndR = rng.Cells(i, j).Row
                        EndC = rng.Cells(i, j).Column
                        i = 1
                        Exit For
                    End If
                Next
            Next
        Else
            For j = rng.Columns.Count To 1 Step -1
                For i = rng.Rows.Count To 1 Step -1
                    If Not IsEmpty(rng.Cells(i, j)) Then
                        EndR = rng.Cells(i, j).Row
                        EndC = rng.Cells(i, j).Column
                        j = 1
                        Exit For
                    End If
                Next
            Next
        End If

        mode = Abs(mode) Mod 10
        If mode > 6 Then mode = mode - 3
        If mode = 1 Then
            DataRC = EndR
        ElseIf mode = 2 Then
            DataRC = EndC
        ElseIf mode = 3 Then
            DataRC = Split(Cells(EndR, EndC).Address, "$")(1)
        ElseIf mode = 4 Then
            DataRC = EndR & "," & EndC
        ElseIf mode = 5 Then
            DataRC = Cells(EndR, EndC).Address
        Else
            DataRC = Cells(EndR, EndC).Address(0, 0)
        End If
    End If
End Function

老师:麻烦您给DATARC在合适的地方增加一句代码:当指定范围内没有数据存在时,使计算结果显示为空白?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-13 17:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 yjh_27 于 2020-3-15 10:47 编辑
WYS67 发表于 2020-3-13 16:46
Function DataRC(Optional mode = 6, Optional MyRange As String, Optional MySht As String, Optional  ...

参照楼上附件,改这句

If mode = 1 Then

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

24.04 KB, 下载次数: 73

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-13 17:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yjh_27 发表于 2020-3-13 17:05
参照楼上附件,改这句

If mode = 1 Then

谢谢老师了!

TA的精华主题

TA的得分主题

发表于 2020-3-15 09:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-13 17:05
参照楼上附件,改这句

If mode = 1 Then

1.gif

老师:发现26楼的附件,当指定区域没有任何数据时,ENDRC和DATARC可以显示空白,得出正确结果;但ENDRC2和DATARC2则显示错误,还得麻烦您看看是怎么回事,任何修改?

TA的精华主题

TA的得分主题

发表于 2020-3-15 10:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-13 17:05
参照楼上附件,改这句

If mode = 1 Then

已找到28楼错误原因,并改正,原来ENDRC2的代码里有一句 ENDRC = ""  改成 ENDRC2 = "" 就行了,

                                             同理,DATARC2的代码里有一句 DATARC = ""  改成 DATARC2 = "" 就行了!

很对不起,打扰老师了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-11 10:13 | 显示全部楼层
本帖最后由 yjh_27 于 2021-1-11 11:54 编辑

题目来源

求指定数据按出现次数升序排序的vba
http://club.excelhome.net/thread-1570990-1-1.html
(出处: ExcelHome技术论坛)


按次数排序指定数字4 5 9_自定义函数.rar

18.95 KB, 下载次数: 16

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-16 08:48 , Processed in 0.040303 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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