Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: yjwdjfqb

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

  [复制链接]
 楼主| 发表于 2012-2-6 22:58 | 显示全部楼层
爱疯 发表于 2012-2-6 22:54
c = Range("A1").End(xlToRight).Column
这句作用是确定数据源最右侧在哪一列

那我在A列前加一列,就报错,还有如果我有时想在最左侧空二列,就会出错
回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:02 | 显示全部楼层
爱疯 发表于 2012-2-6 22:54
c = Range("A1").End(xlToRight).Column
这句作用是确定数据源最右侧在哪一列

c = Range("A1").End(xlToRight).Column    '数据源最右侧列号


这一句我明白什么意思了,也很有必要


但为什么,在A列前加一列或几列,会报错。。
回复

使用道具 举报

发表于 2012-2-6 23:05 | 显示全部楼层
yjwdjfqb 发表于 2012-2-6 22:58
那我在A列前加一列,就报错,还有如果我有时想在最左侧空二列,就会出错
  1. Sub 科室排序()
  2.     Dim arr, i&, c, r
  3.     '设置自定义排序的顺序
  4.     arr = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")
  5.     With Application
  6.         .ScreenUpdating = False
  7.         .AddCustomList ListArray:=arr
  8.         i = .GetCustomListNum(arr)    '返回字符串数组的自定义序列号
  9.         c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号
  10.         r = Cells(65536, ActiveCell.Column).End(xlUp).Row    '所选单元格所在列最后一个数据的行号
  11.         '排序区域
  12.         With Range(Cells(ActiveCell.Row, 1), Cells(r, c))
  13.             '设置排序的起始单元格
  14.             .Sort key1:=ActiveCell, order1:=xlAscending, _
  15.                   Header:=xlNo, OrderCustom:=i + 1
  16.         End With
  17.         .DeleteCustomList ListNum:=i
  18.         .ScreenUpdating = True
  19.         MsgBox "排序完成", vbInformation
  20.     End With
  21. End Sub
复制代码
附件5.rar (19.16 KB, 下载次数: 5)
回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:12 | 显示全部楼层
爱疯 发表于 2012-2-6 23:05

c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号

如果表头不在第一行,也有问题

我是这样想的,就把IV1改为  一个表达示 即 当前鼠标所在位置最左侧有数据的单元格

回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:13 | 显示全部楼层
爱疯 发表于 2012-2-6 23:05

c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号

如果表头不在第一行,也有问题

我是这样想的,就把IV1改为  一个表达示 即 当前鼠标所在行最左侧有数据的单元格
回复

使用道具 举报

发表于 2012-2-6 23:14 | 显示全部楼层
yjwdjfqb 发表于 2012-2-6 23:02
c = Range("A1").End(xlToRight).Column    '数据源最右侧列号

因为确定时我是参考的A列的A1,即参考点事A1单元格。
而你说要在A列前插入多列,这样,以A1为参考点的方法就受到影响(出错了)。

参照方法有很多,可根据实际需要调整,以确保在特定条件下正确。
回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:15 | 显示全部楼层
爱疯 发表于 2012-2-6 23:14
因为确定时我是参考的A列的A1,即参考点事A1单元格。
而你说要在A列前插入多列,这样,以A1为参考点的方 ...

c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号

如果表头不在第一行,也有问题

我是这样想的,就把IV1改为  一个表达示 即 当前鼠标所在行最左侧有数据的单元格

这样的话,全部条件都由鼠标当前所在位置来决定,请老师修改
回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:20 | 显示全部楼层
爱疯 发表于 2012-2-6 23:14
因为确定时我是参考的A列的A1,即参考点事A1单元格。
而你说要在A列前插入多列,这样,以A1为参考点的方 ...

c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号

如果表头不在第一行,也有问题

我是这样想的,就把IV1改为  一个表达示 即 当前鼠标所在行最左侧有数据的单元格(包括有表格表线的单元格都可以)

这样的话,全部条件都由鼠标当前所在位置来决定,请老师修改
回复

使用道具 举报

发表于 2012-2-6 23:27 | 显示全部楼层    本楼为最佳答案   
yjwdjfqb 发表于 2012-2-6 23:13
c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号

如果表头不在第一行,也有问题

  1. Sub 科室排序()
  2.     Dim arr, i&, c, r
  3.     '设置自定义排序的顺序
  4.     arr = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")
  5.     If Not Cells.Find("序号") Is Nothing Then
  6.         Set Rng = Cells.Find("序号").CurrentRegion
  7.         If Not Intersect(Rng, ActiveCell) Is Nothing Then
  8.             With Application
  9.                 .ScreenUpdating = False
  10.                 .AddCustomList ListArray:=arr
  11.                 i = .GetCustomListNum(arr)    '返回字符串数组的自定义序列号
  12.                 c = Rng.Item(1, 1).End(xlToRight).Column   '数据源最右侧列号
  13.                 r = Cells(65536, ActiveCell.Column).End(xlUp).Row    '所选单元格所在列最后一个数据的行号
  14.                 '排序区域
  15.                 With Range(Cells(ActiveCell.Row, Rng.Column), Cells(r, c))
  16.                     '设置排序的起始单元格
  17.                     .Sort key1:=ActiveCell, order1:=xlAscending, _
  18.                           Header:=xlNo, OrderCustom:=i + 1
  19.                 End With
  20.                 .DeleteCustomList ListNum:=i
  21.                 .ScreenUpdating = True
  22.                 MsgBox "排序完成", vbInformation
  23.             End With
  24.         End If
  25.     End If
  26. End Sub
复制代码
附件6.rar (20.63 KB, 下载次数: 11)
回复

使用道具 举报

 楼主| 发表于 2012-2-6 23:37 | 显示全部楼层
爱疯 发表于 2012-2-6 23:27

Sub 科室排序()
    Dim arr, i&, c, r
    '设置自定义排序的顺序
    arr = Array("外妇科", "手术室", "内儿科", "西医科", "中医科", "耳鼻喉科", "放射科", "检验科", "B超室", "口腔科", "针灸科", "西药房", "中药房", "收费室", "疾控科", "合管办", "后勤科")
    With Application
        .ScreenUpdating = False
        .AddCustomList ListArray:=arr
        i = .GetCustomListNum(arr)    '返回字符串数组的自定义序列号
        c = Range("iv1").End(xlToLeft).Column    '数据源最右侧列号
        r = Cells(65536, ActiveCell.Column).End(xlUp).Row    '所选单元格所在列最后一个数据的行号
        '排序区域
        With Range(Cells(ActiveCell.Row, 1), Cells(r, c))
            '设置排序的起始单元格
            .Sort key1:=ActiveCell, order1:=xlAscending, _
                  Header:=xlNo, OrderCustom:=i + 1
        End With
        .DeleteCustomList ListNum:=i
        .ScreenUpdating = True
        MsgBox "排序完成", vbInformation
    End With
End Sub


就用这个
只改这一句好吧                c = Rng.Item(1, 1).End(xlToRight).Column   '数据源最右侧列号

不加那个“序号”的判断
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 09:44 , Processed in 0.288692 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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