1

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

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.ScreenUpdating = False

    'Delete all drop down lists
    For Each ws In ActiveWorkbook.Worksheets
        For Each shp In ws.Shapes
            If shp.Name Like "Drop Down *" Then
                shp.Delete
            End If
        Next shp
    Next ws

    Sheet1.Activate

    Application.ScreenUpdating = True

End Sub

=================

Оригинальный вопрос

Я сталкиваюсь с досадной ошибкой в Excel VBA. Смотрите этот скриншот. Я использую лист Excel в качестве формы ввода пользователя. В форме у меня есть несколько мест, где я ставлю Проверка данных. После того, как пользователь нажал Enter, я использовал этот бит кода для очистки формы.

For Each a In Sheets("frmBienNhan").Range("C5:K31")
    If a.Locked = False Then
        a.Value = ""
    End If
Next a

После запуска кода несколько раз появляются эти чертовы стрелки. Это похоже на выпадающий список проверки данных, но при нажатии на него список становится пустым. Я не могу выбрать ячейку за ним. Я не могу удалить его, даже если я использую команды «Очистить все проверки» или «Очистить все» в Excel. Это не имеет большого значения, но это раздражает пользователя, потому что ему приходится перемещать курсор в эту ячейку с помощью клавиатуры, иначе они не могут выбрать настоящий выпадающий список проверки данных.

Любые мысли или опыт по этой ошибке приветствуются.

Снимок экрана стрелки остаточной проверки

3 ответа3

1

Святая корова! Я боролся с этим вчера! Я не смог найти никакой информации об этом в Интернете.

Мое решение состояло в том, чтобы использовать непосредственное окно в VBE (Alt + F11, затем Ctrl + G), чтобы увидеть, что находится на странице, поэтому я запустил что-то подобное в модуле -

Sub test()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
    Debug.Print shp.Name
Next
End Sub

Он напечатал все формы на моей странице. Затем я обнаружил, что заблудившийся человек выпал из окна. Поэтому я набрал это в ближайшем окне -

 activesheet.shapes("Drop Down 8").delete

Просто используйте имя вашей формы.

1

Попробуйте установить.Значение vbNullString вместо "". В VBA установка строки в «» выделяет память для массива char [0], который содержит строковые константы, такие как терминатор. vbNullString возвращает указатель на ноль , поэтому он действительно пустой.

https://movefirstblog.wordpress.com/2008/06/28/vbnullstring-empty-cells-in-excel-vba/

0

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

' Clear off lingering dropdowns
Dim aShape As Shape
Dim aWorksheet As Worksheet
For Each aWorksheet in Me.Sheets
  For Each aShape In aWorksheet.Shapes
    If aShape.Type = msoFormControl Then
      If aShape.FormControlType = xlDropDown Then
        aShape.Delete
      End If
    End If
  Next
Next

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .