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

Вход

Регистрация

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

 

= Мир MS Excel/Объединение в пользовательском типе - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение в пользовательском типе (Макросы Sub)
Объединение в пользовательском типе
Афокл Дата: Вторник, 14.01.2014, 16:58 | Сообщение № 1
Группа: Гости
[vba]
Код
type HimElemType
sumbol as string
himnumber as integer
mass as integer
end type

type AnimalType
group as string
class as string
end type

type MyType
name as string
number as integer

'объединение
HimElem as HimElemType
Animal as AnimalType
'end объединение

end type

public MyArray(1 to 5) as MyType
[/vba]

В коде имеем пользовательский тип MyType содержащий "объединение" и массив MyArray из 5 элементов.
Нужно заполнить массив таки образом:

[vba]
Код

MyArray(1).name="Цинк"
MyArray(1).number=1
MyArray(1).HimElement.sumbol="Zn"
MyArray(1).HimElement.himnumber="30"
MyArray(1).HimElement.mass="65"

MyArray(2).name="Корова"
MyArray(2).number=2
MyArray(2).Animal.group="Домашний скот"
MyArray(2).Animal.class="Травоядное"
[/vba]

Т.е. первый элемент массива у нас химический элемент поэтому заполнем его по типу HimElem из объединения,
второй элемент животное - по типу Animal из объединения. Возможна ли такая структура в VBA?
 
Ответить
Сообщение[vba]
Код
type HimElemType
sumbol as string
himnumber as integer
mass as integer
end type

type AnimalType
group as string
class as string
end type

type MyType
name as string
number as integer

'объединение
HimElem as HimElemType
Animal as AnimalType
'end объединение

end type

public MyArray(1 to 5) as MyType
[/vba]

В коде имеем пользовательский тип MyType содержащий "объединение" и массив MyArray из 5 элементов.
Нужно заполнить массив таки образом:

[vba]
Код

MyArray(1).name="Цинк"
MyArray(1).number=1
MyArray(1).HimElement.sumbol="Zn"
MyArray(1).HimElement.himnumber="30"
MyArray(1).HimElement.mass="65"

MyArray(2).name="Корова"
MyArray(2).number=2
MyArray(2).Animal.group="Домашний скот"
MyArray(2).Animal.class="Травоядное"
[/vba]

Т.е. первый элемент массива у нас химический элемент поэтому заполнем его по типу HimElem из объединения,
второй элемент животное - по типу Animal из объединения. Возможна ли такая структура в VBA?

Автор - Афокл
Дата добавления - 14.01.2014 в 16:58
Матраскин Дата: Вторник, 14.01.2014, 17:50 | Сообщение № 2
Группа: Друзья
Ранг: Обитатель
Сообщений: 375
Репутация: 81 ±
Замечаний: 0% ±

20xx
Афокл, похоже на таблицу БД. точнее на запрос к БД.


в интернете опять кто-то не прав
 
Ответить
СообщениеАфокл, похоже на таблицу БД. точнее на запрос к БД.

Автор - Матраскин
Дата добавления - 14.01.2014 в 17:50
Афокл Дата: Вторник, 14.01.2014, 18:20 | Сообщение № 3
Группа: Гости
Похоже, но вопрос в другом, есть ли такое механизм в VBA. Т.е. при занесении даных типа MyType сначала определяется что за данные заносим хим.элемент или животное, и в зависимости от этого заполняем или MyArray(i).HimElem. или MyArray(i).Animal.
Можно включить в тип MyType оба типа (и HimElem и Animal) и просто заполнять один из них, но если массив большой это может занять продолжительное время и память, что не есть хорошо.
 
Ответить
СообщениеПохоже, но вопрос в другом, есть ли такое механизм в VBA. Т.е. при занесении даных типа MyType сначала определяется что за данные заносим хим.элемент или животное, и в зависимости от этого заполняем или MyArray(i).HimElem. или MyArray(i).Animal.
Можно включить в тип MyType оба типа (и HimElem и Animal) и просто заполнять один из них, но если массив большой это может занять продолжительное время и память, что не есть хорошо.

