Excel精英培训网

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

[已解决]求助: 選取指定範圍內的最大/最小相差值

[复制链接]
发表于 2011-9-21 22:58 | 显示全部楼层 |阅读模式
請教各位高手下面的問題:

附件中, E 欄的"change of rate" 是B 欄中每2個數的相差值, 例如E3=B3-B2, 我想選取並在另外2 欄裡列出每5 行的最大與最小的相差值, 也就是列出 E2:E6 的最大/最小相差值, 然後到 E7:E11,... 如此類推直到最後5行。如果最後一組不夠5 行數, 也照樣選取。中間有些數值是空白的, 比如說5個數裡面有2個空白, 就只選取剩下3個數中的最大/最小相差值。

以首三組為例, 希望列出的結果為: E2:E6 最大相差是0.33, 最小是0。 E7:E11 最大相差是0.53, 最小差是0.03, 而E12:E16的最大相差為0.67, 最小的差數則是 -0.02 , 如此類推

請問可以如何以VBA 實現呢? 非常感謝指教!


maxmin.rar (30.35 KB, 下载次数: 26)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-9-21 23:17 | 显示全部楼层
不明白前两组为什么不算负数,第三组又算。
回复

使用道具 举报

发表于 2011-9-21 23:18 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2011-9-21 23:32 | 显示全部楼层
本帖最后由 monstrooilis 于 2011-9-21 23:35 编辑
liuguansky 发表于 2011-9-21 23:18
哦了,以绝对值为准

對的, 列出的時候要保留正負號, 但是比較時以絕對值為準。 WorksheetFunction.Max() 或WorksheetFunction.Min() 指令好像不能直接比較絕對值, 所以求教...
回复

使用道具 举报

发表于 2011-9-22 00:28 | 显示全部楼层
本帖最后由 mxg825 于 2011-9-22 00:39 编辑
  1. Sub mxg()
  2. Dim X As Long, Y As Long
  3. Dim Aran As Range, Bran As Range
  4. Y = Range("B65536").End(xlUp).Row
  5. For X = 3 To Y
  6. Set Aran = Cells(X - 1, 2)
  7. Set Bran = Cells(X, 2)
  8.     If IsNumeric(Aran) And IsNumeric(Bran) Then '是否数值
  9.      If Aran > Bran Then
  10.       Cells(X, 5) = -(Application.Max(Abs(Aran), Abs(Bran)) - Application.Min(Abs(Aran), Abs(Bran)))
  11.       Else
  12.       Cells(X, 5) = Application.Max(Abs(Aran), Abs(Bran)) - Application.Min(Abs(Aran), Abs(Bran))
  13.       End If
  14.     Else
  15.       Cells(X, 5) = "无效"
  16.     End If
  17. Next
  18. End Sub
复制代码
如果 B列没有负数...ABS() 可以不用!
  1. Sub mxg2()
  2. Dim X As Long, Y As Long
  3. Dim Aran As Range, Bran As Range
  4. Y = Range("B65536").End(xlUp).Row
  5. For X = 3 To Y
  6. Set Aran = Cells(X - 1, 2)
  7. Set Bran = Cells(X, 2)
  8.     If IsNumeric(Aran) And IsNumeric(Bran) Then '是否数值
  9.      If Aran > Bran Then
  10.       Cells(X, 5) = -(Application.Max(Aran, Bran) - Application.Min(Aran, Bran))
  11.       Else
  12.       Cells(X, 5) = Application.Max(Aran, Bran) - Application.Min(Aran, Bran)
  13.       End If
  14.     Else
  15.       Cells(X, 5) = "无效"
  16.     End If
  17. Next
  18. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2011-9-22 00:45 | 显示全部楼层
本帖最后由 monstrooilis 于 2011-9-22 00:48 编辑
mxg825 发表于 2011-9-22 00:28
如果 B列没有负数...ABS() 可以不用!

