Добрый вечер. Появилась необходимость перевести данные из одномерного массива в двумерный, функцией =счётслимн() считает слишком долго. Видел что делают с помощью vba, но так и не смог разобраться в этом. Если кто то может помочь буду очень благодарен. На лист1 одномерный массив с данными(фамилия, дата и №Трассы) необходимо в Лист2 начиная с ячейки L3 посчитать количество повторений №Трассы у каждой фамилии отдельно, притом если дата последней записи для данной фамилии более 14 дней, то эти данные не вставлять т.е. =""
Добрый вечер. Появилась необходимость перевести данные из одномерного массива в двумерный, функцией =счётслимн() считает слишком долго. Видел что делают с помощью vba, но так и не смог разобраться в этом. Если кто то может помочь буду очень благодарен. На лист1 одномерный массив с данными(фамилия, дата и №Трассы) необходимо в Лист2 начиная с ячейки L3 посчитать количество повторений №Трассы у каждой фамилии отдельно, притом если дата последней записи для данной фамилии более 14 дней, то эти данные не вставлять т.е. =""Anton85
Sub macro() Dim sh1 As Worksheet, sh2 As Worksheet, fio() Dim lr1&, lr2&, data, i&, dic As Object Set sh1 = ThisWorkbook.Sheets("Лист1") Set sh2 = ThisWorkbook.Sheets("Лист2") With sh1 lr1 = .Cells(Rows.Count, 1).End(xlUp).Row data = .Cells(2, 1).Resize(lr1 - 1, 3).Value Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(data) If Date - data(i, 2) <= 14 Then If dic.exists(Trim(data(i, 1))) Then fio = dic(Trim(data(i, 1))) Else Erase fio ReDim fio(9) End If fio(data(i, 3) - 1) = fio(data(i, 3) - 1) + 1 dic(Trim(data(i, 1))) = fio End If Next i End With With sh2 lr2 = .Cells(Rows.Count, 2).End(xlUp).Row For i = 3 To lr2 .Cells(i, "l").Resize(, 10).ClearContents .Cells(i, "l").Resize(, 10) = dic(Trim(.Cells(i, 2))) Next i End With End Sub
[/vba]
Anton85, здравствуйте, так подойдет? [vba]
Код
Sub macro() Dim sh1 As Worksheet, sh2 As Worksheet, fio() Dim lr1&, lr2&, data, i&, dic As Object Set sh1 = ThisWorkbook.Sheets("Лист1") Set sh2 = ThisWorkbook.Sheets("Лист2") With sh1 lr1 = .Cells(Rows.Count, 1).End(xlUp).Row data = .Cells(2, 1).Resize(lr1 - 1, 3).Value Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(data) If Date - data(i, 2) <= 14 Then If dic.exists(Trim(data(i, 1))) Then fio = dic(Trim(data(i, 1))) Else Erase fio ReDim fio(9) End If fio(data(i, 3) - 1) = fio(data(i, 3) - 1) + 1 dic(Trim(data(i, 1))) = fio End If Next i End With With sh2 lr2 = .Cells(Rows.Count, 2).End(xlUp).Row For i = 3 To lr2 .Cells(i, "l").Resize(, 10).ClearContents .Cells(i, "l").Resize(, 10) = dic(Trim(.Cells(i, 2))) Next i End With End Sub
Manyasha, почти))) а можно там где пусто поставить нули? Ну и чтоб совсем обнаглеть, сделать так чтоб цифра в ячейке была не больше 10
а так почти идеально единственный минус смотрю, на код, и не черта не понимаю......... то ли не дорос еще до этого, то ли мозги не под это заточены)))
Manyasha, почти))) а можно там где пусто поставить нули? Ну и чтоб совсем обнаглеть, сделать так чтоб цифра в ячейке была не больше 10
а так почти идеально единственный минус смотрю, на код, и не черта не понимаю......... то ли не дорос еще до этого, то ли мозги не под это заточены)))Anton85
Вы попобуйте со сводной таблицей, 5000 строк и 60 фамилий - это не те объемы. Буквально на днях переделывал таблицу которая просто по процентику в несколько секунд считала. Там более 300000 строк и условий было более 5.
Anton85,
Вы попобуйте со сводной таблицей, 5000 строк и 60 фамилий - это не те объемы. Буквально на днях переделывал таблицу которая просто по процентику в несколько секунд считала. Там более 300000 строк и условий было более 5.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Sub macro() Dim sh1 As Worksheet, sh2 As Worksheet, fio() As Integer Dim lr1&, lr2&, data, i&, dic As Object Set sh1 = ThisWorkbook.Sheets("Лист1") Set sh2 = ThisWorkbook.Sheets("Лист2") With sh1 'последняя строка на листе 1 lr1 = .Cells(Rows.Count, 1).End(xlUp).Row 'Запоминаем данные из трех столбцов в массив data = .Cells(2, 1).Resize(lr1 - 1, 3).Value 'Будем заполнять словарик, где для каждого ключа (фамилии) у нас будет массив значений (кол-во записей для каждого номера трассы) Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(data) 'Если разница между сегодняшней датой и датой на листе 1 <= 14 If Date - data(i, 2) <= 14 Then 'Если текущая фамилия уже есть в словаре, запоминаем в массив fio все значения для этого ключа (фамилии) If dic.exists(Trim(data(i, 1))) Then fio = dic(Trim(data(i, 1))) 'Иначе, очищаем массив fio Else Erase fio ReDim fio(9) End If 'Увеличиваем кол-во с текущим номером трассы на 1 fio(data(i, 3) - 1) = Application.Min(10, fio(data(i, 3) - 1) + 1) 'Обновляем/создаем элемент словаря для текущей вамилии dic(Trim(data(i, 1))) = fio End If Next i End With With sh2 'последняя строка на листе 2 lr2 = .Cells(Rows.Count, 2).End(xlUp).Row For i = 3 To lr2 'очищаем строчку от старых значений .Cells(i, "l").Resize(, 10).ClearContents 'записываем новые значения .Cells(i, "l").Resize(, 10) = dic(Trim(.Cells(i, 2))) Next i End With End Sub
Sub macro() Dim sh1 As Worksheet, sh2 As Worksheet, fio() As Integer Dim lr1&, lr2&, data, i&, dic As Object Set sh1 = ThisWorkbook.Sheets("Лист1") Set sh2 = ThisWorkbook.Sheets("Лист2") With sh1 'последняя строка на листе 1 lr1 = .Cells(Rows.Count, 1).End(xlUp).Row 'Запоминаем данные из трех столбцов в массив data = .Cells(2, 1).Resize(lr1 - 1, 3).Value 'Будем заполнять словарик, где для каждого ключа (фамилии) у нас будет массив значений (кол-во записей для каждого номера трассы) Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(data) 'Если разница между сегодняшней датой и датой на листе 1 <= 14 If Date - data(i, 2) <= 14 Then 'Если текущая фамилия уже есть в словаре, запоминаем в массив fio все значения для этого ключа (фамилии) If dic.exists(Trim(data(i, 1))) Then fio = dic(Trim(data(i, 1))) 'Иначе, очищаем массив fio Else Erase fio ReDim fio(9) End If 'Увеличиваем кол-во с текущим номером трассы на 1 fio(data(i, 3) - 1) = Application.Min(10, fio(data(i, 3) - 1) + 1) 'Обновляем/создаем элемент словаря для текущей вамилии dic(Trim(data(i, 1))) = fio End If Next i End With With sh2 'последняя строка на листе 2 lr2 = .Cells(Rows.Count, 2).End(xlUp).Row For i = 3 To lr2 'очищаем строчку от старых значений .Cells(i, "l").Resize(, 10).ClearContents 'записываем новые значения .Cells(i, "l").Resize(, 10) = dic(Trim(.Cells(i, 2))) Next i End With End Sub