Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обратиться к public массиву user-типа из ф.? 
:(
    Опции темы
Ciber SLasH
Дата 20.5.2013, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Приветствую всех!
В Module1 в разделе Declarations объявил user-тип и динамический массив этого типа:
Код

Public Type propRecord
    name As String
    value As Variant
End Type
Public props() As propRecord

В этом же модуле есть процедура:
Код

Public Sub addProp(val As Variant, Optional name As String)
Dim index As Integer
    If IsEmpty(props) Then
        index = 1
    Else
        index = UBound(props) + 1
    End If
    ReDim Preserve props(index) As propRecord
    props(index).value = val
    If name & "" <> "" Then
        props(index).name = name
    End If
End Sub

На строке "If IsEmpty(props) Then" компилятор ругается:
Цитата
Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions

Что неправильно?
PM   Вверх
Akina
Дата 20.5.2013, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Перенесите декларации (и типа, и массива) в отдельный модуль, что ли... но для начала укажите конкретное приложение (и версию), в котором это выполняется.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ciber SLasH
Дата 20.5.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Приложение и версия, в котором это выполняется: MS Office 2010 v14.0.4760.1000 (32-разрядная). Создана книга Excel с поддержкой макросов и сохранена с расширением xlsm. На отдельный лист брошена кнопка с обработчиком, в котором и вызывается функция addProp(...). Обработчик кнопки автоматически попадает в Module1.
Перенёс декларации в отдельный модуль Module2 - ничего не изменилось (та же ошибка).
PM   Вверх
Akina
Дата 20.5.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Эхх... нет у меня 2010 офиса... ща попробую, как оно в 2003-м.
Да, ещё... val - как бы имя встроенной function было, а name - соответственно statement... проверьте, если так - замените.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 20.5.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



В 2003 то же самое. Причём это не проблема функции, а проблема неявного преобразования аргумента в требуемый тип. Чтобы это увидеть, достаточно вот этого кода в методе:

Код

Dim prp As Variant
prp = props() ' можно и без скобок - результат один



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ciber SLasH
Дата 20.5.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Код

Public Sub addProp(v As Variant, Optional n As String)
Dim index As Integer
Dim prp As Variant
    prp = props()
    If IsEmpty(prp) Then
        index = 1
    Else
        index = UBound(prp) + 1
    End If
    ReDim Preserve prp(index) As propRecord
    prp(index).value = v
    If name & "" <> "" Then
        prp(index).name = n
    End If
End Sub

ошибка на строке "prp = props()" c тем же текстом.
PM   Вверх
Akina
Дата 20.5.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Так а я о чём... не запихивается этот массив в вариант.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
dorogoyIV
Дата 25.5.2013, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 4
Всего: 46




Цитата(Ciber SLasH @  20.5.2013,  09:51 Найти цитируемый пост)
If IsEmpty(props)

а обязательно проверять массив на пустоту? может проверить на длину?
Код

If UBound(props) = 0 Then
 index = UBound(props)
 ReDim Preserve props(index)
 props(index).name = "new name"
 props(index).value = 123
End If


массив props у тебя доступен отовсюду, зачем создавать еще переменную prp, да еще другого типа?



PS:  возможны ошибки... не проверял - моделировать прогу самому лень
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.