2015-10-26 3 views
1

Я немного стучал головой об этом.VBA много Vlookups на отфильтрованных ячейках

У меня есть большой макрос, который я сделал, выполняя ряд операций над файлом, но застрял в серии фильтров и vlookup.

Вот часть того, что я получил. Я добавил комментарии, чтобы сделать их более ясными.

'FILTER ALL 3P VALUES IN ONE COLUMN AND ADD A VALUE IN ALL RESPECTIVE CELLS IN OTHER COLUMN 
     Application.ScreenUpdating = False 
     With ActiveSheet.UsedRange 
     .AutoFilter Field:=22, Criteria1:="*3P*" 
     .Offset(1).Range("AU1:AU" & Cells(Rows.Count, "A").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Select 

'HERE I SELECT ALL VISIBLE FILTERED CELLS BY COUNTING IN ROW A BECAUSE THESE CELLS ARENT BLANK 
     .Selection.Value = "3P PROGRAM" 
     .AutoFilter 
     End With 

'NOW I WANT TO FILTER ROW FOR BLANKS AND THEN FILL THIS RANGE WITH A FORMULA 
'HERE IS THE PROBLEM 

     With ActiveSheet.UsedRange 
     .AutoFilter Field:=47, Criteria1:="=" 
     .Offset(1).Range("AU1:AU" & Cells(Rows.Count, "A").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Select 
     .Selection.FormulaR1C1 = "=VLOOKUP(RC[-38],'[WeeklyData.xlsx]Sheet1'!C8:C16,9,FALSE)" 
     .AutoFilter 
     End With 

Проблема находится на этапе vlookup. Я хочу, чтобы диапазон видимых фильтрованных пустых ячеек получил значение, полученное vlookup. Каждая ячейка должна брать ячейку 38 столбцов влево в качестве ссылки vlookup.

Я не могу найти способ сделать работу с формулой. Я хотел бы: -включить vlookup в этот отфильтрованный диапазон, -remove filter (Autofilter) -Выберите вычисленную колонку со смещением 1 для заголовков и паст в качестве специальных значений - продолжайте этот процесс 5, 6 раз для пустых или недопустимых записей в других столбцах.

Есть ли способ сделать это? Любая помощь с благодарностью

+0

Вопрос: Почему ваш Vlookup Table имеет ширину всего 1 колонку? Это должно было вызвать ошибку и заставить формулу работать. –

+0

@ Jess-eye-ca - Это ссылка диапазона ячеек 'xlR1C1'. На самом деле это относится к 'Sheet1 '! H: P', который имеет ширину 9 колонок. – Jeeped

ответ

0

Я предпочитаю Range.CurrentRegion property через Worksheet.UsedRange property. Он ссылается на «остров данных», созданный в точке происхождения (в данном случае A1).

With ActiveSheet 
    If .AutoFilterMode Then AutoFilterMode = False 
    With .Cells(1, 1).CurrentRegion 
     'Set the filter 
     .AutoFilter Field:=22, Criteria1:="*3P*" 
     'Shift off the header row 
     With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0) 
      'check if there are any visible cells 
      If CBool(Application.Subtotal(103, .Cells)) Then 
       'Put 3P PROGRAM into the visible cells in column AU 
       Intersect(.Columns(47), .SpecialCells(xlCellTypeVisible)) = "3P PROGRAM" 
      End If 
     End With 
     'remove the filter 
     .AutoFilter Field:=22 

     'set the formula on column AU blank cells 
     Intersect(.Columns(47), .SpecialCells(xlCellTypeBlanks)).FormulaR1C1 = _ 
      "=VLOOKUP(RC[-38], '[WeeklyData.xlsx]Sheet1'!C8:C16, 9, FALSE)" 

     'revert column AU within the .CurrentRegion to the values returned by the formulas 
     .columns(47).cells = .columns(47).cells.value 

    End With 
End With 

Второй фильтр заменяется с помощью Range.SpecialCells method с xlCellTypeBlanks property. Intersect method изолирует ссылку диапазона ячеек на пустые ячейки в столбце AU. Прежде чем запускать эту операцию, вы можете сделать чек для пустых ячеек.

+0

Спасибо Jepped, это потрясающе. Не могли бы вы добавить строку, которая в конце будет содержать всю колонку 47/или AU из под заголовком до конца данных и вставить ее как специальные значения, потому что теперь она содержит формулы vlookup. Я вложу несколько из них в свой большой макрос. Благодаря! Вы сделали его намного более элегантным и практичным. Я очень ценю комментарий, объясняющий каждую строку. Это отличный инструмент обучения. – drLecter

+0

И еще раз вы решили в одной строке, что я делаю в паре. Спасибо, помощник за этот учебный момент. Я очень ценю это. – drLecter

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