Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Коллекции для поиска - Мир MS Excel

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_, DrMini  
Коллекции для поиска
Sashagor1982 Дата: Среда, 11.02.2015, 00:01 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте уважаемые форумчане. Накидал макрос который отыскивает в 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]
Так же прилагаю файл. Макрос кривой. подскажите как сделать с использованием коллекций.
К сообщению приложен файл: 5365930.xls (41.5 Kb)


Сообщение отредактировал Sashagor1982 - Среда, 11.02.2015, 00:01
 
Ответить
СообщениеЗдравствуйте уважаемые форумчане. Накидал макрос который отыскивает в 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
Дата добавления - 11.02.2015 в 00:01
Hugo Дата: Среда, 11.02.2015, 00:38 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Он не кривой - он вообще не работает...
А в чём задача то? Вот это в связке не понял: "отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух".


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеОн не кривой - он вообще не работает...
А в чём задача то? Вот это в связке не понял: "отыскивает в 3-ем столбце пустое значение и считает количество совпадающих значений в первых двух".

Автор - Hugo
Дата добавления - 11.02.2015 в 00:38
Sashagor1982 Дата: Среда, 11.02.2015, 15:36 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
В итоге необходимо, чтобы он отыскивал те строки где например в третьем столбце пустота и считает те строки где первый столбец был "Старший специалист СПС", а второй "6117", если не совпадает один из столбцов то не считал.. Т.Е. сколько не занятых должностей "Старший специалист СПС" с кодом 6117.
 
Ответить
СообщениеВ итоге необходимо, чтобы он отыскивал те строки где например в третьем столбце пустота и считает те строки где первый столбец был "Старший специалист СПС", а второй "6117", если не совпадает один из столбцов то не считал.. Т.Е. сколько не занятых должностей "Старший специалист СПС" с кодом 6117.

Автор - Sashagor1982
Дата добавления - 11.02.2015 в 15:36
SLAVICK Дата: Среда, 11.02.2015, 16:47 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
А если без макроса - сводной? пойдет?
Можно макрос на обновление сводной сделать :D
К сообщению приложен файл: 5365930.xlsm (22.6 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеА если без макроса - сводной? пойдет?
Можно макрос на обновление сводной сделать :D

Автор - SLAVICK
Дата добавления - 11.02.2015 в 16:47
Sashagor1982 Дата: Среда, 11.02.2015, 22:42 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Спасибо, но необходим именно макрос..
 
Ответить
СообщениеСпасибо, но необходим именно макрос..

Автор - Sashagor1982
Дата добавления - 11.02.2015 в 22:42
Sashagor1982 Дата: Среда, 11.02.2015, 23:06 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Суть в чем, допустим 1500 должностей с разными критериями, макрос находит 1 вакантную и ищет такие же ваканты, если есть еще, пишет сколько, потом ищет другую вакантную должность и т.д.
 
Ответить
СообщениеСуть в чем, допустим 1500 должностей с разными критериями, макрос находит 1 вакантную и ищет такие же ваканты, если есть еще, пишет сколько, потом ищет другую вакантную должность и т.д.

Автор - Sashagor1982
Дата добавления - 11.02.2015 в 23:06
SLAVICK Дата: Среда, 11.02.2015, 23:24 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
А что мешает эти критерии добавить в сводную?
Она тоже показывает сколько вакантных мест есть. :D
Можно конечно и макросом это не сложно. Только нужно тогда понимать сколько будет этих критериев.
Завтра будет несколько минут могу написать. Можете и сами попробовать ;)
Я бы за основу взял макрос из готовых решений по составлению списка уникальных значений.

Зы все равно не пойму чем сводная не угодила. Покажите детальное пример. Что должно получится. %)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеА что мешает эти критерии добавить в сводную?
Она тоже показывает сколько вакантных мест есть. :D
Можно конечно и макросом это не сложно. Только нужно тогда понимать сколько будет этих критериев.
Завтра будет несколько минут могу написать. Можете и сами попробовать ;)
Я бы за основу взял макрос из готовых решений по составлению списка уникальных значений.

Зы все равно не пойму чем сводная не угодила. Покажите детальное пример. Что должно получится. %)

