Здравствуйте уважаемые форумчане. Накидал макрос который отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух [vba]
Код
Sub Поиск() LR = Cells(Rows.Count, 3).End(xlUp).Row For i = 1 To LR If Cells(i, 3) = "" Then n = Cells(i, 1): m = Cells(i, 2) v = Application.WorksheetFunction.CountIfs(Sheets(Лист1).Columns(1), n, Sheets(Лист1).Columns(2), m) End If Next End Sub
[/vba] Так же прилагаю файл. Макрос кривой. подскажите как сделать с использованием коллекций.
Здравствуйте уважаемые форумчане. Накидал макрос который отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух [vba]
Код
Sub Поиск() LR = Cells(Rows.Count, 3).End(xlUp).Row For i = 1 To LR If Cells(i, 3) = "" Then n = Cells(i, 1): m = Cells(i, 2) v = Application.WorksheetFunction.CountIfs(Sheets(Лист1).Columns(1), n, Sheets(Лист1).Columns(2), m) End If Next End Sub
[/vba] Так же прилагаю файл. Макрос кривой. подскажите как сделать с использованием коллекций.Sashagor1982
Он не кривой - он вообще не работает... А в чём задача то? Вот это в связке не понял: "отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух".
Он не кривой - он вообще не работает... А в чём задача то? Вот это в связке не понял: "отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух".Hugo
В итоге необходимо, чтобы он отыскивал те строки где например в третьем столбце пустота и считает те строки где первый столбец был "Старший специалист СПС", а второй "6117", если не совпадает один из столбцов то не считал.. Т.Е. сколько не занятых должностей "Старший специалист СПС" с кодом 6117.
В итоге необходимо, чтобы он отыскивал те строки где например в третьем столбце пустота и считает те строки где первый столбец был "Старший специалист СПС", а второй "6117", если не совпадает один из столбцов то не считал.. Т.Е. сколько не занятых должностей "Старший специалист СПС" с кодом 6117.Sashagor1982
Суть в чем, допустим 1500 должностей с разными критериями, макрос находит 1 вакантную и ищет такие же ваканты, если есть еще, пишет сколько, потом ищет другую вакантную должность и т.д.
Суть в чем, допустим 1500 должностей с разными критериями, макрос находит 1 вакантную и ищет такие же ваканты, если есть еще, пишет сколько, потом ищет другую вакантную должность и т.д.Sashagor1982
А что мешает эти критерии добавить в сводную? Она тоже показывает сколько вакантных мест есть. Можно конечно и макросом это не сложно. Только нужно тогда понимать сколько будет этих критериев. Завтра будет несколько минут могу написать. Можете и сами попробовать Я бы за основу взял макрос из готовых решений по составлению списка уникальных значений.
Зы все равно не пойму чем сводная не угодила. Покажите детальное пример. Что должно получится.
А что мешает эти критерии добавить в сводную? Она тоже показывает сколько вакантных мест есть. Можно конечно и макросом это не сложно. Только нужно тогда понимать сколько будет этих критериев. Завтра будет несколько минут могу написать. Можете и сами попробовать Я бы за основу взял макрос из готовых решений по составлению списка уникальных значений.
Зы все равно не пойму чем сводная не угодила. Покажите детальное пример. Что должно получится. SLAVICK
Sub поиск() LR1 = Cells(Rows.Count, 1).End(xlUp).Row LR3 = Cells(Rows.Count, 3).End(xlUp).Row + 1 Dim arr, i arr = Range(Cells(LR1, 1), Cells(LR3, 2)).Value Dim newArr() As String, uniqArr For i = 1 To UBound(arr) ReDim Preserve newArr(1 To i) newArr(i) = CStr(arr(i, 1) & "," & arr(i, 2)) Next i = 1 For Each v In UniqueValues(newArr()) Debug.Print Split(v, ",")(0) Cells(i, 10) = Split(v, ",")(0) Cells(i, 11) = Split(v, ",")(1) Cells(i, 12) = Application.WorksheetFunction.CountIfs(Range(Cells(LR1, 1), Cells(LR3, 1)), Split(v, ",")(0), Range(Cells(LR1, 2), Cells(LR3, 2)), Split(v, ",")(1)) i = i + 1 Next End Sub
[/vba]
Функцию выборки уникальных значений взяла тута. Перед запуском макроса нужно отсортировать столбец С по алфавиту. Если нужно тоже программно, можете записать макрос сортировки и вставить в начало моего кода
Sashagor1982, проверяйте файл. [vba]
Код
Sub поиск() LR1 = Cells(Rows.Count, 1).End(xlUp).Row LR3 = Cells(Rows.Count, 3).End(xlUp).Row + 1 Dim arr, i arr = Range(Cells(LR1, 1), Cells(LR3, 2)).Value Dim newArr() As String, uniqArr For i = 1 To UBound(arr) ReDim Preserve newArr(1 To i) newArr(i) = CStr(arr(i, 1) & "," & arr(i, 2)) Next i = 1 For Each v In UniqueValues(newArr()) Debug.Print Split(v, ",")(0) Cells(i, 10) = Split(v, ",")(0) Cells(i, 11) = Split(v, ",")(1) Cells(i, 12) = Application.WorksheetFunction.CountIfs(Range(Cells(LR1, 1), Cells(LR3, 1)), Split(v, ",")(0), Range(Cells(LR1, 2), Cells(LR3, 2)), Split(v, ",")(1)) i = i + 1 Next End Sub
[/vba]
Функцию выборки уникальных значений взяла тута. Перед запуском макроса нужно отсортировать столбец С по алфавиту. Если нужно тоже программно, можете записать макрос сортировки и вставить в начало моего кодаManyasha
ЯД: 410013299366744 WM: R193491431804
Сообщение отредактировал Manyasha - Четверг, 12.02.2015, 00:04
Должно быть примерно так, в приложенном файле макрос "ЗаявкаПСС", однако там название должности ищется по коду (одной должности соответствует один код, необходимо рассмотреть случай когда одному коду соответствует несколько названий должностей, необходимое условие: первоначальная таблица никак не форматируется. Файл не приложить, большой.
Должно быть примерно так, в приложенном файле макрос "ЗаявкаПСС", однако там название должности ищется по коду (одной должности соответствует один код, необходимо рассмотреть случай когда одному коду соответствует несколько названий должностей, необходимое условие: первоначальная таблица никак не форматируется. Файл не приложить, большой. Sashagor1982
Сообщение отредактировал Sashagor1982 - Четверг, 12.02.2015, 00:29
SLAVICK, Manyasha, Завтра попробую сделать скрин, что бы объяснить что надо в итоге, понимаю что понять трудно, но если файл сильно уменьшить, то он потеряет смысл. Но обязательно исходная таблица не изменяется
SLAVICK, Manyasha, Завтра попробую сделать скрин, что бы объяснить что надо в итоге, понимаю что понять трудно, но если файл сильно уменьшить, то он потеряет смысл. Но обязательно исходная таблица не изменяетсяSashagor1982
Можно покороче (вывод можно чуть усложнить, чтоб разбить первый столбец на два): [vba]
Код
Sub tt() Dim a(), i&
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = [a1].CurrentRegion.Value For i = 1 To UBound(a) If Len(Trim(a(i, 3))) = 0 Then .Item(a(i, 1) & "|" & a(i, 2)) = .Item(a(i, 1) & "|" & a(i, 2)) + 1 Next Workbooks.Add(1).Sheets(1).[a1].Resize(.Count, 2) = Application.Transpose(Array(.keys, .items)) End With
End Sub
[/vba] Писал для файла Manyasha countifs2.xlsm(20Kb)
Можно покороче (вывод можно чуть усложнить, чтоб разбить первый столбец на два): [vba]
Код
Sub tt() Dim a(), i&
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = [a1].CurrentRegion.Value For i = 1 To UBound(a) If Len(Trim(a(i, 3))) = 0 Then .Item(a(i, 1) & "|" & a(i, 2)) = .Item(a(i, 1) & "|" & a(i, 2)) + 1 Next Workbooks.Add(1).Sheets(1).[a1].Resize(.Count, 2) = Application.Transpose(Array(.keys, .items)) End With
End Sub
[/vba] Писал для файла Manyasha countifs2.xlsm(20Kb)Hugo
Manyasha, Hugo, Спасибо, макрос попробую разобрать, а так что бы было понятно я сделал такой файл (прикреплен), где есть исходная таблица и результат (листы). Посмотрите, если можно то чуть дооаботайте.
Manyasha, Hugo, Спасибо, макрос попробую разобрать, а так что бы было понятно я сделал такой файл (прикреплен), где есть исходная таблица и результат (листы). Посмотрите, если можно то чуть дооаботайте. Sashagor1982
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = Sheets("исходник").[a1].CurrentRegion.Value 'должно быть не менее 5-ти столбцов! For i = 1 To UBound(a) If Len(Trim(a(i, 4))) = 0 Then t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 5) If Not .exists(t) Then x = x + 1: .Item(t) = x a(x, 1) = a(i, 1) a(x, 2) = a(i, 2) a(x, 3) = a(i, 3) a(x, 4) = 1 a(x, 5) = a(i, 5) Else y = .Item(t) a(y, 4) = a(y, 4) + 1 End If End If Next End With
With Sheets("результат") .[a1].CurrentRegion.Offset(2).ClearContents .[a3].Resize(x, 5) = a End With
End Sub
[/vba] Тут чуть другой подход, т.к. столбцов нужно собирать больше.
[vba]
Код
Option Explicit
Sub tt() Dim a(), i&, t$, x&, y&
With CreateObject("Scripting.Dictionary"): .comparemode = 1 a = Sheets("исходник").[a1].CurrentRegion.Value 'должно быть не менее 5-ти столбцов! For i = 1 To UBound(a) If Len(Trim(a(i, 4))) = 0 Then t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 5) If Not .exists(t) Then x = x + 1: .Item(t) = x a(x, 1) = a(i, 1) a(x, 2) = a(i, 2) a(x, 3) = a(i, 3) a(x, 4) = 1 a(x, 5) = a(i, 5) Else y = .Item(t) a(y, 4) = a(y, 4) + 1 End If End If Next End With
With Sheets("результат") .[a1].CurrentRegion.Offset(2).ClearContents .[a3].Resize(x, 5) = a End With
End Sub
[/vba] Тут чуть другой подход, т.к. столбцов нужно собирать больше.Hugo
Hugo, Спасибо, постараюсь разобрать макрос, но можно его чуть доработать, сделать так как в приложенном файле. Заранее спасибо. Пояснение в листе "результат".
Hugo, Спасибо, постараюсь разобрать макрос, но можно его чуть доработать, сделать так как в приложенном файле. Заранее спасибо. Пояснение в листе "результат".Sashagor1982
Ну категорию" оф" легко - проверяйте на оф сразу после проверки на пусто. А вот вторая хотелка сильно сложнее, не хочу даже браться. Ещё и объединения... Часа два работы, может больше.... Во сколько оцените 2 часа работы? Денег не прошу - сказал что не хочу браться. Но может кто из спортивного интереса сделает?
Ну категорию" оф" легко - проверяйте на оф сразу после проверки на пусто. А вот вторая хотелка сильно сложнее, не хочу даже браться. Ещё и объединения... Часа два работы, может больше.... Во сколько оцените 2 часа работы? Денег не прошу - сказал что не хочу браться. Но может кто из спортивного интереса сделает? Hugo
100%, а если учесть, что возможно еще критерии появятся Предлагаю все-таки подумать над сводной. Там и критерии легче и быстрее добавить, и с объединенными ячейками можно Если хотите макросом - то на основе макроса Hugo - можно дописывать... добавить еще один массив+ словарь+ отсортировать... в общем есть чего дописывать.
100%, а если учесть, что возможно еще критерии появятся Предлагаю все-таки подумать над сводной. Там и критерии легче и быстрее добавить, и с объединенными ячейками можно Если хотите макросом - то на основе макроса Hugo - можно дописывать... добавить еще один массив+ словарь+ отсортировать... в общем есть чего дописывать.SLAVICK
Можно добавить ещё один словарь (как уже упомянул SLAVICK )для этих "оф", где каждому собирать коллекцию его строк в итоговом массиве, затем циклом по всей этой байде всё построчно извлекать на лист. Плюс изначально с диапазона (неизвестно какого, значит с всей ранее использованной области листа) убирать все объединения, и проставлять эти объединения в этих заголовках разделов. Геморой... писанины и головоломки много. А вообще кажется такое несложно было настроить в ACCESS в его репортах, делал лет 10 назад в 2000 версии - если есть спец, то может проще этот лист подключить к ACCESS и сделать дело там?
Можно добавить ещё один словарь (как уже упомянул SLAVICK )для этих "оф", где каждому собирать коллекцию его строк в итоговом массиве, затем циклом по всей этой байде всё построчно извлекать на лист. Плюс изначально с диапазона (неизвестно какого, значит с всей ранее использованной области листа) убирать все объединения, и проставлять эти объединения в этих заголовках разделов. Геморой... писанины и головоломки много. А вообще кажется такое несложно было настроить в ACCESS в его репортах, делал лет 10 назад в 2000 версии - если есть спец, то может проще этот лист подключить к ACCESS и сделать дело там?Hugo