2015-08-28 4 views
0

Я новичок в VBA, и я пытаюсь вставить функцию VLOOKUP.Вставка функции в диапазон ячеек

Я получаю данные с веб-страницы и после некоторого автофильтрации и автоматического удаления данные сжимаются до меньшего размера. Но поскольку это динамические данные, последняя строка всегда изменяется.

Мои данные, как это:

A   B  C 
FleetType MSN  Registration  

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

Я попытался вставить формулу с помощью FormulaR1C1, но в итоге получить сообщение 1004. Я также пытался использовать Application.VLookup, а также получить сообщение 1004.

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

Это sub Im пытается сделать его запустить (не удалялись те, которые я пробовал):

Sub formuller() 

    Worksheets("Data").Select 
    Worksheets("Data").Activate 

    'range("A1:A600").Formula = "=IF(LEFT(D2;2)="JK";"Boeing";IF(LEFT(D2;2)="JG";"Boeing";IF(LEFT(D2;2)="JF";"Boeing";IF(LEFT(D2;2)="JH";"Boeing";IF(LEFT(D2;2)="JV";"Boeing";IF(LEFT(D2;2)="JJ";"Boeing";IF(LEFT(D2;2)="JY";"Boeing";IF(LEFT(D2;2)="LJ";"Boeing";"Airbus"))))))))" 
    On Error Resume Next 

    Range("A1:A2").FormulaR1C1 = "=IF(LEFT(RC[3];2)=""JK"";""Boeing"";IF(LEFT(RC[3];2)=""JG"";""Boeing"";IF(LEFT(RC[3];2)=""JF"";""Boeing"";IF(LEFT(RC[3];2)=""JH"";""Boeing"";IF(LEFT(RC[3];2)=""JV"";""Boeing"";IF(LEFT(RC[3];2)=""JJ"";""Boeing"";IF(LEFT(RC[3];2)=""JY"";""Boeing"";IF(LEFT(RC[3];2)=""LJ"";""Boeing"";""Airbus""))))))))" 

    On Error GoTo 0 

    'Worksheets("Data").Range("A1:A600").FormulaR1C1 = "=VLOOKUP(RC[3];Filo!R1C1:R309C3;3;FALSE)" 

Есть ли способ обойти это? Все, о чем я прошу, - это просто использовать старый добрый VLookup в проекте VBA.

+2

Измените ';' на ',' и посмотрите, работает ли оно. 'FormulaR1C1' использует запятую в качестве разделителя поля формулы, вне зависимости от вашего локального разделителя формул. – BrakNicku

+0

Спасибо, работал как шарм. –

ответ

0

Вы можете использовать WorksheetFunction.VLookup для старых добрых VLookup. Но альтернативно вы можете использовать этот макрос для своей породы. Объяснение содержится в комментариях.

Option Explicit 
Sub FindFleetType() 
    Const Boeing As String = "Boeing" 
    Const Airbus As String = "Airbus" 
    Dim MySheet As Worksheet 
    Dim MyRange, c As Range 
    Dim MyInt, LastRow As Integer 
    Dim MyStr, MyArray(7) As String 

    'filling string array 
     MyArray(0) = "JK" 
     MyArray(1) = "JG" 
     MyArray(2) = "JF" 
     MyArray(3) = "JH" 
     MyArray(4) = "JV" 
     MyArray(5) = "JJ" 
     MyArray(6) = "JY" 
     MyArray(7) = "LJ" 

    'defining worksheet 
    Set MySheet = ThisWorkbook.Worksheets("Data") 

    'finding lastrow has data on columnn C 
    'so you don't have to change the range manually every time 
    With MySheet 
     LastRow = .Range("C" & .Rows.Count).End(xlUp).Row 
    End With 

    'defining range to be filled 
    Set MyRange = ThisWorkbook.ActiveSheet.Range("A2:A" & LastRow) 

    'iterating each cell on defined range 
     For Each c In MyRange 
      MyStr = Left(c.Offset(0, 2).Value2, 2) 'get first two letters of "Registration" column C 
       'control if your array contains your string 
       If ContainString(MyStr, MyArray) Then 
        c.Value2 = Boeing 
        Else 
        c.Value2 = Airbus 
       End If 
     Next 
End Sub 
Private Function ContainString(ByVal StringToBeFound As String, StringArray As Variant) As Boolean 
    ContainString = (UBound(Filter(StringArray, StringToBeFound)) > -1) 
End Function 
Смежные вопросы