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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 10:38   #1
orlovya
Новичок
Джуниор
 
Регистрация: 31.10.2010
Сообщений: 4
По умолчанию макрос для таблицы

Добрый день,товарищи.Встала задача.
есть лист экселя с таблицой вида
___________
номер|улица|
-------------
18311 |адрес1
23321 |адрес2
18311 |
данные в таблице повторяются.Необходимо заполнить все строки адрес - улица соответственно. В примере у нас первая строка имеет номер 18311 и адрес 1. Третья строка имее тот же номер,но значение адреса не имеет(ячейка пустая). Необходимо заполнить все строки с одинаковыми номерами в ячейках соответствующими значениями адреса.Как это реализовать в VB?
orlovya вне форума Ответить с цитированием
Старый 31.10.2010, 11:33   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Как это реализовать в VB?
Прикрепить пример файла для проверки будущего макроса
Номера и названия дайте как в оригинале
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 31.10.2010, 11:35   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Попробуйте такой вариант:



Вот весь макрос:

Код:
Sub test()
    Dim cell As Range, ra As Range: Application.ScreenUpdating = False
    Dim coll As New Collection: On Error Resume Next
    Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))
    
    For Each cell In ra.Cells
        If Len(cell.Next) > 0 Then coll.Add Trim(cell.Next), CStr(cell)
    Next cell
    
    For Each cell In ra.Cells
        If Len(cell.Next) = 0 And Len(cell) > 0 Then cell.Next = coll(CStr(cell))
    Next cell
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 01.11.2010, 17:07   #4
orlovya
Новичок
Джуниор
 
Регистрация: 31.10.2010
Сообщений: 4
По умолчанию

Вот образец файла,неудобно конечно просить сделать за меня,но времени на изучение просто нет.Если вам не трудно,буду очень благодарен.
Смысл в том,что в файле очень много строк. Данные в строке индекс(номера) повторяются на протяжении всего файла.Необходимо заполнить ячейку справа от индекса значением адреса.Значение адреса ранее уже сопоставлено с индексом.Т.е скопировать значение адреса во все ячейки с таким же индексом.
Вложения
Тип файла: rar Образец.rar (20.7 Кб, 15 просмотров)
orlovya вне форума Ответить с цитированием
Старый 01.11.2010, 17:10   #5
orlovya
Новичок
Джуниор
 
Регистрация: 31.10.2010
Сообщений: 4
По умолчанию

макрос,предложенный EducatedFool работает,но только для примера который приводил выше.Если вы немного прольете свет на логику программного кода,то я попробую доделать его самостоятельно.
orlovya вне форума Ответить с цитированием
Старый 01.11.2010, 19:32   #6
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Цитата:
Значение адреса ранее уже сопоставлено с индексом
Даже в коротком вашем примере индексу 18403 Записаны разные адреса. Брать первый?
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 01.11.2010, 19:38   #7
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Ещё вариант:
Код:
Public Sub ZAP()
    Dim i, K
    Dim Dict As Object
 K = Columns(1).Rows(65536).End(xlUp).Row
Set Dict = CreateObject("Scripting.Dictionary")
With Dict
    For i = 2 To K
        If Not .Exists(Cells(i, 6).Value) And Cells(i, 7) <> Empty Then
          .Add Cells(i, 6).Value, Cells(i, 7).Value
       ElseIf .Exists(Cells(i, 6).Value) And Cells(i, 7) = Empty Then
         Cells(i, 7).Value = .Item(Cells(i, 6).Value)
        End If
    Next i
End With
End Sub
Если строк очень много и заметна малая скорость обработки - можно впихнуть всё в массив, обработать и вывалить на лист уже готовый вариант
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 01.11.2010, 20:26   #8
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Через массив будет работать значительно быстрей
Код:
Public Sub ZAP()
Dim M()
    Dim i, K
    Dim Dict As Object
 K = Columns(1).Rows(65536).End(xlUp).Row
 M = Range(Cells(2, 6), Cells(K, 7)).Value
 
