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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 11:35   #1
Propinol
Новичок
Джуниор
 
Регистрация: 26.05.2010
Сообщений: 2
По умолчанию поиск по диапазону и подстановка значения в зависимости от результата

яблоко | | яблоко | ID1
яблоко | | груша | ID2
яблоко | | слива | ID3
Груша | | абрикос | ID4
Груша | |
Слива | |
Абрикос | |

имеется примерно вот такого вида табличка.

задача состоит в том, чтобы ID объектов (яблоки, груши и т.п.), которые обозначены в 4-м столбце подставить во второй собственно в соответствии с 1м столбцом.


моя идея заключается в следующем макросе (правда это только самое начало), который проходит от первой ячейке к последней, и последовательно сравнивает. но он срабатывает только на 1ю ячейку (что и понятно, только там соответствие), так вот затык в том: как сделать так чтобы при проходе он делал поиск по всему столбцу C и при нахождении вставлял в столбец B айдишник в соответствии со столбцом D

что написал вот (в VBA пока новичок совсем):

Код:
 Sub Test1()
     
    Range("A2").Select
     
      Do Until IsEmpty(ActiveCell)
        
         If ActiveCell.Value = ActiveCell.Offset(0, 2) Then

Range("B2") = Range("D2")

         Else
      
End If
         
         ActiveCell.Offset(1, 0).Select
      Loop
   End Sub
Propinol вне форума Ответить с цитированием
Старый 26.05.2010, 12:32   #2
alebed
Пользователь
 
Аватар для alebed
 
Регистрация: 26.05.2010
Сообщений: 77
По умолчанию Ваш вариант работать будет но немного долго

Предлагаю поступить так:
Примерно так выглядит таблица в Excel
кол A| кол B| кол C| кол D
1| яблоко | | яблоко | |ID1
2| яблоко | | груша | | ID2
3| яблоко | | слива | |ID3
4| Груша | | абрикос | |ID4
5| Груша | |
6| Слива | |
7| Абрикос| |

Дале сам макрос:
Sub Найти_совпадения()
Dim x As Variant, y As Variant SravnenyeDiap As Variant
Range("A1:A7").Select ' Выделяем диапазон для сравнения
' Назначаем переменной SravnenyeDiap диапазон, с которым нужно сравнить выделенный диапазон.
Set SravnenyeDiap = Range("C1:C5")
' Каждую выделенную ячейку сравниваем с каждой ячейкой из диапазона SravnenyeDiap.
For Each x In Selection
For Each y In SravnenyeDiap
If x = y Then x.Offset(0, 1) = y.Offset(0, 1) ' Устанавливаем значения ID
Next y
Next x
End Sub
Спасибо и Пасибы принимаются на WebMoney в американских Z143254902288 или русских R388611339241 монетах
alebed вне форума Ответить с цитированием
Старый 26.05.2010, 13:23   #3
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

или так:
Код:
Sub Start()  'Пробная процедура'
    Dim a As Range
    Set a = Range("A1:A7") 'Обрабатываемый диапазон'
    Call SearchID(a)
End Sub

Sub SearchID(diap As Range)
    Dim BaseDiap As Range, x As Range, c As Range
    
    Set BaseDiap = Range("C1:C4")  'Диапазон с исходными данными'
    For Each x In diap
        Set c = BaseDiap.Find(What:=x.Value, LookIn:=xlValues)
        If Not (c Is Nothing) Then
            'Если что-то нашли, то копируем значение из соседнего столбца'
            Cells(x.Row, x.Column + 1).Value = Cells(c.Row, c.Column + 1).Value
        End If
    Next x
End Sub
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 26.05.2010, 13:45   #4
Propinol
Новичок
Джуниор
 
Регистрация: 26.05.2010
Сообщений: 2
По умолчанию

Спасибо огромное, очень помогло
Propinol вне форума Ответить с цитированием
Старый 06.12.2011, 16:45   #5
Bumek
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 11
По умолчанию

Подскажите пожалуйста, как адаптировать этот код для проверки диапазонов двух листов, внутри одной книги, и чтобы макрос копировал значения не одной ячейки, а нескольких ячеек, указанных через запятую. Я VBA незнаю совсем, поэтому ищу инфу везде. Неоставьте мой вопрос без внимания, заранее спасибо
Bumek вне форума Ответить с цитированием
Старый 06.12.2011, 17:48   #6
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> Не оставьте мой вопрос без внимания
Трудно это сделать - нет примера.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.12.2011, 17:56   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Аналогично.
внимание уделил. помочь ничем не могу, я знаю VBA, но не знаю какие диапазоны проверять, на предмет чего их проверять, какие ячейки копировать...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 06.12.2011, 21:41   #8
Bumek
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 11
По умолчанию

Прикрепил файл, формата XLSM (офис 2007, файл с поддержкой макросов). В книге есть минимум 2 листа, в одном производится расчет, в другом данные. Поиск происходит по гар.№, и если номер в листе ак4 и ТЭП_ак4 совпадает, то макрос должен скопировать значения из ТЭПа(желтые колонки) в ак4(синие колонки). Не могу настроить чтобы макрос цеплялся за диапазон другого листа, и чтобы значения сразу нескольких ячеек копировал.... В идеал еще должен быть второй макрос, который будет проверять гаражные номера на обоих листах, и если какой-то из номеров есть в тэп но нет в ак4, он должен меня оповестить каким-то образом, либо вывести отдельно на лист перечень гаражный, либо во всплывающем окне ошибки указать "Гар № 1234 отсутствует"
Вложения
Тип файла: rar ак4.rar (78.4 Кб, 24 просмотров)

Последний раз редактировалось Bumek; 06.12.2011 в 21:44.
Bumek вне форума Ответить с цитированием
Старый 07.12.2011, 17:15   #9
Bumek
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 11
По умолчанию

Сегодня нашел на работе неточность в коде... если в обрабатываемом диапазоне находится 40, а в диапазоне с исходными данными 4055, то значение от 4055, он скопирует к 40...Как заменить строку
Код:
Set c = BaseDiap.Find(What:=x.Value, LookIn:=xlValues)
чтобы макрос копировал значения только при полном соответствии ячеек
Bumek вне форума Ответить с цитированием
Старый 07.12.2011, 17:21   #10
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Попробуйте так
Код:
Set c = BaseDiap.Find(What:=x.Value, LookIn:=xlValues, LookAt:=xlWhole)
nilem вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В зависимости от значения в ComboBox1 выводить значения в ComboBox2 LeX2009 БД в Delphi 14 21.05.2010 16:49
Подстановка значения переменной как поле записи Noktikus Общие вопросы Delphi 2 17.04.2010 18:01
Автоматическая подстановка значения. Baloo007 Microsoft Office Excel 2 08.07.2009 10:37
Подстановка значения в переменную из текстового файла. Niodar Общие вопросы Delphi 2 22.03.2009 19:34
Автоматическая подстановка последнего значения d_yure Microsoft Office Excel 9 28.12.2007 08:30