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

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

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

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

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

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

Добрый день. Я столкнулась с макросами в excel впервые. Помогите пжлста. Мне нужно с помощью макроса организовать поиск, если первичный ключ составной, т.е. по двум колонкам (колонка A - номер id, колонка B - филиал). И скопировать значения для соответствующего id и филиала на другой лист. Чтобы было понятнее, прикладываю файл: на листе "Итог" для всех компаний по номеру и филиалу надо найти такие же компании на листе "Обороты" и "Ф1". И скопировать соответствующие значения из листа "Обороты" на лист "Итог" в колонки D и E. Аналогично с листом "Ф1", только здесь надо скопировать со строки 23 "итог по разделу 2" значение для соответствующей компании. Спасибо за помощь.
Вложения
Тип файла: rar Итог_отчет риски.rar (340.0 Кб, 18 просмотров)
robbe вне форума Ответить с цитированием
Старый 12.01.2010, 13:16   #2
robbe
Пользователь
 
Регистрация: 12.01.2010
Сообщений: 28
По умолчанию

уважаемые программисты,
помогите, пожалуйста, понять, как сделать правильно.
В моем макросе

Sub Copy_data_from_oborot()

Dim n, m, k, g, h As Integer
Dim sl, sll As String
n = Sheets("Итог").UsedRange.Rows.Count
m = Sheets("обороты").UsedRange.Rows.Co unt

h = 0

For g = 4 To n
sl = Replace(Sheets("Итог").Cells(g, 1) & Sheets("Итог").Cells(g, 2), " ", "")
For k = 2 To m
sll = Replace(Sheets("обороты").Cells(k, 1) & Sheets("обороты").Cells(k, 2), " ", "")

If sl = sll Then
Sheets("Итог").Cells(4 + h, 4) = Sheets("обороты").Cells(k, 6)
Sheets("Итог").Cells(4 + h, 5) = Sheets("обороты").Cells(k, 5)

h = h + 1

Exit For

End If

Next

Next

End Sub

значения на лист Итог подставляются подряд (h = h + 1) и возникает ситуация, что если соответствующей компании не найдено на листе "обороты", данные копируются уже не правильно (смещаясь). Пробовала связать и с именем, но проблема все равно возникает если нет вообще нужной строки на листе Обороты. Как можно исправить эту проблему?
Буду очень признательна за любую помощь. Я впервые столкнулась с vba.
robbe вне форума Ответить с цитированием
Старый 12.01.2010, 13:42   #3
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Код:
Sub Poisk()
Dim ra As Range
   Application.ScreenUpdating = False

   Dim cell As Range
    Set ra = Sheets("Итог").Range("a4:a" & Cells(Rows.Count, "A").End(xlUp).Row)
   For Each cell In ra.Cells
       
        If IsNumeric(cell.Value) Then
          
            Set f = Sheets("обороты").Columns("A").Find(cell.Value)
            If Not f Is Nothing Then
          
             If f.Offset(0, 1).Value = cell.Offset(0, 1).Value Then
           cell.Offset(0, 3).Value = f.Offset(0, 4).Value
            cell.Offset(0, 4).Value = f.Offset(0, 5).Value
          
               End If: End If: End If
      
  For i = 3 To Sheets("ф1").Range("iv2").End(xlToLeft).Column
   
   If Sheets("ф1").Cells(3, i).Value = cell.Offset(0, 1).Value And _
   Sheets("ф1").Cells(2, i).Value = cell.Value Then
  
         cell.Offset(0, 5).Value = Sheets("ф1").Cells(23, i).Value
        
       End If: Next
     
    Next cell
  Application.ScreenUpdating = True
    

End Sub
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 12.01.2010 в 14:32.
doober вне форума Ответить с цитированием
Старый 12.01.2010, 16:58   #4
robbe
Пользователь
 
Регистрация: 12.01.2010
Сообщений: 28
По умолчанию

doober, спасибо огромное.
но почему-то для двух компаний данные не копируются на "итог", если в "оборотах" они есть: 1270 мск ООО "..." (значения на листе "Обороты" 5643*442,63 5705*753,42)
и 1274 мск ООО "компания "..." (значения на листе "Обороты" 31553 835,60 34255 678,17).

В чем может быть причина?
Огромное-огромное тебе спасибо за код!!!

Последний раз редактировалось EducatedFool; 25.01.2010 в 16:13.
robbe вне форума Ответить с цитированием
Старый 12.01.2010, 18:00   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Не знаю как у Вас но в файле нет таких на листе обороты
после 1250 идет 1436

Список отсортировал предварительно,чудес не бывает
Анализ,обработка данных Недорого

Последний раз редактировалось EducatedFool; 25.01.2010 в 16:14.
doober вне форума Ответить с цитированием
Старый 13.01.2010, 04:57   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Позволю себе небольшое замечание (уточнение).
Если ID уникальны, то зачем проверять соответствие по филиалу? А если один и тот же ID может быть в разных филиалах, то предложенный код от doober будет (может) пропускать совпадения, т.к. поиск осуществляется только до 1-го совпадения.
В зависимости от ответа автора темы на этот вопрос, можно либо упростить код, либо потребуется его доработка.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 13.01.2010, 09:35   #7
robbe
Пользователь
 
Регистрация: 12.01.2010
Сообщений: 28
По умолчанию

Цитата:
Не знаю как у Вас но в файле нет таких на листе обороты после

1250 идет 1436

Список отсортировал предварительно,чудес не бывает
doober, прошу прощения. Я сама сразу не заметила, только сделав сортировку. Видимо они не находятся, потому что в id некоторые значения числа, а некоторые ексель воспринимает как текст (на "оборотах" в начале числа стоит апостроф).

Цитата:
Если ID уникальны, то зачем проверять соответствие по филиалу? А если один и тот же ID может быть в разных филиалах, то предложенный код от doober будет (может) пропускать совпадения, т.к. поиск осуществляется только до 1-го совпадения.
В зависимости от ответа автора темы на этот вопрос, можно либо упростить код, либо потребуется его доработка.
SAS888, ID не уникальны, они могут повторяться. Уникальна пара ID+филиал. А что именно нужно дописать в коде, чтобы поиск осуществлялся не до первого совпадения по id? Спасибо за замечание.
robbe вне форума Ответить с цитированием
Старый 13.01.2010, 09:53   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Я не могу править код doober. Это его ителлектуальная собственность. Могу сделать по-своему.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 13.01.2010, 10:17   #9
robbe
Пользователь
 
Регистрация: 12.01.2010
Сообщений: 28
По умолчанию

SAS888, буду очень признательна!
robbe вне форума Ответить с цитированием
Старый 13.01.2010, 10:19   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите пример во вложении.
Кстати, поиск не зависит от того, в каком формате данные (текст или число).
Вложения
Тип файла: rar Итог_отчет риски_2.rar (343.5 Кб, 27 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 14.01.2010 в 04:37.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход от ссылок к значениям! mephist Microsoft Office Excel 5 10.07.2009 16:01
Запрос к двум базам данных в Delphi 6 Demonk БД в Delphi 8 29.06.2009 12:48
суммирование данных по двум критериям misht Microsoft Office Excel 10 31.03.2009 12:58
Сортировка одной БД по значениям другой Кот из Лета БД в Delphi 4 28.12.2007 13:35
Нарисовать Ellipse по значениям из... Apollo_13 Общие вопросы Delphi 3 17.06.2007 02:53