Excel精英培训网

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

[已解决]再次求助:VBA_鼠标选取当前列自定义排序-求修改代码

  [复制链接]
发表于 2012-2-6 19:57 | 显示全部楼层 |阅读模式
上回发的求助,可能是我表达的不清楚,所以。。朋友们做的我没有用上。。。。。

希望这回朋友们能看清我的要求,

具体请看图片 。。。谢谢大家!!!



VBA_鼠标选取当前列自定义排序-求修改代码.rar (22.99 KB, 下载次数: 433)

评分

参与人数 1 -34 金币 -24 收起 理由
爱疯 -34 -24 重复发帖

查看全部评分

发表于 2012-2-6 20:23 | 显示全部楼层
从图中代码看,目的是:
1)添加一个自定义序列
2)应用在某一区域
3)在该区按自定义序列排序

不知哪一步开始,不合楼主要求(楼主是希望怎样)。
一步步说明,相信很多高手能帮上忙的
回复

使用道具 举报

发表于 2012-2-6 20:33 | 显示全部楼层
  1. Sub 排序()
  2.     Dim arr1, arr2, arr3
  3.     Dim i As Long, j As Long, k As Long, n As Long, m As Long
  4.     '设置自定义排序的顺序
  5.     arr1 = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")

  6.     n = ActiveCell.Row    '获取活动单元格行号
  7.     arr2 = Range(Cells(n, 1), Cells([A65536].End(xlUp).Row, "N"))    '活动单元格至最后一行数据赋值给数组arr1
  8.     ReDim arr3(1 To UBound(arr2), 1 To UBound(arr2, 2))
  9.     m = 0    '计数变量
  10.     For i = 0 To UBound(arr1)
  11.         For j = 1 To UBound(arr2)
  12.             If arr1(i) = arr2(j, 3) Then
  13.                 m = m + 1
  14.                 For k = 1 To UBound(arr2, 2)
  15.                     arr3(m, k) = arr2(j, k)
  16.                 Next k
  17.             End If
  18.         Next j
  19.     Next i
  20.     Cells(n, 1).Resize(UBound(arr3), UBound(arr3, 2)) = arr3
  21. End Sub
复制代码
回复

使用道具 举报

发表于 2012-2-6 20:35 | 显示全部楼层
附件: VBA_鼠标选取当前列自定义排序-求修改代码-sj.rar (18.52 KB, 下载次数: 17)
回复

使用道具 举报

 楼主| 发表于 2012-2-6 20:39 | 显示全部楼层
爱疯 发表于 2012-2-6 20:23
从图中代码看,目的是:
1)添加一个自定义序列
2)应用在某一区域

谢谢版主,第一步,是这样的

假如附件中,用鼠标在C4单元格中点一下,那么这里,我们排序的起始位置就是C4,终止位置就是C列中最后一个有数据的单元格。

排序的操作区域就是C4(包括C4这一行)以下所有有数据的行。(排序按“选定扩展区域的方式排序”)

第一步就是鼠标点击某一个单元格,然后就确定了排序的操作区域和排序的操作区域。


回复

使用道具 举报

 楼主| 发表于 2012-2-6 20:43 | 显示全部楼层
sunjing-zxl 发表于 2012-2-6 20:35
附件:

老师,当我不,测试时,一点宏命令就什么数据就没有了
回复

使用道具 举报

发表于 2012-2-6 20:50 | 显示全部楼层
试试这个
  1. Sub 排序()
  2.     Dim arr1, arr2, arr3
  3.     Dim i As Long, j As Long, k As Long, n As Long, m As Long
  4.     '设置自定义排序的顺序
  5.     arr1 = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")

  6.     n = ActiveCell.Row    '获取活动单元格行号
  7.     m = [A65536].End(xlUp).Row
  8.     If n = 1 Or n > m Then
  9.         MsgBox "活动行超出范围,不能排序"
  10.         Exit Sub
  11.     End If
  12.     arr2 = Range(Cells(n, 1), Cells(m, "N"))    '活动单元格至最后一行数据赋值给数组arr1
  13.     ReDim arr3(1 To UBound(arr2), 1 To UBound(arr2, 2))
  14.     m = 0    '计数变量
  15.     For i = 0 To UBound(arr1)
  16.         For j = 1 To UBound(arr2)
  17.             If arr1(i) = arr2(j, 3) Then
  18.                 m = m + 1
  19.                 For k = 1 To UBound(arr2, 2)
  20.                     arr3(m, k) = arr2(j, k)
  21.                 Next k
  22.             End If
  23.         Next j
  24.     Next i
  25.     Cells(n, 1).Resize(UBound(arr3), UBound(arr3, 2)) = arr3
  26.     MsgBox "排序完成"
  27. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-2-6 20:57 | 显示全部楼层
sunjing-zxl 发表于 2012-2-6 20:50
试试这个

老师,当工作表改变时,执行宏命令就会删除全部数据。

我目的是当工作表改变是时,不改变代码,就能正确排序。

回复

使用道具 举报

发表于 2012-2-6 21:01 | 显示全部楼层
你工作表要改成什么样子。
该不会是大变样把
回复

使用道具 举报

发表于 2012-2-6 21:04 | 显示全部楼层
还是不大理解,只好猜了。
  1. Sub 科室排序()
  2.     Dim arr, i&, c0, c1
  3.     '设置自定义排序的顺序
  4.     arr = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")
  5.     With Application
  6.         .ScreenUpdating = False
  7.         .AddCustomList ListArray:=arr
  8.         i = .GetCustomListNum(arr)    '返回字符串数组的自定义序列号
  9.         '设置排序的操作区域
  10.         c0 = ActiveCell.Row
  11.         c1 = ActiveCell.End(xlDown).Row
  12.         With Range(Cells(c0, "c"), Cells(c1, "p"))
  13.             '设置排序的起始单元格
  14.             .Sort key1:=ActiveCell, order1:=xlAscending, _
  15.                   Header:=xlGuess, OrderCustom:=i + 1
  16.         End With
  17.         .DeleteCustomList ListNum:=i
  18.         .ScreenUpdating = True
  19.         MsgBox "排序完成", vbInformation
  20.     End With
  21. End Sub
复制代码

只修改了排序区域

c0 = ActiveCell.Row
c1 = ActiveCell.End(xlDown).Row
With Range(Cells(c0, "c"), Cells(c1, "p"))
'设置排序的起始单元格
.Sort key1:=ActiveCell, order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=i + 1

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 03:22 , Processed in 0.387915 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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