首页 > 解决方案 > Excel VBA 排序崩溃 Excel for Mac

问题描述

我有一个 excel 电子表格,后面有很多 VBA。这一切都在 PC 上运行良好。我现在在安装了 Office 365 for Mac 的 Mac 上对其进行测试。mac 正在运行 Big Sur,v11.3。

所有更复杂的代码都可以正常工作,但是简单的排序功能会导致 excel 崩溃。它不会引发 VBA 错误 - 它只是完全关闭了 excel。即使我使用On Error GoTo Something这样我可以生成一个错误消息框,它甚至不会这样做——只要它遇到这行代码,excel就消失了。

导致崩溃的代码行是:

rngAllData.Sort key1:=Cells(3, colNum), order1:=xlDescending

rngAllData是一个有效的范围,如果我将代码行更改为简单地rngAllData.Select选择我期望排序的范围,没有问题。它似乎不喜欢排序功能。

我创建了一个新的 excel 文档,在 A 列中添加了一些随机数,并创建了一个调用按钮,Range("A1:A8").Sort key1:=Range("A1")结果是相同的 - 即时崩溃。所以问题显然在于Range.Sort

鉴于我没有收到任何错误消息,我该如何进行故障排除?如何修改代码以使其在 PC 和 mac 上都可以使用?

完整的 sub 复制在下面,变量在其他地方声明,同样,这在 PC 上工作正常,所以它不应该像未声明的变量问题。

Sub SortData()
'This sub is called to sort table data
On Error GoTo errHandler

'Determine column number of clicked button
colNum = ActiveSheet.Buttons(Application.Caller).TopLeftCell.Column

'If the selected sort column is different to the last sorted column, reset the sort order back to default
If colNum <> lastSortCol Then sortOrder = False
lastSortCol = colNum

'Determine range of data
Set rngAllData = Range("A1").CurrentRegion.Offset(2)
Set rngAllData = rngAllData.Resize(rngAllData.Rows.Count - 2, rngAllData.Columns.Count - 1)

'Sort data
If sortOrder Then rngAllData.Sort key1:=Cells(3, colNum), order1:=xlDescending
If Not sortOrder Then rngAllData.Sort key1:=Cells(3, colNum), order1:=xlAscending
sortOrder = Not (sortOrder)
Exit Sub

errHandler:
MsgBox "Error in SortData.", vbCritical

End Sub

标签: excelvbamacosoffice365

解决方案


似乎 excel for mac 不喜欢对范围对象进行排序。

我的数据表的大小可能会有所不同,因此要找到要排序的数据范围,我使用Range("A1").CurrentRegion. 然后我需要打折三个标题行和最后一列(其中有一些应该排序的控件),所以我使用Range.Offsetand Range.Resize。与其有一个巨大的序言Range.Sort并使线条从页面的一侧延伸,我想我只是创建一个范围对象来引用:

'Determine range of data
Set rngAllData = Sheets("Job List").Range("A1").CurrentRegion.Offset(2)
Set rngAllData = rngAllData.Resize(rngAllData.Rows.Count - 2, rngAllData.Columns.Count - 1)

'Sort data
If sortOrder Then rngAllData.Sort key1:=Cells(3, colNum), order1:=xlDescending
If Not sortOrder Then rngAllData.Sort key1:=Cells(3, colNum), order1:=xlAscending
sortOrder = Not (sortOrder)

一旦我尝试Range.Sort对任何范围对象进行操作,就会出现不良行为。

相反,如果我是手写的:

'Determine range of data
Set rngAllData = Sheets("Job List").Range("A1").CurrentRegion.Offset(2)

'Sort data
If sortOrder Then Sheets("Job List").Range("A1").CurrentRegion.Offset(2).Resize(rngAllData.Rows.Count - 2, rngAllData.Columns.Count - 1)
.Sort key1:=Cells(3, colNum), order1:=xlDescending
If Not sortOrder Then Sheets("Job List").Range("A1").CurrentRegion.Offset(2).Resize(rngAllData.Rows.Count - 2, rngAllData.Columns.Count - 1)
.Sort key1:=Cells(3, colNum), order1:=xlAscending
sortOrder = Not (sortOrder)

...然后它看起来很可怕,但它的工作原理。

我猜这是 Mac 的 excel 中的一个错误,而不是我天生做错的事情,但现在我会发布另一个线程,因为我有一个更具体的问题,看看我是否能找到一种方法来整理它了。

后续帖子在这里


推荐阅读