Страницы: 1
RSS
Как узнать имя члена коллекции или массива?
 
Здравствуйте, гуру и остальные!  
В результате многих действий получил ряд переменных. Вставил их в массив, чтобы потом использовать. Но... Не могу узнать имён членов архива. Т.е.  
       Данные = Array(ДолжРуковЗак, ФИОРуковЗак, НаимОрганизЗак, ЮрАдрес)  
       For Each mmm In Данные  
           MsgBox mmm.Name  
       Next  
На MsgBox mmm.Name выдает ошибку, что требуется объект.  
Пробовал через коллекцию:  
       Dim Данные As New Collection  
       Данные.Add ДолжРуковЗак  
       Данные.Add ФИОРуковЗак  
       Данные.Add НаимОрганизЗак  
       Данные.Add ЮрАдрес  
       For Each chlen In Данные  
           MsgBox chlen.Name  
       Next  
То же самое, на MsgBox chlen.Name выдает ошибку, что требуется объект.  
Вопрос: каким образом узнать имя членов массива или коллекции? Может, есть другие способы формирования данных, чтобы имя членов было?  
Имя членов нужно для того, чтобы потом использовать именно по именам, так как значения членов могут меняться.
 
Имя? Может номер?  
Общее количество известно или определяется через Ubound(), а получить значение можно так:  
MsgBox Данные(0)
 
{quote}{login=Hugo}{date=29.08.2010 11:40}{thema=}{post}Имя? Может номер?  
Общее количество известно или определяется через Ubound(), а получить значение можно так:  
MsgBox Данные(0){/post}{/quote}  
 
Нет-нет. Именно имя!!! Значение как раз получается в обоих случаях - и в массиве и в коллекции:  
       For Each mmm In Данные  
           MsgBox mmm  
       Next  
Нужно именно имя членов массива или коллекции.
 
Что-то у меня сомнения... Какое может быть имя, например у опции списка ListBox? Номер(Индекс) - понятно. Или я не понял вопрос?
 
{quote}{login=Юрий М}{date=29.08.2010 11:49}{thema=}{post}Что-то у меня сомнения... Какое может быть имя, например у опции списка ListBox? Номер(Индекс) - понятно. Или я не понял вопрос?{/post}{/quote}  
 
Я заношу в массив или коллекцию переменную. Так?  
У нее есть имя!(напр.ДолжРуковЗак)  
Но получается, что после занесения в массив или коллекцию имя переменной пропадает? и остается только номер, под которым она была добавлена в массив или коллекцию, и значение. Так что ли?  
Если так, то подскажите способ, с помощью которого можно было бы заносить данные и извлекать их по имени?
 
MsgBox chlen.Name -  (не нравиться наверное что вы ругаетесь на VBA)  :-)  
Вы хотите загнать переменную в массив, а потом обращаясь к переменной ролучить ее имя
 
Мне кажется, что Вы добавили таким образом в массив не переменную, а значение. Хотя, в массивах я не спец.
 
Выше тоже я  
 
а зачем вам тогда массив?  
используйте просто переменную
Спасибо
 
Если смотреть, что из себя представляет массив или коллекция в окне Locals, то видно, что никаких имён уже нет, есть только значение и индекс.
 
{quote}{login=The_Prist}{date=29.08.2010 11:59}{thema=}{post}Если уж так сильно надо(хотя думаю, что это очень лишнее), то можно использовать Dictionary.{/post}{/quote}  
А почему сомнение, что это лишнее?  
В принципе, я уже многое перепробовал. А суть лишь в том, чтобы взять данные из одного документа, и вставить в другой. Потому что в двух документах есть одинаковые данные.  
За время проб я делал различные варианты: и слияние, и занесение в файл эксель, затем вставка в Ворд.  
Сейчас остановился на полностью работой в Ворде. Знаю, что скажете, что это форум по Экселю... Но принципы и там и там одинаковые.  
Вставлять данные я планирую через закладки bookmarks путем присвоения одинаковых имен закладкам и моим переменным.  
Для того, чтобы не вставлять каждое значение отдельно нужно загнать их куда-то (я знаю только массив и коллекцию), чтобы можно было сделать цикл.  
Т.е. прогнать цикв через все закладки и через все переменные, при совпадении вставить переменную на место закладки.  
Так что именно для этого мне нужны имена.
 
{quote}{login=The_Prist}{date=29.08.2010 12:23}{thema=}{post}И чем не угодил предложенный мной метод использования Dictionary?{/post}{/quote}  
 
Почему же не угодил? Очень даже угодил!!!    
Огромное спасибо!!!  
Этот метод ответил полностью на мой вопрос и вопрос закрыт.  
Я просто ответил на слова  
{quote}{login=The_Prist}{thema=}{post} Если уж так сильно надо(хотя думаю, что это очень лишнее){/post}{/quote}
 
А не проще ли применять пользовательские типы?  
 
Type Запись  
   ДолжРуковЗак As String  
   ФИОРуковЗак As String  
End Type  
 
Sub test()  
   Dim a As Запись  
   a.ДолжРуковЗак = "ЗавХоз"  
   a.ФИОРуковЗак = "Иванов"  
 
   MsgBox a.ФИОРуковЗак, vbInformation, a.ДолжРуковЗак  
End Sub
 
Да и коллекции подойдут:  
 