Set Dict = CreateObject("Scripting.Dictionary")
With Dict
    For i = 1 To K - 1
       If Not .Exists(M(i, 1)) And M(i, 2) <> Empty Then
          .Add M(i, 1), M(i, 2)
       ElseIf .Exists(M(i, 1)) And M(i, 2) = Empty Then
         M(i, 2) = .Item(M(i, 1))
        End If
    Next i
End With
Range(Cells(2, 6), Cells(K, 7)).Value = M
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 01.11.2010, 21:05   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Код с комментариями:

Код:
Sub test()
    Dim cell As Range, ra As Range
    Dim coll As New Collection    ' создаём новую (пустую) коллекцию для пар АДРЕС - ИНДЕКС
    On Error Resume Next    ' не останавливаемся при ошибках (повторных индексах)
    Application.ScreenUpdating = False    ' отключаем перерисовку экрана

    ' диапазон для обработки - с ячейки A2 до последней заполненной в столбце А
    Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))
    ' перебираем все ячейки в диапазон RA, преобразовывая их в нормальные даты
    For Each cell In ra.Cells
        cell.NumberFormat = "m/d/yyyy h:mm"    ' меняем формат ячейки
        cell = CDate(Replace(cell, ",", "."))    ' меняем запятые на точки
    Next cell

    Set ra = ra.Offset(, 5)    ' смещаем диапазон RA на 5 столбцов вправо
    ' теперь он ссылается на ячейки столбца F (где у нас индексы)

    For Each cell In ra.Cells    ' перебираем все ячейки в диапазон RA (индексы)
        ' если ячейка справа (АДРЕС) непустая (длина текста больше нуля)
        ' то добавляем в коллекцию набор АДРЕС - ИНДЕКС
        If Len(cell.Next) > 0 Then coll.Add Trim(cell.Next), CStr(cell)
    Next cell

    ' итак, для всех адресов мы запомнили индексы
    ' теперь пишем адреса там, где их нет
    For Each cell In ra.Cells    ' перебираем все ячейки в диапазон RA (индексы)
        ' если ячейка справа (АДРЕС) ПУСТАЯ (длина текста равна нулю)
        ' то вылучаем из коллекции соответствующий данному индексу адрес
        If Len(cell.Next) = 0 And Len(cell) > 0 Then cell.Next = coll(CStr(cell))
    Next cell
End Sub
Пример в файле: http://excelvba.ru/XL_Files/Sample__...__23-05-14.zip
EducatedFool вне форума Ответить с цитированием
Старый 01.11.2010, 21:41   #10
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

EducatedFool, давно хотел заметить по поводу часто употребляемой вами
конструкции вида
Код:
 Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))
В общем случае (а точнее когда последней заполненной строкой в таблице
будет строка Rows.Count ) она к сожалению неверна.
К своему удивлению, за последний месяц трижды столкнулся у разных клиентов
с данными в 65536 строке в Excel 2003...
Особенно это характерно для обработчиков всяческих реестров.
Часто люди переносят лист из Excel 2007-2010 в Excel 2003 c разбивкой по листам 2003 с учётом
ограничения на максимальное число строк.
Теперь после получения индекса строки по .End(xlUp).Row всегда проверяю, что
нижележащая ячейка пустая

Последний раз редактировалось Aent; 01.11.2010 в 21:45.
Aent вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для конвертации таблицы Excel Yarr Microsoft Office Excel 1 13.08.2010 10:47
Макрос для формирования таблицы в Excel konistra Microsoft Office Excel 6 28.05.2010 23:32
Макрос для сводной таблицы kipish_lp Microsoft Office Excel 2 21.04.2010 10:58
макрос для заполнения таблицы ruavia3 Microsoft Office Excel 4 09.09.2009 15:11
Макрос для таблицы Radagest Microsoft Office Excel 3 17.07.2009 20:58