Поиск значений CSV в ячейке таблицы с помощью vlookup и применение значений - PullRequest
0 голосов
/ 04 февраля 2019

Допустим, у меня есть следующая таблица:

https://i.imgur.com/qa2kiFv.png

В другой таблице у меня есть столбец с разделенными запятыми значениями применяемых чисел удержания: (Например, 1, 4, 6).

Как я могу просмотреть все соответствующие значения точки вычета и суммировать их?

Например, если в ячейке указано 7, 1 и 2а, этобудет суммировать -15, -5 и -2, в общей сложности -22.

Примеры: https://i.imgur.com/CjhNkZU.png

(Примечание: у меня недостаточно репутации для публикации изображений, поэтомуесли кто-то будет так же доброжелателен, как редактировать пост и добавлять изображения, я был бы признателен.)

1 Ответ

0 голосов
/ 04 февраля 2019

Чтобы это работало, преобразуйте данные в структурированные таблицы Excel (создайте резервную копию рабочей книги, выберите данные и нажмите «Ctrl» + «T», назначьте имя таблице)
Проверьте это для дальнейшего использования:
https://support.office.com/en-us/article/overview-of-excel-tables-7ab0bb7d-3a9e-4b56-a3c9-6c94334e492c

По сути, у вас должно быть две таблицы: - Таблица, содержащая точки удержания (я называю это TableDeduction) - Таблица, содержащая типичный номер удержания (я звонюit TableTypical)

Скопируйте и вставьте этот код в модуль и настройте каждую строку ниже текста >>>> Настройка:

Sub GetPoints()

    ' Declare objects variables
    Dim typicalTable As ListObject
    Dim deductionTable As ListObject
    Dim typicalCell As Range

    ' Declare other variables
    Dim sheetName As String
    Dim typicalTableName As String
    Dim deductionTableName As String
    Dim typicalValues As Variant ' Array
    Dim deductionValue As Integer ' Change for long if sum is gonna be greater than 32.000

    ' Generic variables
    Dim counter As Integer


    ' >>>> Customize to fit your needs
    sheetName = "Sheet1"
    typicalTableName = "TableTypical"
    deductionTableName = "TableDeduction"
    ' <<<<

    ' Initiate table objects
    Set typicalTable = ThisWorkbook.Worksheets(sheetName).ListObjects(typicalTableName)
    Set deductionTable = ThisWorkbook.Worksheets(sheetName).ListObjects(deductionTableName)

    ' Loop through the typical table cells
    For Each typicalCell In typicalTable.DataBodyRange.Columns(1).Cells

        ' Validate that it's valid
        If typicalCell.Value <> "None" Then

            ' Reinitiate the sum
            deductionValue = 0

            ' Split to cell values by commas
            typicalValues = Split(typicalCell.Value, ",")

            ' For each value look it's corresponding deduction points
            For counter = 0 To UBound(typicalValues)

                ' >>>> Customize the columns number

                If IsError(Application.Match(CStr(typicalValues(counter)), deductionTable.DataBodyRange.Columns(1), 0)) Then

                    ' >>>> Customize the columns number

                    ' Lookup the table for numbers
                    If IsNumeric(Application.Index(deductionTable.DataBodyRange.Columns(2), Application.Match(CLng(typicalValues(counter)), deductionTable.DataBodyRange.Columns(1), 0))) Then

                        ' >>>> Customize the columns number

                        deductionValue = deductionValue + Application.Index(deductionTable.DataBodyRange.Columns(2), Application.Match(CLng(typicalValues(counter)), deductionTable.DataBodyRange.Columns(1), 0))
                    End If
                Else
                    ' >>>> Customize the columns number

                    ' Lookup the table for string
                    If IsNumeric(Application.Index(deductionTable.DataBodyRange.Columns(2), Application.Match(CStr(typicalValues(counter)), deductionTable.DataBodyRange.Columns(1), 0))) Then

                        ' >>>> Customize the columns number

                        deductionValue = deductionValue + Application.Index(deductionTable.DataBodyRange.Columns(2), Application.Match(CStr(typicalValues(counter)), deductionTable.DataBodyRange.Columns(1), 0))
                    End If
                End If

                ' Output the value in the next cell
                typicalCell.Offset(0, 1).Value = deductionValue

            Next counter

        End If

    Next typicalCell

End Sub
...