Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2009, 18:29   #1
Blackwind
Новичок
Джуниор
 
Аватар для Blackwind
 
Регистрация: 17.09.2009
Сообщений: 7
По умолчанию Создать лист, где каждая улица будет повторяться только один раз

есть таблица, в B-столбце - названия улиц (много повторяющихся, не вперемешку), в C-столбце - номера домов. нужен макрос, который создаст лист, где в каждая улица будет повторяться только один раз, а в С-ячейке номера домов будут записаны через запятую.
Blackwind вне форума Ответить с цитированием
Старый 18.09.2009, 04:42   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Как уже говорил уважаемый EducatedFoool, нет ни малейшего желания воссоздавать Ваш файл. Будет пример - будет и незамедлительный ответ. Тем более, что названия улиц могут быть написаны по разному.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 18.09.2009, 12:02   #3
Blackwind
Новичок
Джуниор
 
Аватар для Blackwind
 
Регистрация: 17.09.2009
Сообщений: 7
По умолчанию

вот - пример оригинального файла, где каждому дому соответствует улица и индекс, а также пример результирующего файла, где дома сгруппированы по улицам и индексам
Вложения
Тип файла: rar примеры.rar (10.5 Кб, 12 просмотров)
Blackwind вне форума Ответить с цитированием
Старый 18.09.2009, 16:43   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Макрос получился сложный, поэтому даже не спрашивайте, как он работает
Код:
Sub Выборка()
    On Error Resume Next
    Dim sh As Worksheet: ActiveSheet.Copy , ActiveSheet: Set sh = ActiveSheet
    Dim cell As Range, ra As Range, FullRa As Range, vr As Range
    Application.ScreenUpdating = False
    Set ra = Range([b8], Range("b" & Rows.Count).End(xlUp))
    Set FullRa = Range([b7], Range("b" & Rows.Count).End(xlUp)).Resize(, 4)
    FullRa.AutoFilter

    For Each cell In ra.Cells
        If Len(Trim(cell.Next)) Then
            FullRa.AutoFilter 2, cell(1, 2): FullRa.AutoFilter 4, cell(1, 4)
            Set vr = ra.SpecialCells(xlCellTypeVisible)
            If vr.Cells.Count > 1 Then
                res = ""
                For Each cell2 In vr.Offset(, 2).Cells: res = res & "; " & cell2: Next cell2
                res = Trim(Mid(res, 3)): arr = vr.Cells(1).Resize(, 4).Value
                vr.Offset(, 1).ClearContents: vr.Offset(, 2).ClearContents: vr.Offset(, 3).ClearContents
                vr.Cells(1).Resize(, 4).Value = arr: vr.Cells(1).Offset(, 2) = res
            End If
        End If
    Next cell
    FullRa.AutoFilter
    ra.Offset(, 1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Set ra = Range([b8], Range("b" & Rows.Count).End(xlUp))
    ra.Cells(1).AutoFill Destination:=ra, Type:=xlFillSeries
    ra.Offset(, 2).WrapText = True: Application.ScreenUpdating = True
End Sub
Просто нажмите зелёную кнопочку в файле-примере:

EducatedFool вне форума Ответить с цитированием
Старый 18.09.2009, 17:36   #5
Blackwind
Новичок
Джуниор
 
Аватар для Blackwind
 
Регистрация: 17.09.2009
Сообщений: 7
По умолчанию

Огромное спасибо, все отлично работает. Только несколько маленьких проблем:
1) добавилась еще одна колонка - район города (примеры файлов прилагаются);
2) столкнулся с вариантом, когда слишком много домов находятся на одной улице и имеют одинаковый индекс - значение получается слишком длинным и не помещается в одну ячейку. Даже не знаю, что делать в таком случае - править руками?
3) основная таблица (для которой и нужен макрос) больше 2600 строк - это никак не повлияет на макрос?

Еще раз - огромное спасибо за помощь.
Вложения
Тип файла: rar примеры.rar (10.7 Кб, 7 просмотров)
Blackwind вне форума Ответить с цитированием
Старый 18.09.2009, 18:05   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
1) добавилась еще одна колонка - район города (примеры файлов прилагаются)
И что из того? На работоспособности макроса ведь это не сказывается, и выборка формируется в точности такая, как в Вашем примере...



Цитата:
Даже не знаю, что делать в таком случае - править руками?
Если Вы не знаете - мне-то откуда знать?
Придумаете, что делать - попробую реализовать в виде кода.

Цитата:
основная таблица (для которой и нужен макрос) больше 2600 строк - это никак не повлияет на макрос?
Проверьте, и узнаете. Я, что ли, буду создавать огромную таблицу для проверки макроса?
2600 строк - это совсем немного. Макрос справится.
EducatedFool вне форума Ответить с цитированием
Старый 18.09.2009, 18:27   #7
Blackwind
Новичок
Джуниор
 
Аватар для Blackwind
 
Регистрация: 17.09.2009
Сообщений: 7
По умолчанию

Посылаю большую таблицу, на 10 строке создаваемой макросом таблицы начинается неразбериха.
Вложения
Тип файла: rar Пример.rar (49.9 Кб, 10 просмотров)
Blackwind вне форума Ответить с цитированием
Старый 18.09.2009, 18:33   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
на 10 строке создаваемой макросом таблицы начинается неразбериха.
Лично я никакой "неразберихи" не наблюдаю...



Неужели сложно было выложить пример с результатами работы макроса, выделить цветом "неразбериху", и подробно описать, в чём она заключается?
EducatedFool вне форума Ответить с цитированием
Старый 18.09.2009, 18:53   #9
Blackwind
Новичок
Джуниор
 
Аватар для Blackwind
 
Регистрация: 17.09.2009
Сообщений: 7
По умолчанию

Я понял, в чем дело. Все дело в автофильтрах и "примерности" моего проверочного файла. Рабочий файл еще не готов и я индексы и районы поставил "от фонаря". Поэтому автофильтр группирует дома, между которыми могут находиться сотни строк. А это нежелательно, потому как дома (пусть даже имеющие одинаковые названия улиц и индексы), но расположенные не подряд нельзя объединять в одну ячейку. Сорри, но такая вот специфика.

Прилагаю куски таблиц, такую как генерирует макрос и такую как она должна быть.

Еще раз спасибо за помощь.
Вложения
Тип файла: rar примеры.rar (25.7 Кб, 9 просмотров)
Blackwind вне форума Ответить с цитированием
Старый 18.09.2009, 19:23   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
потому как дома (пусть даже имеющие одинаковые названия улиц и индексы), но расположенные не подряд нельзя объединять в одну ячейку. Сорри, но такая вот специфика.
Сразу надо было говорить, ибо в этом случае использование в макросе автофильтра затруднительно (или вообще невозможно), а переписывать макрос "с нуля" (в связи с изменившимися условиями) у меня нет ни малейшего желания.

Возможно, другие форумчане предложат Вам более подходящий вариант решения.
Удачи!
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выполнить действие только один раз? dolphin705 Общие вопросы Delphi 5 25.08.2009 09:33
timer срабатывает только один раз! KWN, lnc Общие вопросы Delphi 1 05.03.2009 12:58
Из заданной символьной строки, выбрать те символы, которые встречаются в ней только один раз... Banny Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2008 06:15
Как высчитывать ячейку только один раз? Человек Microsoft Office Excel 2 20.12.2006 20:57
Как сделать что-бы Таймер срабатывал только один раз? Greg Компоненты Delphi 11 16.12.2006 01:25