Автор - SLAVICK
Дата добавления - 11.02.2015 в 23:24
Manyasha Дата: Четверг, 12.02.2015, 00:03 | Сообщение № 8
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
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]

Функцию выборки уникальных значений взяла тута.
Перед запуском макроса нужно отсортировать столбец С по алфавиту. Если нужно тоже программно, можете записать макрос сортировки и вставить в начало моего кода


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Четверг, 12.02.2015, 00:04
 
Ответить
Сообщение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
Дата добавления - 12.02.2015 в 00:03
Sashagor1982 Дата: Четверг, 12.02.2015, 00:10 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Должно быть примерно так, в приложенном файле макрос "ЗаявкаПСС", однако там название должности ищется по коду (одной должности соответствует один код, необходимо рассмотреть случай когда одному коду соответствует несколько названий должностей, необходимое условие: первоначальная таблица никак не форматируется.
Файл не приложить, большой. :(


Сообщение отредактировал Sashagor1982 - Четверг, 12.02.2015, 00:29
 
Ответить
СообщениеДолжно быть примерно так, в приложенном файле макрос "ЗаявкаПСС", однако там название должности ищется по коду (одной должности соответствует один код, необходимо рассмотреть случай когда одному коду соответствует несколько названий должностей, необходимое условие: первоначальная таблица никак не форматируется.
Файл не приложить, большой. :(

Автор - Sashagor1982
Дата добавления - 12.02.2015 в 00:10
Sashagor1982 Дата: Четверг, 12.02.2015, 00:34 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
SLAVICK, Manyasha, Завтра попробую сделать скрин, что бы объяснить что надо в итоге, понимаю что понять трудно, но если файл сильно уменьшить, то он потеряет смысл. Но обязательно исходная таблица не изменяется
 
Ответить
СообщениеSLAVICK, Manyasha, Завтра попробую сделать скрин, что бы объяснить что надо в итоге, понимаю что понять трудно, но если файл сильно уменьшить, то он потеряет смысл. Но обязательно исходная таблица не изменяется

Автор - Sashagor1982
Дата добавления - 12.02.2015 в 00:34
Manyasha Дата: Четверг, 12.02.2015, 00:45 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Sashagor1982, в моем макросе Вам не понравилось наличие сортировки? А остальное: результат, смысл правильный?

Если я права, то вот файл: сортировка не нужна.
К сообщению приложен файл: countifs2.xlsm (19.5 Kb)


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Четверг, 12.02.2015, 01:09
 
Ответить
СообщениеSashagor1982, в моем макросе Вам не понравилось наличие сортировки? А остальное: результат, смысл правильный?

Если я права, то вот файл: сортировка не нужна.

Автор - Manyasha
Дата добавления - 12.02.2015 в 00:45
Hugo Дата: Четверг, 12.02.2015, 10:03 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Можно покороче (вывод можно чуть усложнить, чтоб разбить первый столбец на два):
[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)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеМожно покороче (вывод можно чуть усложнить, чтоб разбить первый столбец на два):
[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
Дата добавления - 12.02.2015 в 10:03
Sashagor1982 Дата: Четверг, 12.02.2015, 15:03 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Manyasha, Hugo, Спасибо, макрос попробую разобрать, а так что бы было понятно я сделал такой файл (прикреплен), где есть исходная таблица и результат (листы). Посмотрите, если можно то чуть дооаботайте. yes
К сообщению приложен файл: 3483331.xls (33.5 Kb)
 
Ответить
СообщениеManyasha, Hugo, Спасибо, макрос попробую разобрать, а так что бы было понятно я сделал такой файл (прикреплен), где есть исходная таблица и результат (листы). Посмотрите, если можно то чуть дооаботайте. yes

Автор - Sashagor1982
Дата добавления - 12.02.2015 в 15:03
Hugo Дата: Четверг, 12.02.2015, 15:40 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
[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]
Тут чуть другой подход, т.к. столбцов нужно собирать больше.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Четверг, 12.02.2015, 15:58
 
Ответить
Сообщение[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
Дата добавления - 12.02.2015 в 15:40
Sashagor1982 Дата: Четверг, 12.02.2015, 21:09 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Hugo, Спасибо, постараюсь разобрать макрос, но можно его чуть доработать, сделать так как в приложенном файле. Заранее спасибо. Пояснение в листе "результат".
К сообщению приложен файл: 3871888.xls (93.5 Kb)
 
Ответить
СообщениеHugo, Спасибо, постараюсь разобрать макрос, но можно его чуть доработать, сделать так как в приложенном файле. Заранее спасибо. Пояснение в листе "результат".

Автор - Sashagor1982
Дата добавления - 12.02.2015 в 21:09
Hugo Дата: Четверг, 12.02.2015, 21:22 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Ну категорию" оф" легко - проверяйте на оф сразу после проверки на пусто.
А вот вторая хотелка сильно сложнее, не хочу даже браться. Ещё и объединения... Часа два работы, может больше.... Во сколько оцените 2 часа работы?
Денег не прошу - сказал что не хочу браться. Но может кто из спортивного интереса сделает? :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу категорию" оф" легко - проверяйте на оф сразу после проверки на пусто.
А вот вторая хотелка сильно сложнее, не хочу даже браться. Ещё и объединения... Часа два работы, может больше.... Во сколько оцените 2 часа работы?
Денег не прошу - сказал что не хочу браться. Но может кто из спортивного интереса сделает? :)

Автор - Hugo
Дата добавления - 12.02.2015 в 21:22
SLAVICK Дата: Четверг, 12.02.2015, 23:23 | Сообщение № 17
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Часа два работы, может больше....

100%, а если учесть, что возможно еще критерии появятся %)
Предлагаю все-таки подумать над сводной.
Там и критерии легче и быстрее добавить, и с объединенными ячейками можно :)
Если хотите макросом - то на основе макроса Hugo - можно дописывать... добавить еще один массив+ словарь+ отсортировать... в общем есть чего дописывать.
К сообщению приложен файл: 3871888.xlsx (40.8 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Часа два работы, может больше....

100%, а если учесть, что возможно еще критерии появятся %)
Предлагаю все-таки подумать над сводной.
Там и критерии легче и быстрее добавить, и с объединенными ячейками можно :)
Если хотите макросом - то на основе макроса Hugo - можно дописывать... добавить еще один массив+ словарь+ отсортировать... в общем есть чего дописывать.

Автор - SLAVICK
Дата добавления - 12.02.2015 в 23:23
Sashagor1982 Дата: Пятница, 13.02.2015, 14:43 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
SLAVICK, Hugo, Спасибо. :)
 
Ответить
СообщениеSLAVICK, Hugo, Спасибо. :)

