2015-06-17 2 views
1

Я выполняю работу для клиента, где они получают еженедельный отчет клиентов и регионов (два столбца, для клиента & B для региона, на листе) , * Я пропустил другие столбцы в этой таблице ради ясностиINDEX MATCH VBA (возвращает значение, основанное на двух критериях)

Они должны соответствовать цене в этой таблице со справочной электронной таблицей, которую мы будем называть ценами. Каждая комбинация клиентов и регионов дает определенную цену, которая хранится в вышеупомянутой справочной таблице (на этом справочном листе [Цены], Столбец А является клиентом, Столбец B является регионом, Столбец C - цена для клиента A в регионе B) ,

То, что я пытаюсь сделать, это:

на основе А1 (заказчик) и B1 (регион), C1 должна быть (lookupvalue для цены на опорном листе).

Традиционная функция vlookup не будет работать, потому что необходимо выполнить несколько критериев (например, у нас могут быть разные цены для одного и того же клиента в другом регионе).

Я пробовал ниже, но безуспешно

Dim ULastRow As Long 
ActiveWorkbook.Worksheets(ActiveSheet.Name).UsedRange 
ULastRow = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row 

Range("C2").FormulaR1C1 = _ 
"=Index(Range("C:C"), Match(Range("Prices!C1"), Range("Prices!C2:B34"), 0), 0)" 
Selection.AutoFill Destination:=Range("C2:C2" & ULastRow) 

Смотрите ссылки ниже для примера данных (К сожалению, я не смог добавить их в линию:

Что клиент получает: https://copy.com/EBABGl2EFjyFWcIH

В «Цены» или справочные данные https://copy.com/oSSJuu7Dk4ox84tz

Любые советы будут оценены.

Заранее благодарим!

+0

Могу ли я понимать это правильно ?: У вас есть рабочий лист столбцы A, B и C и их соответствующую информацию. И вы хотите выбрать значение C на основе A и B? – daZza

+0

Зачем вам нужен VBA, а не только некоторые функции поиска в Excel? – vacip

+0

Вы можете ввести формулу массива с индексом/соответствием для поиска по нескольким критериям. Это будет формула, которую вы можете перевести в VBA. Я собираюсь просто сделать это и сказать, что вы пытаетесь вернуть что-то в столбце F: '= index (F: F, match (A1 & B1, CustomerRange & RegionRange, 0))' и введите с помощью CTRL + SHIFT + ENTER – BruceWayne

ответ

1

Imho это классический случай использования базы данных вместо Excel, особенно если вы хотите регулярно выполнять такие запросы.

Однако, что-то вроде этого должно добиться того, что вы хотите в VBA:

Dim customer As String 
Dim region As String 
Dim price as Double 

For r = 2 To ThisWorkbook.Worksheets("Client").UsedRange.Rows.Count 

     customer = ThisWorkbook.Worksheets("Client").Cells(r, 1).Value 
     region = ThisWorkbook.Worksheets("Client").Cells(r, 2).Value 
     price = 0.00 

    For s = 2 To ThisWorkbook.Worksheets("Prices").UsedRange.Rows.Count 


     If ThisWorkbook.Worksheets("Prices").Cells(s, 1).Value = customer And ThisWorkbook.Worksheets("Prices").Cells(s, 2).Value = region Then 

      price = ThisWorkbook.Worksheets("Prices").Cells(s, 3).Value 
      Exit For 

     End If 

    Next 

     If price = 0.00 Then 
      ThisWorkbook.Worksheets("Client").Cells(r, 3).Value = "This customer/region combination is not stored in the reference sheet" 
     Else 
      ThisWorkbook.Worksheets("Client").Cells(r, 3).Value = price 
     End If 
Next 

Изменение рабочего листа и начальную строку (г) соответственно

+0

Спасибо @daZza. Я получаю сообщение об ошибке: Ошибка компиляции: для уже используемой переменной управления. Если я удалю второй оператор for, я получаю сообщение об ошибке: «Ошибка времени выполнения« 9 »:« Подстрочный код вне диапазона »для« Для r = 2 »В« ThisWorkbook.Worksheets »(« Клиент »). Используется Range.Rows.Count'. Какие-либо предложения? – aLearningLady

+0

Угадайте, что вы скопировали мое утверждение слишком быстро: P Случайно не изменил переменную счетчика после копирования предложения for. Это должно быть исправлено немедленно. Ошибка за пределами диапазона: я уверен, что есть строки с «невидимым контентом» ниже фактических данных. Это недостаток в использовании довольно простой 'UsedRange.Rows.Count'. Попробуйте вручную выбрать несколько строк ниже строки, где заканчиваются фактические данные, а затем щелкните правой кнопкой мыши и удалите строки. Это также может быть вызвано неверными именами листов (вы изменили их на свои фактические? Вместо них вы можете использовать цифры) – daZza

+0

Большое вам спасибо! Я получил ошибку вне диапазона, используя другой метод получения последней строки: 'Dim LastRow As Long Set sht = ActiveWorkbook.Worksheets (ActiveSheet.Name) ActiveWorkbook.Worksheets (ActiveSheet.Name) .UsedRange LastRow = sht.Cells (sht.Rows.Count, «A»). End (xlUp) .Row' и изменение 'ThisWorkbook' в' ActiveWorkbook'. – aLearningLady

Смежные вопросы