По моему опыту, вы можете сортировать только активный лист. Попробуйте добавить .Activate
после WB.Sheets("Sheet1")
.
Информация о последней сортировке сохраняется на листе. Иногда я подозреваю, что это проблема, а не сортировка листа, когда он не активен. Но .Activate
всегда работал для меня, и поэтому я никогда не исследовал дальше.
Дополнительная информация
Я предполагал, что это ошибка Sort
, но это AutoFilter
.
Я могу сгенерировать ошибку 1004, оставив строку 1 пустой.
Какую цель служит оператор AutoFilter
? С AutoFilterMode = False
я бы ожидал, что он вернется Nothing
. Почему бы не удалить это утверждение?
Я также обеспокоен диапазоном, который вы сортируете. Вы вычитаете количество неиспользуемых строк в верхней части и неиспользуемых столбцов слева, чтобы вычислить lstrow и lstcol, но затем включаете эти неиспользуемые строки и столбцы в сортировку. В результате строки внизу и столбцы справа не будут отсортированы.
Если в верхней части нет неиспользуемых строк, а слева неиспользуемые столбцы, это не имеет значения, но вам нужно решить, какой диапазон вы хотите отсортировать.
Дополнительная информация 2
Этот раздел был добавлен после того, как я обнаружил четвертый способ взлома исходного кода. Следующий код, похоже, защищен от бомб.
Option Explicit
Sub TestSort2()
Dim WB As Workbook, WasWBOpen As Boolean, srcfile As String, srcpath As String
Dim onecol As Integer, twocol As Integer, thrcol As Integer
' Undeclared or new variables
Dim InxWB As Long
Dim lstrow As Long
Dim lstcol As Long
Dim srcpathfile As String
' Report the name of the active workbook
Debug.Print "Original active workbook " & ActiveWorkbook.Name
' I created two workbooks named "Failed sort 1.xls" and "Failed sort 2.xls".
' Both are in the same directory. "Failed sort 1.xls" contains this macro.
' "Failed sort 2.xls" contains the data.
srcpath = Application.ActiveWorkbook.Path
srcfile = "Failed sort 2.xls"
srcpathfile = srcpath & "\" & srcfile
WasWBOpen = False
' Check the open workbook for srcfile
For InxWB = 1 To Workbooks.Count
If Workbooks(InxWB).Name = srcfile Then
' Required workbook already open
Set WB = Workbooks(InxWB)
WB.Activate ' Activate it
WasWBOpen = True
Exit For
End If
Next
If Not WasWBOpen Then
' Files was not open
If Dir(srcpathfile) <> "" Then
' File exists
' Do you need UpdateLinks:=False? If there are links
' with the sort be affected if they are not updated?
Set WB = Workbooks.Open(srcpathfile, UpdateLinks:=False)
Else
' File does not exist
Call MsgBox(srcpathfile & " does not exist", vbOKOnly)
Exit Sub
End If
End If
' WB is now the active workbook whether it was open before or not
Debug.Print "Final active workbook " & ActiveWorkbook.Name ' Confirm
With Sheets("Sheet1")
.Activate
.AutoFilterMode = False
' Get the last used row and cell of the worksheet
lstrow = Cells.SpecialCells(xlCellTypeLastCell).Row
lstcol = Cells.SpecialCells(xlCellTypeLastCell).Column
onecol = 3
twocol = 5
thrcol = 8
If onecol > lstcol Or twocol > lstcol Or thrcol > lstcol Then
Call MsgBox("The sort range does include the sort columns", vbOKOnly)
If Not WasWBOpen Then
Close
End If
Exit Sub
End If
Range(Cells(1, 1), Cells(lstrow, lstcol)).Sort _
Key1:=Columns(onecol), Order1:=xlAscending, _
Key2:=Columns(twocol), Order2:=xlAscending, _
Key3:=Columns(thrcol), Order3:=xlAscending, Header:=xlYes
End With
If Not WasWBOpen Then
Close
End If
End Sub