Проблема с добавлением списка проверки в таблицу Excel с использованием VBA - PullRequest
4 голосов
/ 15 июня 2009

У меня есть лист Excel, в который загружен динамический набор данных. Мне нужно добавить выпадающий YES / NO в конце каждой строки, как только все данные загружены. Я должен сделать это динамически, так как я не знаю размер результирующего набора заранее. Следующий код выдает «Ошибка, определенная в приложении или объекте»:

Dim firstRow As Integer
Dim lastRow As Integer
Dim I As Integer
Dim VOptions As String
VOptions = "1. Yes, 2. No"

firstRow = GetResultRowStart.row + 1
lastRow = GetResultRowStart.End(xlDown).row

For I = firstRow To lastRow

Range("AO" & firstRow & ":AO" & lastRow).Select

With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=VOptions
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = "Options"
    .ErrorTitle = ""
    .InputMessage = "Click yes or no"
    .errorMessage = ""
    .ShowInput = True
    .ShowError = True
End With


 Next I

Метод GetResultRowStart дает мне начало строки, данные результата которой заполняются на листе. Я использовал этот метод в другом месте в другой части кода, и он отлично работает. При отладке с использованием окон сообщений предлагалось выдать ошибку в операторе Range (..). Select.

Любые идеи о причине этой ошибки.

Ответы [ 8 ]

4 голосов
/ 13 июля 2009

Заключительные мысли по этому вопросу:

Установка свойства SetFocusOnClick для каждой кнопки в книге в значение false, похоже, добилась цели (по крайней мере, пока). Но если это обязательное условие, оно не должно работать вообще с установленным значением true. Впрочем, иногда так и было. Но это надежное решение, которое я нашел.

1 голос
/ 21 ноября 2014

Это вариант ошибки «Добавить метод объекта« Проверка »не удалась». Вот возможные причины и способы их устранения:

  1. Защищенный лист : лист, на который добавляется проверка данных, не может быть защищен, даже если ячейки, в которые добавляется проверка, не являются защищенными Заблокировано и даже если режим защиты UserInterfaceOnly . Вы должны полностью снять защиту листа, добавить проверку, а затем повторно защитить лист.

  2. Потеря фокуса диапазоном ячеек рабочего листа : если фокус был сделан каким-либо элементом управления на активном рабочем листе (обычно это командная кнопка), который был предварительно нажат пользователем эта ошибка будет вызвана при последующем вызове метода Validation.Add . (Действительно, это правда!) Это относится, в частности, к любой командной кнопке, которая выполняет код, который добавляет проверку, но это также относится к любому элементу управления на листе, который можно щелкнуть до выполнения этого кода. Поскольку, похоже, нет законной связи между состоянием фокуса и добавлением проверки данных в ячейку или диапазон, я считаю это ошибкой Excel. Вот обходные пути:

    A. Предотвращение потери фокуса в диапазоне ячеек рабочего листа : установите для свойства TakeFocusOnClick всех элементов управления на рабочем листе значение False .

    B. Извлечение фокуса на диапазон ячеек рабочего листа : в коде VBA перед выполнением метода Validation.Add вызовите Выберите метод для любой ячейки на листе. Логическим выбором является выбор ячейки или диапазона, к которому добавляется проверка данных, но подойдет любая ячейка.

1 голос
/ 30 мая 2012

Я только что столкнулся с очень похожей проблемой в Excel. Я обнаружил, что код для программной установки раскрывающегося списка проверки работоспособности работал нормально, когда я запускал его в непосредственном окне, но не работал при вызове с помощью кнопки на рабочем листе. Теперь я понял, что это потому, что кнопка была в фокусе, и никакие попытки выделить или активировать лист или ячейку в коде до установки проверки, казалось, не могли это исправить. Однако я только что понял, что в Excel есть свойство кнопок TakefocusOnClick, которое по умолчанию установлено в True. Если для этого параметра установлено значение False, кнопка никогда не получает фокус, и, привет, мой код для проверки правильности теперь работает нормально.

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

Приветствие.

1 голос
/ 11 февраля 2011

Решением, которое я использовал, было снятие защиты листа с помощью xx.validation, а затем защита, если впоследствии. [Мне не нужно было делать это в Excel 2000, и я думаю, что мне не нужно было делать это в Excel 2003, пока, возможно, не был добавлен пакет обновления, хотя я не могу сказать 100%.]

1 голос
/ 28 августа 2009

Я тоже столкнулся с той же проблемой, "ошибка автоматизации". Я активировал лист, в который собирался поместить список проверки, и ошибка просто исчезла.

1 голос
/ 15 июня 2009

Позвольте мне попытаться направить мой внутренний Spolsky здесь:

Если вы имеете в виду диапазон, не указанный в ActiveSheet, вам следует полностью определить ссылку .

Должно работать что-то вроде следующего:

ActiveWorkbook.Sheets("mysheet").Range("AO" & firstRow & ":AO" & lastRow).Select
0 голосов
/ 30 октября 2014

У меня была такая же проблема, и я обнаружил, что ошибка связана с настройкой Application.ReferenceStyle

См. Исправленный код ниже-

If Application.ReferenceStyle = xlR1C1 Then
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=R1C16:R" & foldercnt & "C16"
Else
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$P1:$P" & foldercnt
End If
0 голосов
/ 17 июня 2009

Первым делом нужно избавиться от объекта Selection. Лучше всего подходит для Macro Recorder:)

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

Можете ли вы попробовать это после цикла?

With ActiveWorkbook.ActiveSheet.Range("AO" & firstRow & ":AO" & lastRow).Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=VOptions
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = "Options"
    .ErrorTitle = ""
    .InputMessage = "Click yes or no"
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...