Сортировка столбца на основе пользовательского ввода - PullRequest
0 голосов
/ 12 июля 2020

См. Приведенный ниже код. Я пытаюсь отсортировать содержимое моего листа на основе ввода ячейки в Range("AD2"). Проблема заключается в строке key1:=rng_sort, которая, как мне кажется, вызывается неправильно.

Я хочу изменить столбец, который отсортирован на основе условия, выбранного для ячейки Range("AD2"). В этой ячейке у меня есть список проверки данных, как показано ниже: введите описание изображения здесь

Если Range("AD2") = "Event" я хочу отсортировать столбец I. Если он равен «Vo», я хочу отсортировать столбец J.

Любая идея, что я могу делать неправильно?

Спасибо.

Sub sortEvent()

Sheets(1).Activate ' activate sheet(1)

Dim n As Integer
Dim j As Integer
Dim i As Integer
Dim h As Integer
Dim Lastrow As Integer
Dim ng_sort As Range
        
        Lastrow = Cells(Rows.Count, "I").End(xlUp).Row ' guarda o indice da ultima linha com conteudo da coluna I. Mesmo havendo vazios identifca a ultima linha
        Length = Range(Range("I10"), Range("I" & Lastrow)).Rows.Count ' dimensão da coluna O ate a ultima celula com conteudo começando na O6
        
For firstrow = 1 To Length ' loop na coluna O
            If Range("C2").Offset(firstrow, 0).Interior.Color = RGB(68, 114, 196) Then
                Exit For
            End If
Next firstrow

If Range("AD2") = "Event" Then
        rng_sort = Range("I1")
    Else
        rng_sort = Range("J1")
End If
            
n = 0
j = 1
        
        For i = 1 To Length ' loop na coluna I
            If Range("C2").Offset(firstrow + i, 0).Value <> "" Then
                n = n + 1
            Else
                Range(Range("C2").Offset(firstrow + j, 0), Range("C2").Offset(firstrow + j + n - 1, 0)).EntireRow.sort key1:=rng_sort, order1:=xlAscending, Header:=xlNo
                j = j + n + 1
                n = 0
            End If
        Next i
End Sub

1 Ответ

1 голос
/ 12 июля 2020

У вас нет Option Explicit, установленного в начале вашего модуля, иначе вы бы увидели свою проблему.

Go в Инструменты / Параметры и установите параметр, чтобы всегда требовать объявления переменных. Я не знаю, почему MS не делает это по умолчанию.

У вас есть

Dim ng_sort As Range

, но в вашем коде вы показываете

rng_sort = Range("I1")

Поскольку rng_sort никогда не объявлялся, он будет использоваться как вариант и будет содержать содержимое Range("I1"), а не объект диапазона.

Если бы вы объявили Option Explicit, это было бы отмечено как опечатка; и без ключевого слова Set вы получили бы ошибку времени выполнения 91 и смогли бы выяснить это сами.

Попробуйте:

If Range("AD2") = "Event" Then
        set rng_sort = Range("I1")
    Else
        set rng_sort = Range("J1")
End If

Я не тестировал ваш код , поскольку вы не предоставили никаких примеров данных, но вам определенно необходимо Set объект диапазона.

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