Использование VLookup в макросе

Я новичок в VBA, но я подсел! Я создал рабочую книгу, которая отслеживает сверхурочное время в двухнедельных блоках, по одному двухнедельному блоку на лист. Макрос, который я пытаюсь отладить, предназначен для переноса любых изменений, внесенных в лист, в следующие листы. Хитрость в том, что данные в одной строке могут быть в другой строке на следующих листах, поэтому я пытаюсь использовать VLookup в макросе, чтобы сохранить его точность.

Sub CarryForward()
    Dim Answer As String
    Answer = MsgBox("This should only be used for a PERMANENT crew change." & vbNewLine & "If you are adding a new person to the list," & vbNewLine & "please use the Re-Sort function." & vbNewLine & "Do you want to continue?", vbExclamation + vbYesNo, "Caution!")
    If Answer = vbNo Then
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Dim ActiveWorksheet As String
    ActiveWorksheet = ActiveSheet.Name
        For i = (ActiveSheet.Index + 1) To Sheets("DATA").Index - 1
            For x = 5 To 25
                Dim a As String
                Dim b As String
                a = "B" & x
                b = "C" & x
                ActiveSheet.Range(b).Value = Application.WorksheetFunction.VLookup(a, Sheets(ActiveWorksheet).Range("B5:C25"), 2, False)
            Next x
            Range("A3").Select
        Next i
    Sheets(ActiveWorksheet).Select
    Application.CutCopyMode = False
    Range("A3").Select
    Application.ScreenUpdating = True
End Sub

Я уверен, что это просто синтаксическая ошибка в строке кода VLookup. Большая часть размещенной помощи приближается к тому, что я ищу, но она не дает мне возможности пройти финишную черту.

Любая помощь будет оценена!

2 ответа

Решение

Немного неясно, что вы пытаетесь сделать, но я думаю, что читать между строк

  • Вы хотите найти значение, содержащееся в ячейке с именем a?
  • и положить результат на листе индекса i?

Кроме того, есть много возможностей улучшить ваш код: см. Встроенные комментарии ниже

Sub CarryForward()
    Dim Answer As VbMsgBoxResult  ' <-- Correct Datatype
    Answer = MsgBox("This should only be used for a PERMANENT crew change." & vbNewLine & _
        "If you are adding a new person to the list," & vbNewLine & _
        "please use the Re-Sort function." & vbNewLine & _
        "Do you want to continue?", _
        vbExclamation + vbYesNo, "Caution!")
    If Answer = vbNo Then
        Exit Sub
    End If
    Application.ScreenUpdating = False
    ' Dim ActiveWorksheet As String  <-- Don't need this
    'ActiveWorksheet = ActiveSheet.Name <-- use object variables
    Dim wbActive As Workbook  ' <-- don't select, use variables for sheet objects
    Dim shActive As Worksheet
    Set wbActive = ActiveWorkbook
    Set shActive = ActiveSheet
    'Dim a As String ' <-- no point in putting these inside the loop in VBA.  And don't need these anyway
    'Dim b As String
    Dim SearchRange As Range
    Set SearchRange = shActive.Range("B5:C25") ' <-- Use variable to hold range
    Dim shDest As Worksheet
    Dim i As Long, x As Long '<-- dim all your variables
    For i = (shActive.Index + 1) To wbActive.Worksheets("DATA").Index - 1 ' <-- qualify references
        Set shDest = wbActive.Sheets(i)
        For x = 5 To 25
            'a = "B" & x <-- no need to create cell names
            'b = "C" & x
            ' I think you want to lookup the value contained in cell named by a?
            ' and put the result on sheet index i?
            '  Note: if value is not found, this will return N/A.  Add an error handler
            wbActive.Sheets(i).Cells(x, 3).Value = Application.VLookup(shActive.Cells(x, 2).Value, SearchRange, 2, False)
        Next x
        'Range("A3").Select
    Next i
    'Sheets(ActiveWorksheet).Select ,-- don't need these
    'Application.CutCopyMode = False
    'Range("A3").Select
    Application.ScreenUpdating = True
End Sub

Я подозреваю, что вы захотите заменить выражение vlookup на что-то вроде

Application.WorksheetFunction.VLookup(ActiveWorksheet.Range(a).value, ActiveWorksheet.Range("B5:C25"), 2, False)

на данный момент похоже, что вы просто делаете vlookup против некоторых строк B5, B6, B7 и т. д. вместо значений в этих ячейках

Другие вопросы по тегам