Excel VBA 排序问题

模块的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")依然无效果

是我的理解错了么??这个排序应该肿么写?

有些特殊排序要求,对于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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-07-26
这个7103暂停是一个文本格式了,在EXCEL中,文本型数据比数值型的大,所以排序就出现排在最后的情况,给楼主两个建议,第一是建立自定义序列,第二是把暂停等特殊字样备注到单独的列,这样排序时就会按数字大小排序了。
推荐使用第二个建议。
第2个回答  2014-01-27
代码中的Sheet1有时并不对应工作表Sheet1
改成sheets("Sheet1")试试
第3个回答  推荐于2016-06-23
可能是排序的代码不对,以下是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")
错误依旧

大神,这是肿么回事???

追答

把文件发到[email protected],我试试看。
上面第二行改一下(排序关键字只能是一列"B22:B100",我不小心给错了):
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B22:B100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

本回答被提问者和网友采纳
第4个回答  2014-01-27
排序写到数组再写进单元格可以不?