1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教下各位老师:自定义函数报错,不能返回正确的值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-28 16:40 | 显示全部楼层 |阅读模式
自定义了一个函数,范围条件下的top10的值,当时在function过程中不能返回正确的值,在sub过程中能返回值,请教各位老师,该怎么修改代码 image.png



Dim top10

Sub TOP数据处理(工作表名 As String, 产品线名 As String, 汇总方式 As String, 汇总依据列号 As String, 汇总数据列号 As String, 筛选条件列号 As String, 排名 As Integer, 返回值 As Integer)

Application.DisplayAlerts = False

Dim result_top10
Dim n As Integer
Dim d As Object

nian = Sheets("参数").Range("d2")
yue = Sheets("参数").Range("f2")

Set d = CreateObject("scripting.dictionary")

For i = 1 To ThisWorkbook.Sheets(工作表名).Range("a1").End(xlToRight).Column
    If Sheets(工作表名).Cells(1, i).Value = "年度" Then
        n = i
        Exit For
    End If
Next i


For i = 2 To Sheets(工作表名).Cells(n, 1).End(xlDown).Row
    If 产品线名称 = "合计" Then
        If 汇总方式 = "累计" Then
           If Sheets(工作表名).Cells(i, n) = nian And Sheets(工作表名).Cells(i, n + 1) <= yue Then
                d(Sheets(工作表名).Range(汇总依据列号 & i).Value) = d(Sheets(工作表名).Range(汇总依据列号 & i).Value) + Sheets(工作表名).Range(汇总数据列号 & i).Value
           End If

        ElseIf 汇总方式 = "当月" Then
           If Sheets(工作表名).Cells(i, n) = nian And Sheets(工作表名).Cells(i, n + 1) = yue Then
                d(Sheets(工作表名).Range(汇总依据列号 & i).Value) = d(Sheets(工作表名).Range(汇总依据列号 & i).Value) + Sheets(工作表名).Range(汇总数据列号 & i).Value
           End If

        Else
           MsgBox "汇总方式错误,请在累计和当月中选择一个"
           Exit Sub
        End If
   
    Else
        If 汇总方式 = "累计" Then
           If Sheets(工作表名).Cells(i, n) = nian And Sheets(工作表名).Cells(i, n + 1) <= yue And Sheets(工作表名).Range(筛选条件列号 & i) = 产品线名 Then
                d(Sheets(工作表名).Range(汇总依据列号 & i).Value) = d(Sheets(工作表名).Range(汇总依据列号 & i).Value) + Sheets(工作表名).Range(汇总数据列号 & i).Value
           End If

        ElseIf 汇总方式 = "当月" Then
           If Sheets(工作表名).Cells(i, n) = nian And Sheets(工作表名).Cells(i, n + 1) = yue And Sheets(工作表名).Range(筛选条件列号 & i) = 产品线名 Then
                d(Sheets(工作表名).Range(汇总依据列号 & i).Value) = d(Sheets(工作表名).Range(汇总依据列号 & i).Value) + Sheets(工作表名).Range(汇总数据列号 & i).Value
           End If

        Else
           MsgBox "汇总方式错误,请在累计和当月中选择一个"
           Exit Sub
        End If
    End If
Next i

Set tempsheet = ThisWorkbook.Sheets.Add

tempsheet.Range("a1") = "名称"
tempsheet.Range("b1") = "金额"

tempsheet.Range("a2").Resize(d.Count, 1) = Application.Transpose(d.keys)
tempsheet.Range("b2").Resize(d.Count, 1) = Application.Transpose(d.Items)

With tempsheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=tempsheet.Range("b1"), Order:=xlDescending '
        .SetRange tempsheet.Range("A1:b" & d.Count + 1) ' 修改为你的数据范围
        .Header = xlYes ' 如果数据包含标题行,设置为xlYes;否则设置为xlNo
        .Apply
End With

For i = 12 To d.Count
    If (tempsheet.Range("b" & i) <> 0 Or tempsheet.Range("b" & i) <> "") And tempsheet.Range("b" & i) = tempsheet.Range("b11") Then
        n = i
        Exit For
    End If
Next i
result_top10 = tempsheet.Range("a2:b" & n)
tempsheet.Delete

'MsgBox result_top10(1, 1)
'MsgBox result_top10(1, 2)

If 排名 > UBound(result_top10, 1) Then
    top10 = ""
Else
    If 返回值 = 1 Then
        top10 = result_top10(排名, 2)
    ElseIf 返回值 = 0 Then
        top10 = result_top10(排名, 1)
    End If

End If

'MsgBox top10
Application.DisplayAlerts = True
End Sub

Function tp10(工作表名, 产品线名, 汇总方式, 汇总依据列号, 汇总数据列号, 筛选条件列号, 排名, 返回值)

Call TOP数据处理(工作表名, 产品线名, 汇总方式, 汇总依据列号, 汇总数据列号, 筛选条件列号, 排名, 返回值)

tp10 = top10


End Function


数据分析.rar

167.85 KB, 下载次数: 4

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

本版积分规则

1234

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

GMT+8, 2025-4-23 22:31 , Processed in 0.032610 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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