Моя процедура сортировки выполняется на первом листе, но не на другом - PullRequest
0 голосов
/ 25 апреля 2019

Процедура сортировки должна применяться к нескольким рабочим листам с различным содержанием.Поэтому я выбрал решение "для каждого sh в листах ...".Эта процедура сортировки отлично работает для первого выбранного листа.На втором листе в команде «Применить» отображается сообщение «Ошибка времени выполнения 1004 Ссылка на сортировку недопустима», несмотря на то, что разные переменные отображают правильные значения.Ссылаясь на « '1004':« Ссылка на сортировку недопустима. »», я изменил «С sh.Sort» на «С sh.Range (startcell, lastcell) .Sort», что приводит к ошибкеMsgstr "Невозможно получить свойство сортировки класса диапазона".Может ли участник форума помочь мне решить эту проблему?Заранее спасибо

Эта процедура сортировки выполняется на первом листе, но не на остальных.

Sub sortData()
Dim startcell As Range, lastcell As Range
Dim sh As Worksheet
Dim x_Birth As Long, lastcell_Birth As Long
For Each sh In Worksheets
With sh
        If Left(sh.Name, 2) = "B_" Then
            .Columns(5).Insert
            .Cells(1, 5) = "Y_Birth"
            lastcell_Birth = sh.Cells(Rows.count, "A").End(xlUp).Row
            For x_Birth = 2 To lastcell_Birth
                .Cells(x_Birth, 5) = Right(.Cells(x_Birth, 4), 4)
            Next
            Set startcell = Range(.Cells(1, 1), .Cells(1, 1))
            Set lastcell = Range(.Cells(lastcell_Birth, 7), .Cells(lastcell_Birth, 7))
            With sh.Sort
                 .SortFields.Add Key:=sh.Range("F1"), Order:=xlAscending
                 .SortFields.Add Key:=sh.Range("E1"), Order:=xlAscending
                 .SetRange Range(startcell, lastcell)
                 .Header = xlYes
                 .Apply
            End With
            sh.Columns("E:E").Select
            Selection.Columns.EntireColumn.Delete
        End If
End With
Next
End Sub

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете попробовать:

Option Explicit
Sub sortData()

    Dim startcell As Range, lastcell As Range
    Dim sh As Worksheet
    Dim x_Birth As Long, lastcell_Birth As Long

    For Each sh In Worksheets

        With sh

            If Left(.Name, 2) = "B_" Then

                .Columns(5).Insert
                .Cells(1, 5) = "Y_Birth"

                lastcell_Birth = .Cells(Rows.Count, "A").End(xlUp).Row

                    For x_Birth = 2 To lastcell_Birth
                        .Cells(x_Birth, 5).Value = Right(.Cells(x_Birth, 4).Value, 4)
                    Next

                Set startcell = .Range(.Cells(1, 1), .Cells(1, 1))

                Set lastcell = .Range(.Cells(lastcell_Birth, 7), .Cells(lastcell_Birth, 7))

                .Sort.SortFields.Clear

                With .Sort
                    .SortFields.Add Key:=sh.Range("E1"), Order:=xlAscending
                    .SortFields.Add Key:=sh.Range("F1"), Order:=xlAscending
                    .SetRange sh.Range(startcell, lastcell)
                    .Header = xlYes
                    .Apply
                End With

                .Columns("E:E").Columns.EntireColumn.Delete

            End If

        End With

    Next

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...