Активный макрос VBA, выполняющий vlookup на отдельном листе в книге - PullRequest
0 голосов
/ 25 апреля 2019

Меня попросили сделать это специально не на самом листе внутри ячейки.

Мне нужен постоянно работающий макрос, чтобы при помещении идентификационного номера в ячейку D9 на листе 1 различные другие ячейки на листе 1 заполнялись точками данных в таблице на листе 2.

У меня есть следующее:

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

Пробовал настраивать его на общие и другие вещи. очень плохо знаком с VBA извините

Private Sub Worksheet_Change(byVal Target As Range)
Dim ID As String
Dim LookupRange As Range
Set LookupRange = Sheet3.Range("A13:AN200")
Dim DataValue As String

If Sheets("Template").Range("D9").Value <> "" Then
     ID = Sheets("Template").Range("D9")
     DataValue = Application.WorksheetFunction.Vlookup(ID, LookupRange, 3, False)
     Range("D11").Value = DataValue

End if
End

1 Ответ

0 голосов
/ 26 апреля 2019

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

Отказ от ответственности: Это не проверено.Таким образом, вы захотите проверить это, прежде чем использовать его.


    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim wb As Workbook
        Dim ws As Worksheet
        Dim ws3 As Worksheet
        Dim wsName As String
        Dim IDRange As String
        Dim ResultRange As String
        Dim vLookUpRange As String
        Dim ID As String
        Dim LookupRange As Range
        Dim DataValue As String

        wsName = "Template"

        IDRange = "D9"
        ResultRange = "D11"
        vLookUpRange = "A13:AN200"

        'This is just a habbit of mine, I always set sheets to their own variables.
        'It is just easier for me to work with
        Set wb = ActiveWorkbook
        Set ws = wb.Worksheets(wsName)
        Set ws3 = wb.Worksheets(3)

        'This line (moved from below Dim) was not writen correctly. it is not Sheet3 but sheets(3) As you can see I moved
        'the sheet definition to above. (Again a habbit of mine)
        Set LookupRange = ws3.Range(vLookUpRange)

        'This is not needed but I add it when I am working with changes to sheets so that I only run the code I want
        'when it is within the rang I am looking for. You could add logic to make sure that you only run the code if
        'you are only modifying that spesific cell. But for your goal, I don't think it is needed.
        If Not Intersect(Target, ws.Range(IDRange)) Is Nothing Then

            'You can use .Value but .Value2 is slightly faster with very few consequences.
            'eg if you ever need to read or write large amounts of data it will save you some time.
            If ws.Range(IDRange).Value2 <> "" Then
                ID = ws.Range(IDRange)
                DataValue = Application.WorksheetFunction.VLookup(ID, LookupRange, 3, False)
                'You also need to specify a sheet for this. Since this is located in the sheet you are entering
                'data I assumed the sheet "template"
                ws.Range(ResultRange).Value = DataValue
            End If
        End If

    End Sub

...