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

Вход

Регистрация

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

 

= Мир MS Excel/Проверка уникальных значений макросом. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка уникальных значений макросом. (Макросы/Sub)
Проверка уникальных значений макросом.
ArkaIIIa Дата: Четверг, 23.04.2015, 08:20 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Доброе утро, уважаемые!

Помогите, пожалуйста, в написании макроса.
Условно, есть 3 проверяемых столбца: "Отчетная дата", "Номер" и "Код", четвертный столбец - для результатов работы макроса.

По условиям работы макроса:
1) Значение столбца "Код" = "И1"
2) Значение столбца "Номер" = уникальное за ту дату, которая указана в столбце "Отчетная дата".
Если все условия подходят - в столбце "Проверка" проставляется 1, если нет - то ячейка остается пустой.

Набросал рядом формулу, которая работает так, как должен отрабатывать макрос. Ее проблема заключается в том, что на больших массивах она завешивает файл вычислениями.
К сообщению приложен файл: 1873263.xlsx (12.8 Kb)
 
Ответить
СообщениеДоброе утро, уважаемые!

Помогите, пожалуйста, в написании макроса.
Условно, есть 3 проверяемых столбца: "Отчетная дата", "Номер" и "Код", четвертный столбец - для результатов работы макроса.

По условиям работы макроса:
1) Значение столбца "Код" = "И1"
2) Значение столбца "Номер" = уникальное за ту дату, которая указана в столбце "Отчетная дата".
Если все условия подходят - в столбце "Проверка" проставляется 1, если нет - то ячейка остается пустой.

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

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 08:20
Hugo Дата: Четверг, 23.04.2015, 08:50 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Сочетание
30.03.2015 1/0002679
не является уникальным, там две такие пары. Т.е. или формулировка ошибочна, или там не должно быть единицы.
Вероятно думали не о уникальном, а о первом встреченном таком сочетании?
Вообще легко делается на словаре или в данном случае на коллекции.

На словаре проще код:
[vba]
Код
Sub tt()
     Dim a(), i&, t$

     With CreateObject("Scripting.Dictionary"): .comparemode = 1
         a = [a1].CurrentRegion.Columns(1).Resize(, 3).Value
         ReDim b(1 To UBound(a), 1 To 1)
         For i = 2 To UBound(a)
             If a(i, 3) = "И1" Then
                 t = a(i, 1) & "|" & a(i, 2)
                 If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
             End If
         Next
     End With
      
     b(1, 1) = "Проверка макросом"
     [f1].Resize(UBound(b), 1) = b
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Четверг, 23.04.2015, 08:59
 
Ответить
СообщениеСочетание
30.03.2015 1/0002679
не является уникальным, там две такие пары. Т.е. или формулировка ошибочна, или там не должно быть единицы.
Вероятно думали не о уникальном, а о первом встреченном таком сочетании?
Вообще легко делается на словаре или в данном случае на коллекции.

На словаре проще код:
[vba]
Код
Sub tt()
     Dim a(), i&, t$

     With CreateObject("Scripting.Dictionary"): .comparemode = 1
         a = [a1].CurrentRegion.Columns(1).Resize(, 3).Value
         ReDim b(1 To UBound(a), 1 To 1)
         For i = 2 To UBound(a)
             If a(i, 3) = "И1" Then
                 t = a(i, 1) & "|" & a(i, 2)
                 If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
             End If
         Next
     End With
      
     b(1, 1) = "Проверка макросом"
     [f1].Resize(UBound(b), 1) = b
End Sub
[/vba]

Автор - Hugo
Дата добавления - 23.04.2015 в 08:50
ArkaIIIa Дата: Четверг, 23.04.2015, 08:55 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Да, наверное я не правильно сформулировал. На первом встреченном сочетании.
 
Ответить
СообщениеHugo
Да, наверное я не правильно сформулировал. На первом встреченном сочетании.

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 08:55
ArkaIIIa Дата: Четверг, 23.04.2015, 09:11 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Спасибо большое, Хьюго! То что нужно!
 
Ответить
СообщениеHugo
Спасибо большое, Хьюго! То что нужно!

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 09:11
ArkaIIIa Дата: Четверг, 23.04.2015, 09:22 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Что-то я туплю сверх меры. Пытаюсь адаптировать макрос под "большой" файл, и не получается.
Отличие от файла-примера: "Отчетная дата" = столбец B, "Номер" = столбец "E", "Код" = столбец F, вставлять значения в столбец AH.
Ты не мог бы прописать это в своем коде?)
 
Ответить
СообщениеHugo
Что-то я туплю сверх меры. Пытаюсь адаптировать макрос под "большой" файл, и не получается.
Отличие от файла-примера: "Отчетная дата" = столбец B, "Номер" = столбец "E", "Код" = столбец F, вставлять значения в столбец AH.
Ты не мог бы прописать это в своем коде?)

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 09:22
Hugo Дата: Четверг, 23.04.2015, 09:28 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

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


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНет. Нужно сразу показывать реальные данные в реальном расположении. Сейчас уже времени нет, тем более что опять гадать без файла никакой гарантии успеха нет.