Автор - Афокл
Дата добавления - 14.01.2014 в 18:20
Hugo Дата: Вторник, 14.01.2014, 19:13 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
А зачем это?
Может достаточно двух словарей - один для металлов, другой для коров?
А в словарь уже можно в item положить пользовательский массивчик. Или просто массив, или строку с разделителями.

По ключу ищем в словарях свои данные. Кажется в итоге вся схема будет проще.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеА зачем это?
Может достаточно двух словарей - один для металлов, другой для коров?
А в словарь уже можно в item положить пользовательский массивчик. Или просто массив, или строку с разделителями.

По ключу ищем в словарях свои данные. Кажется в итоге вся схема будет проще.

Автор - Hugo
Дата добавления - 14.01.2014 в 19:13
AndreTM Дата: Вторник, 14.01.2014, 19:35 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Можно использовать не словарь, а просто коллекцию.
Или массив (с именами-номерами и указанием на тип элемента в коллекции) + коллекцию (с элементами нужных типов). Естественно, пользовательские типы придётся оформить в виде классов. В принципе, можно и просто коллекцией обойтись - только придется воткнуть "обшие" поля в каждый класс-тип.
К сообщению приложен файл: 10-8371-1-1.xls (32.5 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеМожно использовать не словарь, а просто коллекцию.
Или массив (с именами-номерами и указанием на тип элемента в коллекции) + коллекцию (с элементами нужных типов). Естественно, пользовательские типы придётся оформить в виде классов. В принципе, можно и просто коллекцией обойтись - только придется воткнуть "обшие" поля в каждый класс-тип.

Автор - AndreTM
Дата добавления - 14.01.2014 в 19:35
Афокл Дата: Среда, 15.01.2014, 12:41 | Сообщение № 6
Группа: Гости
Если я правильно понял вложенный пример, на выходе мы имеем массив состоящий из Имени, Номера, и Номера Коллекции. Номер Коллекции несет в себе связь между массивом и коллекцией. Т.е. если мне нужно достать из массива 3 элемент, я проверяю его Номер Коллекции и, в зависимости от него, получаю либо Группу\Класс, либо Символ\Химномер\Массу. При этом "вес" коллекции будет складываться MyCol(1).Symbol + MyCol(1).Himnumber + MyCol(1).Mass = 16 byte (к примеру), MyCol(2).Group + MyCol(2).Class = 8 byte (к примеру) и т.д., в итоге сумма "веса" всех 5 элементов коллекции получится = 16+8+16+8+16=64 byte. Верно?

Спасибо за наглядный пример и хороший ответ!
 
Ответить
СообщениеЕсли я правильно понял вложенный пример, на выходе мы имеем массив состоящий из Имени, Номера, и Номера Коллекции. Номер Коллекции несет в себе связь между массивом и коллекцией. Т.е. если мне нужно достать из массива 3 элемент, я проверяю его Номер Коллекции и, в зависимости от него, получаю либо Группу\Класс, либо Символ\Химномер\Массу. При этом "вес" коллекции будет складываться MyCol(1).Symbol + MyCol(1).Himnumber + MyCol(1).Mass = 16 byte (к примеру), MyCol(2).Group + MyCol(2).Class = 8 byte (к примеру) и т.д., в итоге сумма "веса" всех 5 элементов коллекции получится = 16+8+16+8+16=64 byte. Верно?

Спасибо за наглядный пример и хороший ответ!

Автор - Афокл
Дата добавления - 15.01.2014 в 12:41
AndreTM Дата: Среда, 15.01.2014, 13:26 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
На самом деле, в примере немного не так - там "ключ" в коллекции соответствует "индексу" в массиве, а "Item" - это некий код, определяющий тип элемента коллекции (химэлемент, животное). Но то, что описываете вы - ещё более правильный подход (т.е. в массиве мы должны сохранить указатель на элемент коллекции). Но при этом не забыть где-то (либо в массиве, либо в типе-классе) сохранить свойство, указывающее на тип - откуда иначе мы узнаем, какие именно поля-свойства обрабатывать у элемента коллекции? Например, можно завести константу (с одинаковым именем) в каждом из классов...

А, да, и ещё там была небольшая, но принципиальная ошибка в коде :) - вот новый исправленный пример, со всем вышеописанным:
К сообщению приложен файл: 10-8371-1-2.xls (37.0 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Среда, 15.01.2014, 13:46
 
Ответить
СообщениеНа самом деле, в примере немного не так - там "ключ" в коллекции соответствует "индексу" в массиве, а "Item" - это некий код, определяющий тип элемента коллекции (химэлемент, животное). Но то, что описываете вы - ещё более правильный подход (т.е. в массиве мы должны сохранить указатель на элемент коллекции). Но при этом не забыть где-то (либо в массиве, либо в типе-классе) сохранить свойство, указывающее на тип - откуда иначе мы узнаем, какие именно поля-свойства обрабатывать у элемента коллекции? Например, можно завести константу (с одинаковым именем) в каждом из классов...

А, да, и ещё там была небольшая, но принципиальная ошибка в коде :) - вот новый исправленный пример, со всем вышеописанным:

