Преобразование вложенной формулы LOOKUP в код VBA - PullRequest
0 голосов
/ 31 октября 2019

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

В данный момент код копирует ВСЕ данные в исходном столбце в целевую ячейку. Я хотел бы, чтобы код вставлял только те данные, которые соответствуют имени проекта, и повторял для каждого проекта - аналогично vlookup.

Я новичок в VBA и не знаю, как включить vlookup в код. У меня есть формула Excel, которая получает различные значения, которые соответствуют имени проекта. Я попытался встроить формулу в код, но получил ошибку «несоответствие типов», и формула выделена.

Существует ли способ для кода циклически проходить по каждому имени проекта и вставлять их отдельные значения?

Любая помощь приветствуется !!

Формула Excel = IFERROR (LOOKUP (2, 1 / ((COUNTIF ($ J $ 8: J8, «План проекта»! D2): D91) = 0) * ($ I $ 9 = «План проекта»! V2: V91)), «План проекта»! D2: D91), "") Источник

Текущий код

Option Explicit

Sub Update_Market_Status()
'
' Update_Market_Status Macro
' Updates Status field in Executive Market Summary Report
'

Dim d As Long
Dim prev_acts As String
Dim next_acts As String
Dim ws As Object
Dim status_report As Object
Dim is_synced As Boolean
Dim sync_value As String
Dim lastRow As Long

Set ws = ThisWorkbook.Sheets("Project plan")
Set status_report = ThisWorkbook.Sheets("Status Report")
lastRow = ThisWorkbook.Sheets("Project plan").Cells(Rows.Count, "D").End(xlUp).Row + 1

On Error Resume Next

sync_value = ws.Range("U2").Value


If VBA.LCase(sync_value) = "y" Then
    is_synced = True
Else
    is_synced = False
End If

If is_synced = True Then

        For d = 2 To lastRow
            If LCase(ws.Range("N" & d).Value) = "y" Then
                If LCase(ws.Range("T" & d).Value) = "c" Then
                    If prev_acts = vbNullString Then
                        prev_acts = "'- " & ws.Range("D" & d).Value
                        Else
                        prev_acts = prev_acts & vbLf & "- " & ws.Range("D" & d).Value
                    End If
                ElseIf LCase(ws.Range("T" & d).Value) = "o" Or LCase(ws.Range("T" & d).Value) = vbNullString Then
                    If next_acts = vbNullString Then
                        next_acts = "'- " & ws.Range("D" & d).Value
                        Else
                        next_acts = next_acts & vbLf & "- " & ws.Range("D" & d).Value
                    End If
                End If

            End If
     Next d

    status_report.Range("E8").Value = prev_acts ' Previous Actions
    status_report.Range("F8").Value = next_acts ' Next Actions

End If

End Sub

1 Ответ

0 голосов
/ 31 октября 2019

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

Аналогичным подходом было бы использование объекта WorksheetFunctions для вызова функций формулы в VBA, а затем запись полученного значения в таблицу.

Любой из этих подходов позволяет избежать воссоздания функций листав коде VBA.

...