Автор - Hugo
Дата добавления - 23.04.2015 в 09:28
ArkaIIIa Дата: Четверг, 23.04.2015, 09:44 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Знаю, моя ошибка.
Набросал пример на реальном расположении. Выгрузить реальный файл, увы, нет возможности, весит очень много.
К сообщению приложен файл: 1873263_1.xlsm (18.1 Kb)
 
Ответить
СообщениеЗнаю, моя ошибка.
Набросал пример на реальном расположении. Выгрузить реальный файл, увы, нет возможности, весит очень много.

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 09:44
Hugo Дата: Четверг, 23.04.2015, 09:51 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
[vba]
Код
Sub tt()
     Dim a(), aa(), i&, t$
     With CreateObject("Scripting.Dictionary"): .comparemode = 1
         a = [b1].CurrentRegion.Value
         aa = [b1].CurrentRegion.Offset(, 3).Resize(, 2).Value
         ReDim b(1 To UBound(a), 1 To 1)
         For i = 2 To UBound(a)
             If aa(i, 2) = "И1" Then
                 t = a(i, 1) & "|" & aa(i, 1)
                 If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
             End If
         Next
     End With

     b(1, 1) = "Проверка"
     [ah1].Resize(UBound(b), 1) = b
End Sub
[/vba]
Но я уверен, что и это в реальном файле не заработает :(


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение[vba]
Код
Sub tt()
     Dim a(), aa(), i&, t$
     With CreateObject("Scripting.Dictionary"): .comparemode = 1
         a = [b1].CurrentRegion.Value
         aa = [b1].CurrentRegion.Offset(, 3).Resize(, 2).Value
         ReDim b(1 To UBound(a), 1 To 1)
         For i = 2 To UBound(a)
             If aa(i, 2) = "И1" Then
                 t = a(i, 1) & "|" & aa(i, 1)
                 If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
             End If
         Next
     End With

     b(1, 1) = "Проверка"
     [ah1].Resize(UBound(b), 1) = b
End Sub
[/vba]
Но я уверен, что и это в реальном файле не заработает :(

Автор - Hugo
Дата добавления - 23.04.2015 в 09:51
ArkaIIIa Дата: Четверг, 23.04.2015, 10:06 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
"И это в реальном файле не работает", потому что в реальном файле столбцы A,C,D тоже заполнены данными.
Мне казалось, что макрос на этом не должен будет споткнуться.
Ты меня извини, Хьюго. Я совсем олень в VBA, по этому вроде бы простую задачу с третьего раза только более-менее описываю.
 
Ответить
СообщениеHugo
"И это в реальном файле не работает", потому что в реальном файле столбцы A,C,D тоже заполнены данными.
Мне казалось, что макрос на этом не должен будет споткнуться.
Ты меня извини, Хьюго. Я совсем олень в VBA, по этому вроде бы простую задачу с третьего раза только более-менее описываю.

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 10:06
Hugo Дата: Четверг, 23.04.2015, 10:24 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Значит вместо компактного CurrentRegion нужно определять этот диапазон иначе...
[vba]
Код
Sub tt()
      Dim r As Range, a(), aa(), i&, t$
      With CreateObject("Scripting.Dictionary"): .comparemode = 1
          Set r = Range([b1], Cells(Rows.Count, "b").End(xlUp))
          a = r.Value
          aa = r.Offset(, 3).Resize(, 2).Value
          ReDim b(1 To UBound(a), 1 To 1)
          For i = 2 To UBound(a)
              If aa(i, 2) = "И1" Then
                  t = a(i, 1) & "|" & aa(i, 1)
                  If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
              End If
          Next
      End With

      b(1, 1) = "Проверка"
      [ah1].Resize(UBound(b), 1) = b
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Четверг, 23.04.2015, 10:24
 
Ответить
СообщениеЗначит вместо компактного CurrentRegion нужно определять этот диапазон иначе...
[vba]
Код
Sub tt()
      Dim r As Range, a(), aa(), i&, t$
      With CreateObject("Scripting.Dictionary"): .comparemode = 1
          Set r = Range([b1], Cells(Rows.Count, "b").End(xlUp))
          a = r.Value
          aa = r.Offset(, 3).Resize(, 2).Value
          ReDim b(1 To UBound(a), 1 To 1)
          For i = 2 To UBound(a)
              If aa(i, 2) = "И1" Then
                  t = a(i, 1) & "|" & aa(i, 1)
                  If Not .exists(t) Then b(i, 1) = 1: .Item(t) = 0&
              End If
          Next
      End With

      b(1, 1) = "Проверка"
      [ah1].Resize(UBound(b), 1) = b
End Sub
[/vba]

Автор - Hugo
Дата добавления - 23.04.2015 в 10:24
ArkaIIIa Дата: Четверг, 23.04.2015, 10:27 | Сообщение № 11
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Да, вот сейчас - все отлично работает на рабочем файле!
Еще раз спасибо большое, и извиняюсь, что отнял так много времени невнятными формулировками. Буду работать над собой)
 
Ответить
СообщениеHugo
Да, вот сейчас - все отлично работает на рабочем файле!
Еще раз спасибо большое, и извиняюсь, что отнял так много времени невнятными формулировками. Буду работать над собой)

Автор - ArkaIIIa
Дата добавления - 23.04.2015 в 10:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка уникальных значений макросом. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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