Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск элемента массива и его индекса (пользовательский тип) - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск элемента массива и его индекса (пользовательский тип) (Макросы/Sub)
Поиск элемента массива и его индекса (пользовательский тип)
Невилл Дата: Четверг, 14.04.2016, 04:48 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Привет всем.

Пытаюсь разобраться, как обращаться с пользовательскими типами данных и немного подзастрял.
Не могу разобраться с снитаксисом...

Как правильно организовать поиск определенного элемента массива пользовательского типа данных?
Есть переменная FoundShip="А1", например.

Есть массив aShips as ship, а в нем aShips.Name

Ошибка у меня в процедуре CheckEnemy, а именно тут:
[vba]
Код
iNom = IsInArray(FoundShip, aShips.Name)
[/vba]

Помогите разобраться, пожалуйста. Как правильно это сделать и записать?
К сообщению приложен файл: 3003833.xlsm(31Kb)


Сообщение отредактировал Невилл - Четверг, 14.04.2016, 06:00
 
Ответить
СообщениеПривет всем.

Пытаюсь разобраться, как обращаться с пользовательскими типами данных и немного подзастрял.
Не могу разобраться с снитаксисом...

Как правильно организовать поиск определенного элемента массива пользовательского типа данных?
Есть переменная FoundShip="А1", например.

Есть массив aShips as ship, а в нем aShips.Name

Ошибка у меня в процедуре CheckEnemy, а именно тут:
[vba]
Код
iNom = IsInArray(FoundShip, aShips.Name)
[/vba]

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

Автор - Невилл
Дата добавления - 14.04.2016 в 04:48
nilem Дата: Четверг, 14.04.2016, 06:27 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 1056
Репутация: 399 ±
Замечаний: 0% ±

Excel 2013
Невилл, привет
попробуйте так
[vba]
Код
iNom = IsInArray(FoundShip)
[/vba]
[vba]
Код
Function IsInArray(stringToBeFound As String) As Long
Dim k As Long
' default return value if value not found in array
IsInArray = -1
For k = LBound(aShips) To UBound(aShips)
    If StrComp(stringToBeFound, aShips(k).Name, vbTextCompare) = 0 Then
        IsInArray = k
        Exit For
    End If
Next k
End Function
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеНевилл, привет
попробуйте так
[vba]
Код
iNom = IsInArray(FoundShip)
[/vba]
[vba]
Код
Function IsInArray(stringToBeFound As String) As Long
Dim k As Long
' default return value if value not found in array
IsInArray = -1
For k = LBound(aShips) To UBound(aShips)
    If StrComp(stringToBeFound, aShips(k).Name, vbTextCompare) = 0 Then
        IsInArray = k
        Exit For
    End If
Next k
End Function
[/vba]

Автор - nilem
Дата добавления - 14.04.2016 в 06:27
Невилл Дата: Четверг, 14.04.2016, 06:56 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Спасибо огромное! Работает отлично.

Только хочется все-таки как-то сохранить "универсальность" функции. Чтобы можно было, например, в одном месте искать по имени (Name), а в другом по Length, например.

Что-то в этом духе:
[vba]
Код
Function IsInArray(stringToBeFound As String, arr As Variant, subtype As String) As Long
Dim k As Long
' default return value if value not found in array
IsInArray = -1
For k = LBound(arr) To UBound(arr)
    If StrComp(stringToBeFound, arr(k).subtype, vbTextCompare) = 0 Then
        IsInArray = k
        Exit For
    End If
Next k
End Function
[/vba]

Но получаю теперь другую ошибку.

iNom = IsInArray(FoundShip, aShips, Name)

Наверное, что-то не так делаю с передачей массива в функцию (так можно хоть вообще?) или с типом/декларированием третьего аргумента.

Сам еще попробую придумать что-то. Благодарю!
 
Ответить
СообщениеСпасибо огромное! Работает отлично.

Только хочется все-таки как-то сохранить "универсальность" функции. Чтобы можно было, например, в одном месте искать по имени (Name), а в другом по Length, например.

Что-то в этом духе:
[vba]
Код
Function IsInArray(stringToBeFound As String, arr As Variant, subtype As String) As Long
Dim k As Long
' default return value if value not found in array
IsInArray = -1
For k = LBound(arr) To UBound(arr)
    If StrComp(stringToBeFound, arr(k).subtype, vbTextCompare) = 0 Then
        IsInArray = k
        Exit For
    End If
Next k
End Function
[/vba]

Но получаю теперь другую ошибку.

iNom = IsInArray(FoundShip, aShips, Name)

Наверное, что-то не так делаю с передачей массива в функцию (так можно хоть вообще?) или с типом/декларированием третьего аргумента.

Сам еще попробую придумать что-то. Благодарю!

Автор - Невилл
Дата добавления - 14.04.2016 в 06:56
Апострофф Дата: Четверг, 14.04.2016, 07:41 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 71
Репутация: 26 ±
Замечаний: 0% ±

Excel 2003
Невилл, http://esperanto-plus.ru/aforism/anekdotoj-pro-taksistoj.htm
Если ехать, а не шашечки, то я просто в случае попадания проверил бы соседние (вверх, вниз, вправо, влево) N ячеек цели на наличие соответствующего текста и сделал вывод.
 
Ответить
СообщениеНевилл, http://esperanto-plus.ru/aforism/anekdotoj-pro-taksistoj.htm
Если ехать, а не шашечки, то я просто в случае попадания проверил бы соседние (вверх, вниз, вправо, влево) N ячеек цели на наличие соответствующего текста и сделал вывод.

Автор - Апострофф
Дата добавления - 14.04.2016 в 07:41
nilem Дата: Четверг, 14.04.2016, 07:48 | Сообщение № 5
Группа: Авторы
Ранг: Ветеран
Сообщений: 1056
Репутация: 399 ±
Замечаний: 0% ±

Excel 2013
Наверное, что-то не так делаю с передачей массива в функцию

массив передавать и не нужно, т.к. он у вас глобальный уровня проекта (Public)
и (имхо) лучше 2-мерные массивы (типы никогда не использую, - просто не знаю, куда бы их прикрутить)
вот посмотрите файлик
К сообщению приложен файл: _3003833.xlsm(34Kb)


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
Наверное, что-то не так делаю с передачей массива в функцию

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

Автор - nilem
Дата добавления - 14.04.2016 в 07:48
Невилл Дата: Четверг, 14.04.2016, 08:57 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Апострофф, ахахах, мне как раз шашечки)))
У меня в прошлой версии кода так и было.
Я просто хотел проверить, какой вариант кода будет работать быстрей.

nilem, угу, еще раз спасибо)) Я вот тоже не использую обычно их, подумал, что тут как раз подойдет неплохо. Да и названия переменных покрасивше смотрелись бы.
 
Ответить
СообщениеАпострофф, ахахах, мне как раз шашечки)))
У меня в прошлой версии кода так и было.
Я просто хотел проверить, какой вариант кода будет работать быстрей.

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

Автор - Невилл
Дата добавления - 14.04.2016 в 08:57
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск элемента массива и его индекса (пользовательский тип) (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!