Помогаем и разъясняем взаимодействие с ПО Ворд и Эксель на WordExcel.top
Vba excel проверка существования объекта
Помогаю со студенческими работами здесь
Как проверить существование кнопки Нужно удалить кнопку, которая может существовать, а может и не существовать (кнопка создается в…
Как проверить существование файла ? Например name.xls, мне нужно чтоб макрос не останавливался, если файла не существует. Есть…
Проверить переменную типа Object на существование Допустим я создал и переменную
dim j as object
Set j = New Access.ApplicationВ случае какой-либо…
Как проверить существование файла в папке,если filesystemobject не распознается VBA? вопрос такой:
надо ли подключать какую-нибудь бибилиотеку для работы с файловой системой, а именно…
What is the best way to check if object exists before using set on it ?
I have many workbooks, they contain checkboxes and optionbuttons.
I have an array that contain the list of all possible names of checkboxes and optionbuttons that the different workbooks may have
to make my question clear, let us suppose that i have
sArray(i) = "CheckBox15"
when I do
Set s = .OLEObjects(sArray(i))
is giving me an error 1004 when there is no a checkbox called «CheckBox15» in the active sheet.
what I want in my below code, is to add a line that tells :
if «CheckBox15» exists on current sheet (ws) then set …. is there any command that check if an object exists ?
'ws is the worksheet
Dim s As OLEObject
Dim i As Long
with ws
For i = 0 To UBound(sArray)
Set s = .OLEObjects(sArray(i))
If s.Object.Value = True Then
GetOptionCheck = GetOptionCheck & s.Object.Caption
End If
Next i
end with
Pᴇʜ
56k9 gold badges49 silver badges73 bronze badges
asked Mar 1, 2019 at 14:01
You can build a custom boolean function for a quick check:
Public Function objectExists(ByRef ws As Worksheet, ByVal someName As String) As Boolean
On Error GoTo objectExists_Error
Dim someOle As OLEObject
Set someOle = ws.OLEObjects(someName)
objectExists = True
On Error GoTo 0
Exit Function
objectExists_Error:
objectExists = False
End Function
The call it like this:
Sub TestMe()
Dim s As OLEObject
Dim i As Long
Dim ws As Worksheet: Set ws = Worksheets(1)
Dim someArray As Variant
someArray = Array("CheckBox1", "CheckBox2", "CheckBox3", "CheckBox4")
With ws
For i = LBound(someArray) To UBound(someArray)
If objectExists(ws, someArray(i)) Then
Set s = .OLEObjects(someArray(i))
Debug.Print s.object.Caption
End If
Next i
End With
End Sub
Дата: Воскресенье, 05.03.2023, 12:53 |
Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 275
Репутация: -6 ±
Замечаний:
0% ± Excel 2007
Добрый день, необходимо программным способом узнать о существовании объекта на Форме [vba]
Код
n=0 name = «TextBox_» While Not (Me.Controls(name & CInt(n)) Is Nothing) msgbox «форма с номером» & CStr(n) & » существует» n=n+1 Wend
[/vba] Данный способ не работает. Допустим есть 5 текст боксов, с 0…4, при n=5 выдает ошибку. Существует ли другой способ. Я знаю, что можно перебрать все объекты на форме, однако для моей задачи это не подходит, необходимо узнать, только имея имя объекта.
Сообщение отредактировал Sashagor1982 — Воскресенье, 05.03.2023, 13:04
Ответить
msi2102
Дата: Воскресенье, 05.03.2023, 13:49 |
Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 291
Репутация: 104 ±
Замечаний:
0% ± Excel 2007
Так переберёт все TextBox-ы, а там дальше уже разберетесь. [vba]
Код
Private Sub CommandButton1_Click() Dim Tb As Control For Each Tb In Me.Controls If TypeOf Tb Is MsForms.TextBox Then MsgBox Tb.Name Next End Sub
[/vba]
К сообщению приложен файл:
3519909.xlsm
(18.3 Kb)
Сообщение отредактировал msi2102 — Воскресенье, 05.03.2023, 13:54
Ответить
Sashagor1982
Дата: Воскресенье, 05.03.2023, 15:52 |
Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 275
Репутация: -6 ±
Замечаний:
0% ± Excel 2007
Задача состоит в том, чтобы узнать зная только имя, перебирая все тексбоксы не подойдёт.
Ответить
msi2102
Дата: Воскресенье, 05.03.2023, 16:58 |
Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 291
Репутация: 104 ±
Замечаний:
0% ± Excel 2007
перебирая все тексбоксы не подойдёт.
В вашем примере, в первом сообщении, вы делаете именно перебор всех TextBox-ов с индексом от 0 до 4, поэтому я не совсем понимаю, что именно Вы хотите. Может быть так (в TextBox1 вводите имя которое хотите найти): [vba]
Код
Private Sub CommandButton1_Click() Dim Tb As Control, i As Boolean For Each Tb In Me.Controls If TypeOf Tb Is MsForms.TextBox Then If Tb.Name = Me.TextBox1.Text Then i = True End If Next If i Then MsgBox Me.TextBox1.Text & » существует» Else MsgBox Me.TextBox1.Text & » не существует» End Sub
[/vba] или установите обработку ошибок (это ваш код) [vba]
Код
Private Sub CommandButton1_Click() On Error GoTo Oshibka n = 1 Name_1 = «TextBox» While Not (Me.Controls(Name_1 & CInt(n)) Is Nothing) MsgBox «форма с номером» & CStr(n) & » существует» n = n + 1 Wend Exit Sub Oshibka: MsgBox «форма с номером» & CStr(n) & » не существует» End Sub
[/vba]
Сообщение отредактировал msi2102 — Воскресенье, 05.03.2023, 17:34
Ответить
Sashagor1982
Дата: Четверг, 09.03.2023, 10:03 |
Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 275
Репутация: -6 ±
Замечаний:
0% ± Excel 2007
Я так понимаю без обработки ошибок данную задачу не выполнить?
Ответить
msi2102
Дата: Четверг, 09.03.2023, 10:55 |
Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 291
Репутация: 104 ±
Замечаний:
0% ± Excel 2007
без обработки ошибок данную задачу не выполнить?
чем не устраивает первый вариант, единственное забыл добавить Exit For после Then i = True (так: Then i = True: Exit For) Я вообще не понимаю для чего это нужно, ведь всё текст боксы вы добавляете сами и должны знать их количество или в вашем случае индекс последнего, запишите его в переменную и не нужно будет искать последний
Ответить
msi2102
Дата: Четверг, 09.03.2023, 13:52 |
Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 291
Репутация: 104 ±
Замечаний:
0% ± Excel 2007
Ну может угадал, хотя, всё равно не понимаю, зачем искать то, что уже Вам известно [vba]
Код
Private Sub CommandButton1_Click() Dim Tb As Control, i As Boolean, n As Byte For n = 1 To 7 For Each Tb In Me.Controls If TypeOf Tb Is MsForms.TextBox Then If Tb.Name = «TextBox» & n Then i = True: Exit For Else i = False End If Next If i Then MsgBox «TextBox» & n & » существует» Else MsgBox «TextBox» & n & » не существует» Next End Sub
[/vba]
К сообщению приложен файл:
8959568.xlsm
(19.3 Kb)
Сообщение отредактировал msi2102 — Четверг, 09.03.2023, 20:39
ТРЕНИНГИ
Быстрый старт
Расширенный Excel
Мастер Формул
Прогнозирование
Визуализация
Макросы на VBA
КНИГИ
Готовые решения
Мастер Формул
Скульптор данных
ВИДЕОУРОКИ
ПРИЕМЫ
Бизнес-анализ
Выпадающие списки
Даты и время
Диаграммы
Диапазоны
Дубликаты
Защита данных
Интернет, email
Книги, листы
Макросы
Сводные таблицы
Текст
Форматирование
Функции
Всякое
PLEX
Коротко
Подробно
Версии
Вопрос-Ответ
Скачать
Купить
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
Техническая поддержка сайта
ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071