Автор - Sashagor1982
Дата добавления - 13.02.2015 в 14:43
Hugo Дата: Пятница, 13.02.2015, 15:59 | Сообщение № 19
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Можно добавить ещё один словарь (как уже упомянул SLAVICK )для этих "оф", где каждому собирать коллекцию его строк в итоговом массиве, затем циклом по всей этой байде всё построчно извлекать на лист. Плюс изначально с диапазона (неизвестно какого, значит с всей ранее использованной области листа) убирать все объединения, и проставлять эти объединения в этих заголовках разделов. Геморой... писанины и головоломки много.
А вообще кажется такое несложно было настроить в ACCESS в его репортах, делал лет 10 назад в 2000 версии - если есть спец, то может проще этот лист подключить к ACCESS и сделать дело там?


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеМожно добавить ещё один словарь (как уже упомянул SLAVICK )для этих "оф", где каждому собирать коллекцию его строк в итоговом массиве, затем циклом по всей этой байде всё построчно извлекать на лист. Плюс изначально с диапазона (неизвестно какого, значит с всей ранее использованной области листа) убирать все объединения, и проставлять эти объединения в этих заголовках разделов. Геморой... писанины и головоломки много.
А вообще кажется такое несложно было настроить в ACCESS в его репортах, делал лет 10 назад в 2000 версии - если есть спец, то может проще этот лист подключить к ACCESS и сделать дело там?

Автор - Hugo
Дата добавления - 13.02.2015 в 15:59
Sashagor1982 Дата: Пятница, 13.02.2015, 16:11 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Hugo, Спасибо, я попробую разобраться.. :)
 
Ответить
СообщениеHugo, Спасибо, я попробую разобраться.. :)

Автор - Sashagor1982
Дата добавления - 13.02.2015 в 16:11
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!