Excel 2003: программный вид листа в другой книге - PullRequest
1 голос
/ 09 января 2012

Из текущей рабочей книги я хочу открыть лист в исходной рабочей книге, отключить любую фильтрацию, которая может присутствовать, отсортировать по одному столбцу, затем другому, затем другому.Получаю 1004 и другие ошибки.Это должно быть запущено в 2003 году. Любая помощь будет оценена!

Dim WB As Workbook, WasWBOpen As Boolean, srcfile As String, srcpath As String,    
onecol as integer, twocol as integer, thrcol as integer

srcpath = "blahblah"
srcfile = "blah.xls"

On Error Resume Next
Set WB = Workbooks(srcfile)
WasWBOpen = True
On Error GoTo 0
If WB Is Nothing Then
Set WB = Workbooks.Open(srcpath & srcfile, UpdateLinks:=False)
WasWBOpen = False
End If

'code before this opens source wkbook

lstrow = Worksheets("Sheet1").UsedRange.Row - 1 + Worksheets("Sheet1").UsedRange.Rows.Count
lstcol = Worksheets("Sheet1").UsedRange.Column - 1 + Worksheets("Sheet1").UsedRange.Columns.Count

onecol=3
twocol=5
thrcol=8

With WB.Sheets("Sheet1")

.AutoFilterMode = False
.Range("1:1").AutoFilter
'Here's where error occurs--
.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 WasWBOpen = False Then
WB.Close
End If

Ответы [ 3 ]

1 голос
/ 09 января 2012

Единственное, что я могу сделать, - это, возможно, ваш выбор не включает столбцы 3, 5 или 8. Каковы значения lstrow и lstcol до ошибки?

1 голос
/ 09 января 2012
.Range(Cells(1, 1), Cells(lstrow, lstcol)).Sort _ 

лучше записать как:

.Range(.Cells(1, 1), .Cells(lstrow, lstcol)).Sort _ 
1 голос
/ 09 января 2012

По моему опыту, вы можете сортировать только активный лист. Попробуйте добавить .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

...