Sub test2()  
   ДолжРуковЗак = "ЗавХоз"  
   ФИОРуковЗак = "Иванов"  
 
   Dim Данные As New Collection  
   ' при внесении данных в коллекцию используем ключи  
   Данные.Add ДолжРуковЗак, "ДолжРуковЗак"  
   Данные.Add ФИОРуковЗак, "ФИОРуковЗак"  
   Данные.Add НаимОрганизЗак, "НаимОрганизЗак"  
   Данные.Add ЮрАдрес, "ЮрАдрес"  
 
   MsgBox Данные("ДолжРуковЗак"), , "ДолжРуковЗак"  
   MsgBox Данные("ФИОРуковЗак"), , "ФИОРуковЗак"  
End Sub  
 
PS: Я в таких случаях использую классы - поскольку экземпляры классов можно добавлять в коллекции (в отличии от объектов пользовательского типа)
 
> Типы этого не позволяют делать, если только не занести в отдельный массив информацию о именах типов.  
 
Привет, Дима.  
А зачем тогда вообще что-то изобретать?  
Используем двумерный массив размерностью N*2 - и всё храним в нём...
 
Метод Dictionary не подходит.  
Бывает, что данные  совпадают или повторяются. А это метод не позволяет иметь одинаковые данные. Не позволяет у разных имен переменных иметь одинаковые данные.  
В моем случае:  
 
Dim Данные As Object, avArr, avArrItems, li As Long  
Dim ДолжРуковЗак, ФИОРуковЗак  
Set Данные = CreateObject("Scripting.Dictionary")  
Данные.Add ДолжРуковЗак, "ДолжРуковЗак"  
Данные.Add НомерПрограммы, "НомерПрограммы"  
Данные.Add НомерПрограммы1, "НомерПрограммы1"  
 
На последнюю строку ругается, что такое значение уже есть.  
А мне же надо эти же данные вставить в другое место в документе!!!  
И еще есть другие данные, значения которых совпадают.  
Боюсь, не подойдет такой метод.
 
{quote}{login=EducatedFool}{date=29.08.2010 02:05}{thema=}{post}>    
А зачем тогда вообще что-то изобретать?  
Используем двумерный массив размерностью N*2 - и всё храним в нём...{/post}{/quote}  
 
К моему сожалению и стыду, я не знаю, что такое "двухмерный массив размерностью N*2". Понимать - понимаю. А как сделать не знаю.
 
{quote}{login=EducatedFool}{date=29.08.2010 02:00}{thema=}{post}Да и коллекции подойдут:{/post}{/quote}  
 
Нет. Коллекции тоже не подходят, так как нельзя вытащить из коллекции имя элемента, а только лишь его значение, несмотря на то, что есть ключ.  
Если бы можно было вытащить имя ключа, хоть вот так:  
 
Dim Данные As New Collection  
' при внесении данных в коллекцию используем ключи  
Данные.Add ДолжРуковЗак, "ДолжРуковЗак"  
Данные.Add ФИОРуковЗак, "ФИОРуковЗак"  
Данные.Add НаимОрганизЗак, "НаимОрганизЗак"  
Данные.Add ЮрАдрес, "ЮрАдрес"  
For Each chlen In Данные  
  MsgBox chlen.Key  
Next  
 
Но так не получается.
 
{quote}{login=The_Prist}{date=29.08.2010 02:10}{thema=Re: }{post}  
 
А зачем все это изобретать - вопрос к автору темы....{/post}{/quote}  
 
Я уже писал выше, зачем мне это нужно:  
Из одного документа (Док1) я извлекаю данные и присваиваю им имена переменных, которые совпадают с именами закладок во втором документе (Док2).  
Док2 является шаблоном. Форма Док2 отличается от формы Док1, но данные одни и те же (ну может немного переработанные).  
Чтобы вставить данные в Док2 из Док1 планирую использовать цикл в цикле.  
Первый цикл проходит по именам данных, полученным из Док1, второй по закладкам Док2. При совпадении имён, в Док2 вставляется значение из Док1.  
 
Конечно, можно не заморачиваться с циклами, а просто вставить данные в каждую закладку Док2 и всё!:  
ActiveDocument.Bookmarks("ДолжРуковЗак").Select  
Selection.Text = ДолжРуковЗак  
 
Но хочется же циклом....
 
{quote}{login=The_Prist}{date=29.08.2010 04:10}{thema=Re: Re: }{post}{quote}{login=Мультипликатор}{date=29.08.2010 03:46}{thema=Re: }{post}Коллекции тоже не подходят{/post}{/quote}Коллекция Вам не подходит и еще по одному признаку - в ней тоже хранятся исключительно уникальные элементы.  
 
Я вообще не понимаю, почему нельзя использовать такой вот метод:  
 
Dim Данные(), ДанныеИмя(), li As Long  
Dim ДолжРуковЗак As String, ФИОРуковЗак As String, НаимОрганизЗак As String, ЮрАдрес As String  
ДолжРуковЗак = "ЗавХоз"  
ФИОРуковЗак = "Иванов"  
НаимОрганизЗак = "Рога и копыта"  
ЮрАдрес = "Зацепетовка"  
 
Данные = Array(ДолжРуковЗак, ФИОРуковЗак, НаимОрганизЗак, ЮрАдрес)  
ДанныеИмя = Array("ДолжРуковЗак", "ФИОРуковЗак", "НаимОрганизЗак", "ЮрАдрес")  
 
For li = LBound(Данные) To UBound(Данные)  
MsgBox Данные(li)  
MsgBox ДанныеИмя(li)  
Next li{/post}{/quote}  
 
Точно!!!! Скорей всего так получится!!!    
Спасибо большое!!! Как попробую - отпишусь о результате.  
(сейчас просто убегаю уже)
 
Вот, как получилось, сразу отписываюсь, как и обещал.  
Всё получилось замечательно. Всё работает.  
Всем огромное спасибо!!!
Страницы: 1
Читают тему
Наверх