謝謝回覆! 請問要如何在新一欄把各個數值列出呢? 例如在column G 寫出全部的最大差值, H 寫出全部的最小差值

新手看代碼很頭大, 想請教大大的哪一行代碼是把每5個數分成一組比較?
回复

使用道具 举报

发表于 2011-9-22 00:52 | 显示全部楼层
Sub mxg2()
Dim X As Long, Y As Long
Dim Aran As Range, Bran As Range
Y = Range("B65536").End(xlUp).Row
For X = 3 To Y
Set Aran = Cells(X - 1, 2)
Set Bran = Cells(X, 2)
    If IsNumeric(Aran) And IsNumeric(Bran) Then '是否数值
     If Aran > Bran Then
      Cells(X, 5) = -(Application.Max(Aran, Bran) - Application.Min(Aran, Bran))
      Else
      Cells(X, 5) = Application.Max(Aran, Bran) - Application.Min(Aran, Bran)
      End If
    Else
      Cells(X, 5) = "无效"
    End If
Next
End Sub


改上面红色地方:

[B] 为B 列 对应数值为第二列 [2]

[5] 为填充结果列  5表示 第五列 E列
回复

使用道具 举报

发表于 2011-9-22 00:56 | 显示全部楼层
你把结果 用公式写出来。。或把过程写出来。。
回复

使用道具 举报

 楼主| 发表于 2011-9-22 01:08 | 显示全部楼层
請看一下這個代碼:
  1. Sub max1()
  2. Sheet1.Activate
  3. Application.ScreenUpdating = False
  4. Sheet1.UsedRange.Offset(0, 5).ClearContents
  5. R = [e65536].End(3).Row
  6. For i = 2 To R
  7.     If IsNumeric(Cells(i, 5)) Then Cells(i, 8) = Cells(i, 5) Else: Cells(i, 8) = ""
  8. Next
  9. For i = 2 To R Step 5
  10.     Cells(i, 6) = Application.Max(Range(Cells(i, 8), Cells(i + 4, 8)))
  11.     Cells(i, 7) = Application.Min(Range(Cells(i, 8), Cells(i + 4, 8)))
  12. Next
  13. [f1].Resize(1, 2) = Array("max", "min")
  14. Sheet1.UsedRange.Offset(0, 7).ClearContents
  15. Application.ScreenUpdating = True
  16. End Sub
  17. Sub max2()
  18. Sheet1.Activate
  19. arr = Range("e2", [e65536].End(3).Offset(5))
  20. For i = 1 To UBound(arr)
  21.     If IsNumeric(arr(i, 1)) Then arr(i, 1) = arr(i, 1) Else: arr(i, 1) = ""
  22. Next
  23. ReDim crr(1 To UBound(arr), 1 To 2)
  24. For i = 1 To UBound(arr) - 5 Step 5
  25.     ReDim brr(1 To 5, 1 To 1)
  26.     For k = 0 To 4
  27.         brr(k + 1, 1) = arr(k + i, 1)
  28.     Next
  29.     crr(i, 1) = WorksheetFunction.Max(brr)
  30.     crr(i, 2) = WorksheetFunction.Min(brr)
  31. Next
  32. [f1].Resize(1, 2) = Array("max", "min")
  33. [f2].Resize(UBound(arr), 2) = crr
  34. End Sub
复制代码
這樣運行的話, 找出的最大和最小相差值是包括正負號的, 但是我想以絕對值來比較, 比如第三組(E12:E16) 它找到最大是0.67, 最小是-0.28
但我想得出的結果是:  最大差值是0.67, 而最小差值則是 -0.02, 不知道該如何修改...
回复

使用道具 举报

发表于 2011-9-22 01:13 | 显示全部楼层
27行  brr(k + 1, 1) = arr(k + i, 1)

改为 brr(k + 1, 1) =ABS( arr(k + i, 1))

试试看  没你的附件 没办法测试

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 19:02 , Processed in 0.290297 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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