Чтобы это работало, преобразуйте данные в структурированные таблицы 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