Excel精英培训网

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

各个连续区域的内部数字排序

  [复制链接]
发表于 2011-5-26 19:32 | 显示全部楼层 |阅读模式
           这个题目不是要对整列进行统一排序,而是要对每一个连续的区域进行内部排序。详见下图:

          注:函数或VBA均可

            
     

  本题已设置仅作者可见,两天后解除。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2011-5-26 20:08 | 显示全部楼层
Sub test()
Dim i%
For i = 1 To [a65536].End(xlUp).Row + 1
If Cells(i, 1) = "" Then Cells(i - 1, 1).CurrentRegion.Sort Key1:=Cells(i - 1, 1)
Next
End Sub

评分

参与人数 1 +10 收起 理由
兰色幻想 + 10

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 20:25 | 显示全部楼层
  1. Sub SortSub()
  2. Dim iRowMax As Integer
  3. Dim iSta As Integer
  4. Dim i As Integer

  5. iRowMax = Range("A65536").End(xlUp).Row
  6. iSta = 0
  7. For i = 1 To iRowMax + 1
  8.     If Cells(i, 1) = "" Then
  9.         If i - 1 <> iSta Then Range("C" & iSta + 1 & ":C" & i - 1).FormulaR1C1 =  "=SMALL(R" & iSta + 1 & "C1:R" & i - 1 & "C1,ROW()-" & iSta & ")"
  10.         iSta = i
  11.     End If
  12. Next
  13. End Sub
复制代码

评分

参与人数 1 +7 收起 理由
兰色幻想 + 7

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 20:36 | 显示全部楼层
回复 兰色幻想 的帖子

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +8 收起 理由
兰色幻想 + 8

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 20:47 | 显示全部楼层
本帖最后由 chunlin1wang 于 2011-5-26 21:24 编辑

=IF(A1:A18="","",MOD(SMALL(MMULT((ROW(1:18)>=COLUMN(A:R))*1,(A1:A18="")*1)/1%%+A1:A18,ROW(1:18)),10^4))
  1. Sub paix()
  2.     For i = 1 To Range("A65536").End(xlUp).Row
  3.         If Range("A" & i) <> "" Then
  4.             Range("A" & i).CurrentRegion.Copy Range("d" & i)
  5.             Range("d" & i).CurrentRegion.Sort Key1:=Range("d" & i), Order1:=xlAscending
  6.             i = i + Range("A" & i).CurrentRegion.Count
  7.         End If
  8.     Next i
  9. End Sub
复制代码

点评

VBA思路也非常好  发表于 2011-5-26 21:44
好思路  发表于 2011-5-26 21:11

评分

参与人数 1 +15 收起 理由
兰色幻想 + 15

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 21:26 | 显示全部楼层
=IF(A1="","",MOD(SMALL(IF(A$1:A$18<>"",COUNTIF(OFFSET(A$1,,,ROW($1:$18)),"")/1%%+A$1:A$18),COUNT(A$1:A1)),10^4))

评分

参与人数 1 +15 收起 理由
兰色幻想 + 15 very Good

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 21:43 | 显示全部楼层
Sub sample()
Dim MyRow As Long
MyRow = 1
Do
With Sheets("Sheet1").Sort
    .SetRange Range("a" & MyRow).CurrentRegion
    .Header = xlNo
    .Orientation = xlTopToBottom
    .Apply
End With
MyRow = Range("a" & MyRow).End(xlDown).Row
MyRow = Range("a" & MyRow).End(xlDown).Row
Loop Until MyRow > Cells(Rows.Count, 1).End(xlUp).Row
End Sub

=IF(A1="","",MOD(SMALL(IFERROR(LOOKUP(ROW($1:$18),IF(A$1:A$18="",ROW($1:$18))),1)/1%+A$1:A$18,ROW(A1)),100))

评分

参与人数 1 +16 收起 理由
兰色幻想 + 16

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 21:47 | 显示全部楼层
取巧的公式:
=IF(A1:A18="","",--RIGHT(SMALL(COUNTIF(OFFSET(A1,,,ROW(1:18)),"")+A1:A18%,ROW(1:18)),2))
老实人的公式:
=IF(A1:A18="","",ROUND(MOD(SMALL(COUNTIF(OFFSET(A1,,,ROW(1:18)),"")+A1:A18%,ROW(1:18)),1)*100,))

评分

参与人数 1 +15 收起 理由
兰色幻想 + 15

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 22:02 | 显示全部楼层
取巧公式:=IF(A1:A18="","",--RIGHT(TEXT(SMALL(COUNTIF(OFFSET(A1,,,ROW(1:18)),"")+A1:A18%,ROW(1:18)),"0.00"),2))

评分

参与人数 1 +6 收起 理由
兰色幻想 + 6

查看全部评分

回复

使用道具 举报

发表于 2011-5-26 22:13 | 显示全部楼层
=IF(A1="","",--RIGHT(SMALL(COUNTIF(OFFSET($A$1,,,ROW($1:$18),),"=")*10000+$A$1:$A$18,ROW(A1)),2))

这个有点长,不会短的

点评

这个真厉害!思路真巧妙啊~!  发表于 2011-5-28 21:50

评分

参与人数 1 +15 收起 理由
兰色幻想 + 15

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 08:08 , Processed in 0.272902 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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