Хобрук: Ваш путь к мастерству в программировании

ошибка «1004»: не удалось выбрать метод класса Range

Я уверен, что каждый, кто прочитает заголовок, скажет: «О нет, только не снова». Но прежде чем опубликовать это, я прочитал около 7-8 предыдущих вопросов с похожим заголовком, и ни один из них, похоже, не работал. Итак, это сделка:

Моя книга использует событие Workbook_Open для отображения пользовательской формы:

Sub Workbook_Open()
    UserForm1.Show
End Sub

Userform1 включает текстовое поле и список. Поле списка заполняется данными динамически в соответствии с вводом пользователем в текстовое поле. Пока все в порядке.

Когда пользователь щелкает значение внутри списка, я хочу, чтобы была выбрана конкретная ячейка. Итак, я использовал это:

Private Sub ListBox1_Click()
    Dim Cell As Range

    With ThisWorkbook.Worksheets(1)
        Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues)
        .Range(Cell, Cell.Offset(0, 2)).Select
    End With
End Sub

Но, как и многие другие до меня, я не могу заставить Select работать должным образом, и этот код выдал ошибку, как в заголовке.

Я пробовал несколько вещей, чтобы заставить этот код работать.

-Пробовал Application.GoTo, используя его вместо Select, как кто-то предложил.

- Попытался переместить код события ListBox1_Click в подпрограмму внутри стандартного модуля и вызвать эту подпрограмму с событием ListBox1_Click.

- Пытался сначала выбрать рабочий лист, как предлагали другие.

-Пробовал Worksheets(1).Visible = True, как предложил кто-то другой.

-Попытался сначала активировать главное окно приложения с помощью AppActivate Application.Caption.

-Попытался перейти к нужной ячейке вместо выбора:

Private Sub ListBox1_Click()
    Dim foundRow As Integer

    With ThisWorkbook.Worksheets(1)
        foundRow = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues).Row
    End With
    ActiveWindow.ScrollRow = foundRow - 1
End Sub

Я также пробовал другие менее важные изменения, но я застрял с этим. Самое смешное, что перед использованием события Workbook_Open у меня было UserForm1, показанное с помощью макроса, назначенного кнопке/форме на листе, и тогда все работало нормально.

Кто-нибудь знает, как заставить Select работать в моем случае?

С другой стороны, хорошо известно, что Select вызывает много проблем, поэтому я не зацикливаюсь на этом. Если у кого-то есть другой способ получить тот же результат, я весь внимание.

13.05.2016

  • Бьюсь об заклад, что Cell ничего. 13.05.2016
  • Было ли найдено значение, ведущее к тому, что ячейка является диапазоном. Поставьте точку останова на проблемной строке и посмотрите, не является ли Cell ничем. 13.05.2016
  • Сотовый был не чем иным. Я выбрал значение, существующее наверняка. Спасибо за ваши советы. 13.05.2016

Ответы:


1

Я смог воспроизвести проблему, прежде всего, я следовал тому, что вы описали, составил список и выбрал из него, чтобы посмотреть, будет ли прокручиваться в поле зрения, и это сработало.

Если я закрывал форму, менялся активный лист. а затем запустите форму, в которой произошел сбой, с сообщением об ошибке, которое вы видите.

Попробовав ряд вещей, я обнаружил, что вы не можете выбрать ячейку, если это не активный лист (что логично, пользователь не может щелкнуть ячейку, которая не находится на листе, который они просматривают)

Строка Activate ниже должна это исправить.

Private Sub ListBox1_Click()
    Dim Cell As Range

    With ThisWorkbook.Worksheets(1)
        Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues)

        ThisWorkbook.Worksheets(1).Activate

        .Range(Cell, Cell.Offset(0, 2)).Select
    End With
End Sub
13.05.2016
  • так просто, как это. большое спасибо за ваше время. работал идеально. 13.05.2016

  • 2

    Как отметил @ScotCraner и как показано в примере кода на MSDN вы должны сначала проверить, было ли что-то найдено, прежде чем использовать/показывать это.

    Следующее должно работать безупречно:

    Private Sub ListBox1_Click()
    
        Dim Cell As Range
        Application.DisplayStatusBar = True
    
        With ThisWorkbook.Worksheets(1)
            Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)
            If Not Cell Is Nothing Then
                Application.StatusBar = "Found " & UserForm1.ListBox1.Text
                .Activate
                .Range(Cell, Cell.Offset(0, 2)).Select
            Else
                Application.StatusBar = "Couldn't find " & UserForm1.ListBox1.Text
            End If
        End With
    
    End Sub
    

    Обратите внимание, что вы используете UserForm1.ListBox1.Text, который не учитывает UserForm1.ListBox1.MultiSelect.

    13.05.2016
  • Спасибо за ваш очень меткий совет! В этом случае я просто подумал, что должен выбрать значение, которое точно существовало на моем листе, чтобы увидеть, работает ли это. В любом случае лучше реализовать эту проверку в моем коде. 13.05.2016
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..