Автор - AndreTM
Дата добавления - 15.01.2014 в 13:26
SM Дата: Среда, 15.01.2014, 14:32 | Сообщение № 8
Группа: Друзья
Ранг: Участник
Сообщений: 64
Репутация: 59 ±
Замечаний: 0% ±

2003
Можно использовать не словарь, а просто коллекцию.
Или массив

Играем в "классики" только с массивом:
К сообщению приложен файл: __.xls (36.5 Kb)


Excel изощрён, но не злонамерен
 
Ответить
Сообщение
Можно использовать не словарь, а просто коллекцию.
Или массив

Играем в "классики" только с массивом:

Автор - SM
Дата добавления - 15.01.2014 в 14:32
AndreTM Дата: Среда, 15.01.2014, 17:31 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
SM, ага, я примерно так и хотел сначала сделать... Только я вот в VBA уже и подзабыл :) , как с указателями правильно работать... ибо "большинством" это так мало востребовано...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеSM, ага, я примерно так и хотел сначала сделать... Только я вот в VBA уже и подзабыл :) , как с указателями правильно работать... ибо "большинством" это так мало востребовано...

Автор - AndreTM
Дата добавления - 15.01.2014 в 17:31
SM Дата: Среда, 15.01.2014, 19:30 | Сообщение № 10
Группа: Друзья
Ранг: Участник
Сообщений: 64
Репутация: 59 ±
Замечаний: 0% ±

2003
Только я вот в VBA уже и подзабыл

А я ещё умею кашу варить. Гречневую. :)


Excel изощрён, но не злонамерен
 
Ответить
Сообщение
Только я вот в VBA уже и подзабыл

А я ещё умею кашу варить. Гречневую. :)

Автор - SM
Дата добавления - 15.01.2014 в 19:30
AndreTM Дата: Четверг, 16.01.2014, 02:28 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Насчёт именно гречневой - я могу и поговорить. Ибо предпочитаю запарить, с кориандром и тмином :)
Что же касается указателей - ну не люблю я рыться в MSDN и всём прочем при каждом чихе (всё же Help VBA - это не BOL MSSQL...) ... насколько проще был Forth :D


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеНасчёт именно гречневой - я могу и поговорить. Ибо предпочитаю запарить, с кориандром и тмином :)
Что же касается указателей - ну не люблю я рыться в MSDN и всём прочем при каждом чихе (всё же Help VBA - это не BOL MSSQL...) ... насколько проще был Forth :D

Автор - AndreTM
Дата добавления - 16.01.2014 в 02:28
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение в пользовательском типе (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

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