Excel VBA 排序问题

模块的Sub希望实现这样的功能:对Sheet1的B22:D100格进行排序(21行为标题行),依据B列的内容,升降序按照:如果Sheet1的B10为True则升序排列,否... 模块的Sub希望实现这样的功能:
对Sheet1的B22:D100格进行排序(21行为标题行),依据B列的内容,升降序按照:
如果Sheet1的B10为True则升序排列,否则为降序排列

现写得:

Sub MySort()
If Sheet1.Range("B10") = True Then
Sheet1.Range("B22:D100").Sort key1:=Sheet1.Range("B21"), order1:=xlAscending, Header:=xlNo
Else
Sheet1.Range("B22:D100").Sort key1:=Sheet1.Range("B21"), order1:=xlDescending, Header:=xlNo
End If
End Sub
但发现运行过后无任何效果,将Range("B21")换为Columns("B")依然无效果

是我的理解错了么??这个排序应该肿么写?
展开
 我来答
pepe3399
推荐于2019-01-09 · 知道合伙人软件行家
pepe3399
知道合伙人软件行家
采纳数:1259 获赞数:5944
1988年毕业于苏州市职业大学计算机专业 从事软件开发5年 从事生产管理20年

向TA提问 私信TA
展开全部

有些特殊排序要求,对于EXCEL标准功能是无法解决的。这时就可以用VBA来对应。例如:有一张原始数据表,如图:

根据此原始数据建立了一张分类汇总数据表,如图:

要求是,当明细表数据发生变更时,希望汇总表能自动排序。这样的要求,用手工排序就无法自动了。这样的要求只能依赖于VBA。首先编制一个排序的程序,代码如下:

Sub 排序()

Dim mYsheet As String

Dim arr(1 To 3, 1 To 2)

Dim I, J, K As Integer

Dim M_S1 As String '存放交换地区名

Dim M_S2 As Double '存放交换销售额

mYsheet = "汇总排名"

Sheets(mYsheet).Select

'将数值读取到数组中

For I = 1 To 3

    For J = 1 To 2

        arr(I, J) = Cells(I + 1, J + 1)

    Next J

Next I

'排序

For I = 1 To 2

   For J = I + 1 To 3

       If arr(I, 2) < arr(J, 2) Then

          M_S1 = arr(I, 1)

          M_S2 = arr(I, 2)

          arr(I, 1) = arr(J, 1)

          arr(I, 2) = arr(J, 2)

          arr(J, 1) = M_S1

          arr(J, 2) = M_S2

       End If

   Next J

Next I

'将数组的排序结果存放到单元格中

For I = 1 To 3

   Cells((I + 1), 2) = arr(I, 1)

Next I

 End Sub

再编制一个单元格内容变更的事件触发程序,代码如下:(注:这个代码要放在原始数据表中)

Private Sub worksheet_change(ByVal target As Range)

 If target.Column <= 4 Then

     排序

  End If

End Sub

Excel小奇
2018-07-26 · 知道合伙人软件行家
Excel小奇
知道合伙人软件行家
采纳数:902 获赞数:6175
EXCEL图书作者,Microsoft 认证Excel专家。

向TA提问 私信TA
展开全部
这个7103暂停是一个文本格式了,在EXCEL中,文本型数据比数值型的大,所以排序就出现排在最后的情况,给楼主两个建议,第一是建立自定义序列,第二是把暂停等特殊字样备注到单独的列,这样排序时就会按数字大小排序了。
推荐使用第二个建议。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
TAT萝卜
2014-01-27 · TA获得超过4972个赞
知道大有可为答主
回答量:3084
采纳率:66%
帮助的人:1117万
展开全部
代码中的Sheet1有时并不对应工作表Sheet1
改成sheets("Sheet1")试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ylmyzjz
推荐于2016-06-23 · TA获得超过135个赞
知道答主
回答量:183
采纳率:0%
帮助的人:132万
展开全部
可能是排序的代码不对,以下是2010版的VBA:
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B22:D100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("B21:D100")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
-------------------------------------------------------
更正:Excel2003版必须先选中(激活)工作表才能排序,2010的可以直接排。所以,加上下面语句试试:
ThisWorkbook.Worksheets("Sheet1").Select
追问
你好,我的是2013版,按你说的程序,会停在.Apply一行报:
运行时错误'1004' 应用程序定义或对象定义错误 这是肿么回事??

尝试把.SetRange Range("B21:D100")
换成.SetRange ActiveWorkbook.Worksheets("日程表").Range("B21:D100")
错误依旧

大神,这是肿么回事???
追答
把文件发到917798482@qq.com,我试试看。
上面第二行改一下(排序关键字只能是一列"B22:B100",我不小心给错了):
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B22:B100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
swaywood
2014-01-27 · TA获得超过484个赞
知道小有建树答主
回答量:847
采纳率:0%
帮助的人:150万
展开全部
排序写到数组再写进单元格可以不?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式