VLookup результат не отображается - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть рабочий лист, где я использовал функцию Instr, чтобы вырезать необходимый текст из строки.Теперь я пытаюсь использовать VLookup, чтобы узнать точное / фактическое имя в отношении этого текста, используя другую книгу, в которой находится моя база данных.но результат VLookup не появляется в нужном столбце.

Может кто-нибудь подсказать, какие действия необходимо предпринять для этого.Весь код указан ниже для справки.

    Dim lastrow As Long, Text As String, DESPOSITION As String, i As Integer
lastrow = x.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp).Row
For i = 2 To lastrow
    Text = Cells(i, 5).Value
    DESPOSITION = InStr(Text, "DES")
    Cells(i, 6).Value = Left(Text, DESPOSITION - 2)
Next i

Range("G2").Select
ActiveCell.FormulaR1C1 = "=TRIM(RC[-1])"
Range("G2").Select
Selection.AutoFill Destination:=Range("G2:G2000"), Type:=xlFillDefault
Range("G:G").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Application.CutCopyMode = False
Columns("G:G").Select
Selection.Cut
Range("F1").Select
ActiveSheet.Paste
ActiveWorkbook.Save

'Do VLookup to rename Customer name
Dim y As Workbook
Set y = Workbooks.Open("C:\Users\arisarka\Desktop\DATABASE\RemitterVsCustomer.xlsx")
Dim y_sheet As Worksheet
Set y_sheet = y.Sheets("Sheet1")
Dim endrow As Long
endrow = x.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp).Row

Set myrange = y_sheet.Range("A2:B86")
For ii = 2 To endrow
      Cells(ii, 7).Value = Application.WorksheetFunction.VLookup(Cells(ii, 6), myrange, 2, False)
Next ii

1 Ответ

0 голосов
/ 21 сентября 2018

Чтобы ответить на основной вопрос, я думаю, что есть проблема с не полностью определенными и / или неправильно заданными диапазонами.

При открытии рабочей книги y она становится активной рабочей книгой.В этот момент Cells(ii,7) относится к активной рабочей книге (y), поскольку она не полностью квалифицирована, я думаю, вы намереваетесь это указать в рабочей книге x, хотя:

For ii = 2 To endrow
      x.Sheets("Sheet1").Cells(ii, 7).Value = Application.WorksheetFunction.VLookup(x.Sheets("Sheet1").Cells(ii, 6), myrange, 2, False)
Next ii

Следующая проблема будетесли VLOOKUP() выдает ошибку.Вы можете решить эту проблему, поместив vlookup в отдельную функцию:

Private Function vlookup(value As Variant, rng As Range, col As Integer, mode As Boolean)
    On Error GoTo uhoh:
    vlookup = Application.WorksheetFunction.vlookup(value, rng, col, mode)
    Exit Function
uhoh:
    vlookup = ""
End Function

Затем вызовите функцию из вашего цикла, и если она не удастся, вы получите пустую строку, а не ошибку:

For ii = 2 To endrow
      x.Sheets("Sheet1").Cells(ii, 7).value = vlookup(x.Sheets("Sheet1").Cells(ii, 6), myrange, 2, False)
Next ii

Я бы также исправил несколько других вещей:

Сначала lastrow и endrow относятся к одному и тому же диапазону, и вы не изменили размер этого диапазона:

lastrow = x.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
endrow = x.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

может быть endrow должен был быть в Рабочей книге у?Если нет, то вы можете просто повторно использовать lastrow.

Я столкнулся с несколькими проблемами из-за необъявленных переменных (myRange, x), возможно, они включены в код, который вы не предоставили?Я предполагаю, что x является активной книгой.

Мне также пришлось изменить DESPOSITION на Integer.У вас есть String, но вы устанавливаете его на результат INSTR(), который имеет тип Integer.

После исправления этих незначительных проблем вы можете очистить часть кода с помощьюудаление ненужной копировальной пасты.

Здесь есть больше возможностей, но в качестве начального прохода это было бы неплохо:

Sub test()

    'DESPOSITION changed to integer
    Dim lastrow As Long, Text As String, DESPOSITION As Integer, i As Integer

    'I added these, you may already have them in code you didnt share:
    Dim x As Workbook
    Set x = ThisWorkbook

    lastrow = x.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

    'Just put the value you want directly into Column F, deprecate all the copy/paste stuff.
    For i = 2 To lastrow
        Text = x.Sheets("Sheet1").Cells(i, 5).value
        DESPOSITION = InStr(Text, "DES")
        x.Sheets("Sheet1").Cells(i, 6).value = Application.WorksheetFunction.Trim(Left(Text, DESPOSITION - 2))
    Next i

    x.Save

    'Do VLookup to rename Customer name
    Dim y As Workbook
    Set y = Workbooks.Open("C:\Users\arisarka\Desktop\DATABASE\RemitterVsCustomer.xlsx")

    For i = 2 To lastrow
        With x.Sheets("Sheet1")
          .Cells(i, 7).value = vlookup(.Cells(i, 6), y.Sheets("Sheet1").Range("A:B"), 2, False)
        End With
    Next i

End Sub

Private Function vlookup(value As Variant, rng As Range, col As Integer, mode As Boolean)
    On Error GoTo uhoh:
    vlookup = Application.WorksheetFunction.vlookup(value, rng, col, mode)
    Exit Function
uhoh:
    vlookup = ""
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...