I) Что стоит за проблемой «Неверный аргумент»?
Я предполагаю, что вы создали дополнительные элементы управления изображением, приводящие к ошибке времени выполнения "Неверный аргумент" - см. Случай [2.2].
[1]
Как только вы найдете первый Контроль изображения в цикле For Each
,
Вы уже удалили полный набор элементов управления «Изображение» и i в цикле For i = 1 to 6
.
Важно знать, что цикл For Each
не исправляет исходное содержимое в Me.Controls
текущими удалениями
и попытается проанализировать всю коллекцию (т.е. Image2
, Image3
и т. д. на следующих шагах).
Кейс [2.1]
Если ваш набор «Изображение» и элементов управления i * ограничен только этими 6 элементами ,
не возникнет никакой ошибки времени выполнения "Неверный аргумент" вообще:
Более поздняя TypeName
проверка Image2
- которая больше не существует - приводит к типу Object
вместо Image
и
таким образом предотвращает дальнейшую попытку удалить ваши шесть элементов управления «Image» и «i» снова.
Дело [2.2]
Вы создали дополнительные элементы управления изображением : как только цикл For Each
проверяет дополнительный элемент управления изображением,
тест TypeName
находит тип Image
и пытается снова удалить уже удаленную six pack .
=> Таким образом, имя элемента управления не существует, аргумент фактически недействителен.
II. Заключение
В любом случае вам следует избегать применения метода .Remove
к уже удаленным элементам управления.
Например, было бы достаточно использовать следующий код раз и навсегда:
For i = 1 To 6
Me.Controls.Remove "Image" & i ' property doesn't need brackets
Next i
IMO было бы даже лучше, однако переосмыслить логику кодирования и повторно использовать элементы управления изображением вместо , удаляя их.
Таким образом, вы можете легко очистить их свойство ► .Picture
, временно назначив значение LoadPicture(vbNullString)
и переназначая имена выбранных изображений с помощью LoadPicture
, как только они вам понадобятся.
- С.ф. Как очистить изображение в пользовательской форме?
Дополнительные подсказки
Строка объявления Dim i, k As Byte
означает, что не указанная переменная i
по умолчанию является Variant. -
Так что я бы предложил сказать Dim i As Long, k As Byte
(в VBA нет никакого преимущества в памяти, чтобы объявить As Integer
,
особенно в отношении числа строк или столбцов, превышающего целочисленное ограничение; оставим в стороне функции API, где могут понадобиться целые числа)
Неправильно использовать текущий экземпляр пользовательской формы как самоуничтожающийся объект в самом кодовом модуле пользовательской формы с помощью Unload Me
.
Для более глубокого понимания рекомендую прочесть статью «UserForm1.Show?» .
Синтаксис - см. Справку MS Метод удаления