Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5117|回复: 27

[已解决](明天要用,大侠帮帮忙!!)excel自定义函数,将一个数的数位重排后得出最大值、...

[复制链接]
发表于 2013-10-7 03:27 | 显示全部楼层 |阅读模式
本帖最后由 cmjcmj8888 于 2013-10-7 16:06 编辑

求助:编写excel自定义函数。输入一个数,将这个数的数位重排后,得出最大值、最小值。
如:在单元格A1中输入1374,在B1中得最大值7431,在C1中得最小值1347
哪位大侠帮帮忙!!!
最佳答案
2013-10-7 16:36
cmjcmj8888 发表于 2013-10-7 16:34
不行啊。
求助:编写excel自定义函数。输入一个数,将这个数的数位重排后,得出最大值、最小值。
如:在 ...

见截图,还是不明白就爱莫能助了
发表于 2013-10-7 08:12 | 显示全部楼层
数值由大到小排好序后,可直接得出你要的数。
回复

使用道具 举报

发表于 2013-10-7 08:34 | 显示全部楼层
Sub test()
Dim ar1$(0 To 9), ar2$(0 To 9)
s$ = "3780908"
For i% = 1 To Len(s)
   c% = Mid(s, i, 1)
   ar1(c) = ar1(c) & c
   ar2(9 - c) = ar2(9 - c) & c
Next
[a1] = "'" & Replace(Join(ar1, "|"), "|", "")
[a2] = "'" & Replace(Join(ar2, "|"), "|", "")
End Sub
回复

使用道具 举报

发表于 2013-10-7 09:09 | 显示全部楼层
  1. Sub test()
  2.     Dim strMax$, strMin$, strTemp$
  3.     strTemp = 432567
  4.     getNewNumber strTemp, strMax, strMin
  5.     MsgBox strTemp & vbCrLf & "最大值:" & strMax & vbCrLf & "最小值:" & strMin
  6.     strTemp = 29427823023#
  7.     getNewNumber strTemp, strMax, strMin
  8.     MsgBox strTemp & vbCrLf & "最大值:" & strMax & vbCrLf & "最小值:" & strMin

  9. End Sub

  10. Function getNewNumber(lNumber As String, ByRef strMax$, ByRef strMin$) As String
  11. '参数可传入纯数值或数值型字符串,不能带小数点,不能是科学计数法表示的数字
  12.     Dim bOdd As Byte, bEven As Byte
  13.     Dim i As Integer
  14.     Dim lSum As Long
  15.     Dim bTemp As Byte
  16.     '检测参数是否是数字
  17.     If lNumber Like "*[.Ee]*" Then Exit Function
  18.     If Not VBA.IsNumeric(lNumber) Then Exit Function
  19.     Dim arr()
  20.     ReDim arr(1 To Len(lNumber))
  21.     For i = 1 To UBound(arr)
  22.         arr(i) = Val(Mid(lNumber, i, 1))
  23.     Next
  24.     QuickSort arr
  25.     strMax = getMax(arr)
  26.     strMin = getMin(arr)
  27. End Function


  28. Public Sub QuickSort(ByRef lngArray)
  29.     Dim iLBound As Long
  30.     Dim iUBound As Long
  31.     Dim iTemp As Long
  32.     Dim iOuter As Long
  33.     Dim iMax As Long
  34.     iLBound = LBound(lngArray)
  35.     iUBound = UBound(lngArray)
  36.     '若只有一个值,不排序
  37.     iMax = 1
  38.     If (iUBound - iLBound) Then
  39.         For iOuter = iLBound To iUBound
  40.             If lngArray(iOuter) > lngArray(iMax) Then iMax = iOuter
  41.         Next iOuter
  42.         iTemp = lngArray(iMax)
  43.         lngArray(iMax) = lngArray(iUBound)
  44.         lngArray(iUBound) = iTemp
  45.         '开始快速排序
  46.         InnerQuickSort lngArray, iLBound, iUBound
  47.     End If
  48. End Sub

  49. Private Sub InnerQuickSort(ByRef lngArray, ByVal iLeftEnd As Long, ByVal iRightEnd As Long)
  50.     Dim iLeftCur As Long
  51.     Dim iRightCur As Long
  52.     Dim iPivot As Byte
  53.     Dim iTemp As Byte
  54.     If iLeftEnd >= iRightEnd Then Exit Sub
  55.     iLeftCur = iLeftEnd
  56.     iRightCur = iRightEnd + 1
  57.     iPivot = lngArray(iLeftEnd)
  58.     Do
  59.         Do
  60.             iLeftCur = iLeftCur + 1
  61.         Loop While lngArray(iLeftCur) < iPivot
  62.         Do
  63.             iRightCur = iRightCur - 1
  64.         Loop While lngArray(iRightCur) > iPivot
  65.         If iLeftCur >= iRightCur Then Exit Do
  66.         '交换值

  67.         iTemp = lngArray(iLeftCur)
  68.         lngArray(iLeftCur) = lngArray(iRightCur)
  69.         lngArray(iRightCur) = iTemp
  70.     Loop
  71.     '递归快速排序

  72.     lngArray(iLeftEnd) = lngArray(iRightCur)
  73.     lngArray(iRightCur) = iPivot
  74.     InnerQuickSort lngArray, iLeftEnd, iRightCur - 1
  75.     InnerQuickSort lngArray, iRightCur + 1, iRightEnd
  76. End Sub

  77. Function getMax(ByRef arr) As String
  78.     getMax = StrReverse(Join(arr, ""))
  79. End Function

  80. Function getMin(ByRef arr) As String
  81.     getMin = Join(arr, "")
  82. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-10-7 14:23 | 显示全部楼层
上清宫主 发表于 2013-10-7 08:34
Sub test()
Dim ar1$(0 To 9), ar2$(0 To 9)
s$ = "3780908"

这只是对"3780908"进行了排列。
最好是自定义函数,对单元格A1中的任何数重排,得最大值、最小值。如:234159,得最大值954321,最小值123459.
回复

使用道具 举报

 楼主| 发表于 2013-10-7 14:33 | 显示全部楼层
hwc2ycy 发表于 2013-10-7 09:09

这么多,那段是的??
试了,好像都不行啊????求大侠!!!!
求助:excel自定义函数,将一个数的数位重排后得出最大值、最小值。如:单元格A1为23419,则A2为最大值94321,A3为最小值12349.
回复

使用道具 举报

 楼主| 发表于 2013-10-7 14:40 | 显示全部楼层
cmjcmj8888 发表于 2013-10-7 14:33
这么多,那段是的??
试了,好像都不行啊????求大侠!!!!
求助:excel自定义函数,将一个数的数 ...

拜托大侠行行好,帮帮忙!!!!!!!!!!!!
回复

使用道具 举报

发表于 2013-10-7 15:34 | 显示全部楼层
cmjcmj8888 发表于 2013-10-7 14:40
拜托大侠行行好,帮帮忙!!!!!!!!!!!!
  1. Function abc(a, b)
  2. Dim pp()
  3. With CreateObject("vbscript.regexp")
  4. .Global = True
  5. .Pattern = "\d"
  6. Set yy = .Execute(a)
  7. For i = 1 To yy.Count
  8. ReDim Preserve pp(0 To i - 1)
  9. pp(i - 1) = yy.Item(i - 1) * 1
  10. Next i
  11. For i = 0 To UBound(pp)
  12. If b = 1 Then
  13. m = m & Application.Small(pp, i + 1)
  14. Else
  15. m = m & Application.Large(pp, i + 1)
  16. End If
  17. Next i
  18. abc = m
  19. End With
  20. End Function
复制代码
这个意思?

附件.rar

12.09 KB, 下载次数: 13

回复

使用道具 举报

 楼主| 发表于 2013-10-7 16:02 | 显示全部楼层
美斯特邦威 发表于 2013-10-7 15:34
这个意思?

好像不对啊?!!
编写一个excel自定义函数:输入一个数,将这个数的各数位重排后,得出最大值、最小值。
如:单元格A1输入2583,则B1输出最大值8532,C1输出最小值2358.
回复

使用道具 举报

发表于 2013-10-7 16:05 | 显示全部楼层
cmjcmj8888 发表于 2013-10-7 16:02
好像不对啊?!!
编写一个excel自定义函数:输入一个数,将这个数的各数位重排后,得出最大值、最小值。
...

难道不是?只是我附件B1是最小值,C1是最大值
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-24 14:35 , Processed in 0.297592 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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