Страницы: 1
RSS
Как привязать класс к имени листа
 
Приветствую!  
Создаю для книги несколько экземпляров класса (словарей).  
Не могу сообразить, как привязать каждый из словарей к своему листу (имени листа)?  
По индексу не подходит, т.к. порядок создания словарей произвольный, да и перемещение листа блокировать не хочется.
 
Нихрена я не понял.
 
Нужно идентифицировать, какой экземпляр класса для какого листа был создан.  
Экземпляр №1 создаем для лист2.  
Экземпляр №2 создаем для лист1.  
Как с листа обратьться к нужному словарю?
 
Привет.  
 
1.Зачем там классы?  
 
Sub Example()  
   Dim arr(1 To 3) As Object, counter As Long  
     
   For counter = 1 To 3  
       Call CreateDictionary(arr(counter))  
   Next  
End Sub  
 
 
Private Sub CreateDictionary(ByRef box As Object)  
   Set box = CreateObject("Scripting.Dictionary")  
End Sub  
 
 
2. ЧТо надо вообще? Может подойдет коллекция словарей?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
#2  
 
Sub Example2()  
   Dim box As New Collection  
     
   box.Add NewDictionary(), "sheet_name"  
End Sub  
 
 
Private Function NewDictionary() As Object  
   Set NewDictionary = CreateObject("Scripting.Dictionary")  
End Function
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Задумка такая.  
На произвольных листах книги проверять произвольный диапазон(ы) на предмет уникальны.  
Выбор листа и диапазона осуществляется в произвольном порядке.  
Количество обрабатываемых листов заранее неизвестно.  
В процессе работы лист может быть передвинут.  
С массивом диапазонов вроде решил, осталось решить с массивом словарей для каждого диапазона.  
Может быть коллекцией или массивом лучше?  
Но как это прописать, пока не соображу.
 
#2 - похоже то, что надо.  
Будем коллекции осваивать, а то я их как-то стороной обходил.
 
{quote}{login=RAN}{date=16.05.2012 12:49}{thema=}{post}С массивом диапазонов вроде решил, осталось решить с массивом словарей для каждого диапазона.{/post}{/quote}  
Лично мне не понятно зачем тебе массив_словарей/коллекция_словарей/словарь_словарей. Почему нельзя обойтись одним?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
С одним словарем, если на первом листе есть слово nerv, то на втором уже не добавить.
 
Обязательно держать инфу в памяти?  
 
Создали словарь, обработали лист, очистили словарь, обработали еще лист, опять очистили. Не?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Может это и есть великая сермяжная правда.  
Почему решил много - уже не помню, но что-то было.  
Пока все еще совсем сырое...
 
Писать в item имя листа/ов (собирать строку или массив).  
Тогда если нет в словаре - хорошо.  
Если есть - проверяем item на наличие имени. Если нет - хорошо :)
 
Хорошо! :)
 
Я бы сделал примерно так:  
 
--- стандартный модуль ---  
 
Public obDict(1 To 2) As New clsDict  
 
Sub qqq()  
   For i = 1 To 2  
       With Sheets(i)  
           obDict(i).LoadFromRange .Range("A1:A10")  
           obDict(i).SheetCodeName = .CodeName  
       End With  
   Next  
End Sub  
 
 
--- модуль класса ---  
Public clsDict As Object  
Public SheetCodeName As String  
Public SourceRange As Range  
 
Private Sub Class_Initialize()  
   Set clsDict = CreateObject("Scripting.Dictionary")  
End Sub  
 
Sub LoadFromRange(ByRef ra As Range)  
   arr = ra.Value  
   For j = 1 To 10  
       clsDict.Item(arr(j, 1)) = 1  
   Next  
   Set SourceRange = ra  
End Sub  
 
Function SourceSheet() As Worksheet  
   Dim sh As Worksheet: On Error Resume Next  
   For Each sh In ThisWorkbook.Worksheets  
       If sh.CodeName = SheetCodeName Then Set SourceSheet = sh: Exit Function  
   Next sh  
End Function
 
Спасибо за все ответы!  
Буду изучать/учиться!  
На чем остановлюсь - не знаю.    
Но будем учиться далее!
Страницы: 1
Читают тему
Наверх