Excel VBA 排序问题
对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")依然无效果
是我的理解错了么??这个排序应该肿么写? 展开
推荐于2019-01-09 · 知道合伙人软件行家
有些特殊排序要求,对于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
2018-07-26 · 知道合伙人软件行家
推荐使用第二个建议。
改成sheets("Sheet1")试试
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