Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как передать объект Range в метод класса ?
 
Ну, код в первом посте - это просто наброски.. В реале хотел инкапсулировать функцию, которая обрабатывает и переносит данные их одного файла в другой при помощи использования словаря ("Scripting.Dictionary"). По диапазону формирует словарь.. И в дальнейшем по ключу находит нужное значение и ставит его в нужное место. Использование словаря показалось мне удобным, исходя из структуры обрабатываемых данных и скорости обработки. Сам файл во вложении ниже..

Вот код функции со словарем:
Код
Public Function Calculate()
Dim dicData
Dim row As Long
Dim key As String
Dim id As String
Dim item As Long
Set dicData = CreateObject("Scripting.Dictionary")

With DatabaseSheet
    For row = 1 To .Rows.Count
        key = CStr(.Cells(row, 1).Value)
        item = CLng(.Cells(row, 13).Value)
        dicData.Add key, item
    Next
End With
    
With CalculatorSheet
    For row = 1 To .Rows.Count
        id = CStr(.Cells(row, 1).Value)
        .Cells(row, 13).Value = dicData.item(id)
    Next
End With
End Function 
Почему вынес функцию в отдельный класс - хочется поиграться с ооп и думаю что в дальнейшем программка усложнится.  Вопрос прежний: можно ли/и как передать Range в метод класса ?
Как передать объект Range в метод класса ?
 
Создаю класс, в котором будет метод. Метод считает количество строк в диапазон Range. Ниже наброски кода, подскажите, как из модуля передать Range в метод класса ?

Класс:
Код
Option Explicit
Private pDatabaseSheet As Object
Private pCalculatorSheet As Object
Public Property Let DatabaseSheet(DatabaseSheet As Object)
    pDatabaseSheet = DatabaseSheet
End Property

Public Function Calculate()
    Dim testRange As Range
    'Set testRange = pDatabaseSheet - незнаю как передать Range из Модуля
    Set testRange = Workbooks("TestData.xlsx").Worksheets("Лист").Range("A3:AE9") 'Так таботат
    Debug.Print testRange.Rows.Count
End Function 
Модуль:
Код
Option Explicit
Sub Main()
    Dim Document As New Document
    Set Document.DatabaseSheet = Workbooks("TestData.xlsx").Worksheets("Лист").Range("A3:AE9")
    Document.Calculate
End Sub
Ошибку пишет Invalid use of property. Как я понимаю, ошибка именно в модуле, при передаче..
Изменено: dimm - 23.11.2015 16:08:45
Формула считает значение с другого листа, потом преобразует формулу в значение, как ускорить работу макроса
 
Всем большое спасибо! Особенно :
Цитата
Watcher_1 написал: Используйте Scripting.Dictionary будет намного быстрее!
Цитата
Finswimmer написал: Можно, и даже нужно, отключить обновление экрана.
80 500 строк теперь обрабатывается за 3 мин 20 сек, и думаю это не придел, если причесать код :)
Формула считает значение с другого листа, потом преобразует формулу в значение, как ускорить работу макроса
 
Привет!
Пишу макрос, в котором формула с помощью ВПР по ID из первого файла находит значение во втором файле (базе), пишет его в первый файл и преобразовывает его в значение.
Макрос считает мои 80 500+ строк около 20 минут :( Если руками делать, т.е. вставить формулу в первую ячейку, клацнуть по черному кубику в правом углу, то весь столбец считается за 5 минут + макросом преобразовываю формулы в значения.
Подскажите, может я не так макрос пишу:
Код
Function FillColum2()
    Dim formula As String
    Dim counter As Long
    counter = 3
    Debug.Print ("Время начала " & Now)
    Range("K32:K80401").Select
    For Each cell In Selection
        formula = "=ВПР('[Файл_1.xlsb]ID'!A" & counter & ";'[Файл_2.xlsb]База'!$A$3:$AE$80500;13;ЛОЖЬ)"
        cell.FormulaLocal = formula
        cell.formula = cell.Value
        counter = counter + 1
    Next cell
    Debug.Print ("Время окончания " & Now)
End Function
Изменено: dimm - 14.11.2015 23:31:11
Подсчет дубликатов.
 
Цитата
The_Prist написал: Вы хоть справку по функции потрудитесь прочесть.
на всякий случай снова перечитал справку Excel.. прикол в том, что там нет примера похожего на СЧЁТЕСЛИ(G12:J12;G12:J12) [массив];[массив], а [массив];"значение" - есть. Может вы про другую справку?

Всем большое спасибо за объяснения, стало намного понятнее :)
Подсчет дубликатов.
 
Спасибо за ответ, стало немного понятнее :) Но хотелось бы еще подробнее:
Почему формула:
Код
=СЧЁТЕСЛИ(G12:J12;G12:J12)
  • возвращает результат 1, если массив [qq,ww,ee,rr]. Повторов же нет.
  • возвращает результат 1, если массив [11,ee,ww,11]. Один повтор.
  • возвращает результат 2, если массив[11,22,ee,ee]. Один повтор.
  • возвращает результат 2, если массив[11,11,ee,ee]. Два повтора.
Изменено: dimm - 03.03.2015 18:33:19
Подсчет дубликатов.
 
Добрый день.

По сабжу в сети нашел вот такую формулу:
Код
=СУММПРОИЗВ(--(СЧЁТЕСЛИ(A2:A11;A2:A11)>1))
Объясните по подробнее, как она работает?
почему функция ЕСЛИ не работает в интервале?
 
Простите, за офф топ, но не подскажите, зачем там минусы?

Код
=ЕСЛИ(-ЕЧИСЛО(ПОИСКПОЗ(K4;D621);B7;M4) 
=ЕСЛИ(СУММПРОИЗВ(-(K4=D621));B7;M4)
Изменено: dimm - 06.02.2015 16:24:12
Страницы: 1
Наверх