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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2011, 21:26   #1
Wind-up Bird
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 27
По умолчанию Поиск и копирование диапазона

Здравствуйте. В написании макросов делаю первые шаги. Столкнулся с проблемой в написании скрипта:
Код:
Sub Test()


     Dim CompareRange As Range, OriginalRange As Range, x As Variant, y As Variant
    Set OriginalRange = Range([E5], Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    Set CompareRange = Workbooks("Áàçà.xlsx").Worksheets(1).Range("B2:B300")
    
    For Each x In OriginalRange.Cells
    x.Offset(0, 10) = x.Offset(0, -3)
    For Each y In CompareRange
       If x = y Then x.Offset(0, 11) = y.Offset(0, 2)
 

            
Next y
    Next x


End Sub
Поиск работает отлично находит нужные ячейки. Но не получается сделать так чтобы копировались смежные ячейки рядом с найденной
(x.Offset(0, -3),y.Offset(0,3),y.Offset(0,4), y.Offset(0,5)) на другой лист
Wind-up Bird вне форума Ответить с цитированием
Старый 16.11.2011, 23:12   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код-то исправить и ускорить не проблема, вот только не понял одного:

идёт цикл For Each y In CompareRange
если нашли совпадение - копируем данные в определённую ячейку OriginalRange
с этим всё понятно, но:
если в CompareRange найдено НЕСКОЛЬКО совпадений, то код будет записывать данные из следующих совпадений поверх уже записанных данных

Так и надо? или совпадений несколько быть не может?

строка (x.Offset(0, -3),y.Offset(0,3),y.Offset(0,4), y.Offset(0,5)) вообще не понятна...

И ещё - надо копировать ячейки вместе с форматированием, или только значения?

Попробуйте такой код (копирование вместе с форматированием ячеек):
Код:
Sub Test()
    Dim CompareRange As Range, OriginalRange As Range
    Set OriginalRange = Range([E5], Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    Set CompareRange = Workbooks("Aaca.xlsx").Worksheets(1).Range("B2:B300")

    On Error Resume Next    ' чтобы при отсутствии совпадений не вылетала ошибка
    For Each x In OriginalRange.Cells
        x.Offset(0, 10) = x.Offset(0, -3)
        
        ' производим поиск в CompareRange, от найденного значения отступаем вправо на 2 ячейки,
        ' расширяем диапазон вправо до 4 ячеек, и копируем эти 4 ячейки в строку в OriginalRange
        CompareRange.Find(x, , xlValues, xlWhole).Offset(, 2).Resize(, 4).Copy x.Offset(, 11)
    Next x
End Sub
Или такой - копируются только значения:
Код:
Sub Test()
    Dim CompareRange As Range, OriginalRange As Range, x As Range
    Set OriginalRange = Range([E5], Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    Set CompareRange = Workbooks("Aaca.xlsx").Worksheets(1).Range("B2:B300")

    On Error Resume Next    ' чтобы при отсутствии совпадений не вылетала ошибка
    For Each x In OriginalRange.Cells
        x.Offset(0, 10) = x.Offset(0, -3)

        ' производим поиск в CompareRange, от найденного значения отступаем вправо на 2 ячейки,
        ' расширяем диапазон вправо до 4 ячеек, и копируем эти 4 ячейки в строку в OriginalRange
        x.Offset(, 11).Resize(, 4).Value = CompareRange.Find(x, , xlValues, xlWhole).Offset(, 2).Resize(, 4).Value
    Next x
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 16.11.2011, 23:20   #3
Wind-up Bird
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 27
По умолчанию

Цитата:
если в CompareRange найдено НЕСКОЛЬКО совпадений, то код будет записывать данные из следующих совпадений поверх уже записанных данных

Так и надо? или совпадений несколько быть не может?
Совпадение несколько быть не может..

Цитата:
строка (x.Offset(0, -3),y.Offset(0,3),y.Offset(0,4), y.Offset(0,5)) вообще не понятна...
Это какие ячейки мне нужны. нужно скопировать определенные ячейки.
Wind-up Bird вне форума Ответить с цитированием
Старый 16.11.2011, 23:25   #4
Wind-up Bird
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 27
По умолчанию

Спасибо Получилось.
Wind-up Bird вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование выделенного диапазона 6306617 Microsoft Office Excel 7 24.03.2011 15:49
копирование выделенного диапазона после скрытия ненужных столбцов и последующей фильтрации Алабор Microsoft Office Excel 2 15.03.2011 15:31
Копирование диапазона в другую книгу в цикле Drummer_SV Microsoft Office Excel 2 22.12.2010 11:27
Копирование динамического диапазона vik85 Microsoft Office Excel 3 27.06.2010 14:40
Копирование части диапазона с шагом valerij Microsoft Office Excel 5 08.12.2009 17:53