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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2019, 10:45   #1
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию Поиск, смещение и замена данных

Добрый день!

Пытаюсь понять, куда встроить функцию OffSet.

Хотел получить следующий результат: на листе "критерии" есть две колонки - с поисковым образом и со значениями, которые надо заменить (перенести) на всех листах книги (исключая лист с критериями).

Проблема в том, что это не просто замена одного значения на другое, а надо сначала надо найти ячейку, содержащую поисковый образ, потом сместиться на несколько ячеек вправо и произвести перенос в ячейку значения с листа "критерии".

Пока не преуспел в данной задаче.

Подскажите, пожалуйста, как будет правильно.

Спасибо.
Вложения
Тип файла: rar пример поиска и замены.rar (15.6 Кб, 6 просмотров)
Обыватель вне форума Ответить с цитированием
Старый 04.04.2019, 11:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я не мастер, но попробуйте такой код:
Код:
Sub FindAndExecute()

Dim Sh As Worksheet
Dim Loc As Range
Dim myList As Range, CriteriaCell As Range, iCritRow As Long
Dim sFirstAddress

iCritRow = Sheets("критерии").Cells(Sheets("критерии").Rows.Count, "A").End(xlUp).Row
Set myList = Sheets("критерии").Range("A2:A" & iCritRow)

For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "критерии" Then
      For Each CriteriaCell In myList
        With Sh.UsedRange
            Set Loc = .Cells.Find(What:=CriteriaCell.Value)
            If Not Loc Is Nothing Then
                sFirstAddress = Loc.Address
                Do
                    Loc.Offset(0, 2).Value = CriteriaCell.Offset(0, 1).Value ' заменить значение
                    Set Loc = .FindNext(Loc) ' продолжить поиск
                Loop While Not Loc Is Nothing And Loc.Address <> sFirstAddress
            End If
        End With
        Set Loc = Nothing
      Next ' конец цикла по критериям
    End If ' конец обработки условия лист <> "критерии"
Next


End Sub
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2019, 12:58   #3
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Что-то Вы явно поскромничали... работает и очень хорошо работает.
Даже на 80% разобрался в коде.

Благодарю!
Обыватель вне форума Ответить с цитированием
Старый 04.04.2019, 13:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Обыватель Посмотреть сообщение
Что-то Вы явно поскромничали... работает и очень хорошо работает.
да работает то оно работает.
Но я уверен, что профи мог бы весь этот код забабахать в пару команд, упразднив пару циклов.


Цитата:
Сообщение от Обыватель Посмотреть сообщение
Даже на 80% разобрался в коде.
да, побочный эффект от моей малограмотности - это то, что код легко читается и понимается!
а что скрылось в эти непонятые 20% ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2019, 15:47   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Обыватель, откройте для себя функцию ВПР: в ячейке С2 любого листа введите
Код:
=ВПР(A2;критерии!A:B;2;)
и автозаполните вниз.
То же самое можно сделать макросом.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 04.04.2019, 16:58   #6
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Обыватель, откройте для себя функцию ВПР: в ячейке С2 любого листа введите
Код:
=ВПР(A2;критерии!A:B;2;)
и автозаполните вниз.
То же самое можно сделать макросом.
Как раз с формулами у меня проблем нет в любом сочетании, но не все задачи ими решаются.
Проблема была в том, как на 150 листах занести эту формулу в строго определенные ячейки.

С уважением
Обыватель вне форума Ответить с цитированием
Старый 04.04.2019, 17:02   #7
Обыватель
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 98
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да работает то оно работает.
Но я уверен, что профи мог бы весь этот код забабахать в пару команд, упразднив пару циклов.



да, побочный эффект от моей малограмотности - это то, что код легко читается и понимается!
а что скрылось в эти непонятые 20% ?
Главное результат ))

Вот тут я подвис. Просто для меня сложноватый подход.

"Set Loc = .Cells.Find(What:=CriteriaCell.Valu e)
If Not Loc Is Nothing Then
sFirstAddress = Loc.Address
Do
Loc.Offset(0, 2).Value = CriteriaCell.Offset(0, 1).Value"
Обыватель вне форума Ответить с цитированием
Старый 04.04.2019, 17:46   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
откройте для себя функцию ВПР
кстати, у меня, когда писал код с циклами поиска и замены, была мысль вместо Value просто вставлять формулу с ВПР()
на мой взгляд - это и есть правильное решение:
1) это можно делать там, где нужно (не привязываясь к смещению)
2) это может делать сам пользователь, менять макрос для этого не надо
3) и, самое главное, получается "живая" связь - если поменять значение на странице "критерии", то автоматически везде поменяется нужное значение в ячейках, где вставлена формула с ВПР()
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2019, 17:54   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Set Loc = .Cells.Find(What:=CriteriaCell.Value) 
в Loc поместили результаты поиска на листе по значению из CriteriaCell.Value 

            If Not Loc Is Nothing Then

если что-то нашлось (результат поиска не равен Nothing ), тогда


                sFirstAddress = Loc.Address
 
Запомним адрес найденной ячейки (поиск так сделан, что если его продолжить 
командой FindNext(Loc), то, дойдя до конца листа, он снова начинает искать опять с начала листа,
и находит опять первую ячейку.
Вот, чтобы избежать зацикливания, запоминаем адрес первой найденной ячейки
и в условиях цикла проверяем, чтобы очередной найденный адрес не был равен адресу первой найденной ячейки
см. условие And Loc.Address <> sFirstAddress

                Do
начать цикл

                    Loc.Offset(0, 2).Value = CriteriaCell.Offset(0, 1).Value

по смещению на два столбца от найденной ячейки записать значение ячейки, 
расположенной на один столбец правее критерия
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2019, 18:10   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от Обыватель Посмотреть сообщение
как на 150 листах занести эту формулу в строго определенные ячейки
Если листы имеют одинаковую структуру, как в примере, то так
Код:
Sub FindAndExecute1()
Dim Sh As Worksheet
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "критерии" Then
      With Sh.Range("C2:C" & Sh.Cells(Rows.Count, 1).End(xlUp).Row) 'конец диапазона определяется по первому столбцу
        .Formula = "=VLOOKUP(A2,критерии!A:B,2,)"
        .Value = .Value 'заменить формулы на значения, необязательно
      End With
    End If
  Next
End Sub
Если на разных листах таблица начинается не с А1, можно определить критерий начала таблицы, определить диапазон для вставки формулы и работать с ним.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена II4eJI Microsoft Office Excel 2 09.01.2015 01:27
Относительное смещение данных Debris Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 07.01.2015 21:13
поиск и замена evdss Microsoft Office Excel 7 18.03.2011 02:05
поиск и замена gabbachild Microsoft Office Excel 4 26.01.2010 17:16
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52