Это будет работать для вас, но может быть кто-то, кто может сделать это лучше.Мне нравится, что мой код довольно многословен, но сокращаю его по мере необходимости.
С первой таблицей создайте диапазон данных (не включая заголовок) под названием " rngCategoriesToRecipes "
Затем создайте диапазон для второй таблицы (на этот раз, включая заголовки) с именем " rngRecipetoIngredients ".
В-третьих, добавьте следующий код в новый модуль внутриРедактор VBA ...
Public Function CalculateCategoryToIngredients( _
ByVal rngCategoriesToRecipesMapping As Range, _
ByVal rngRecipesToIngredientsMapping As Range, _
ByVal strCategory As String, _
ByVal strIngredient As String) As Long
Application.Volatile
Dim strThisCategory As String, strThisRecipe As String, strThisIngredient As String, strRecipes As String, objCell As Range
Dim lngRow As Long, lngCol As Long, arrRecipes, bIsRelevant As Boolean, strThisValue As String, lngCount As Long
' Process each of the different categories and they're mappings to recipes.
For i = 1 To rngCategoriesToRecipesMapping.Rows.Count
strThisCategory = rngCategoriesToRecipesMapping.Cells(i, 1)
strThisRecipe = rngCategoriesToRecipesMapping.Cells(i, 2)
' Get all of the recipes related to the category passed in.
If strThisCategory = strCategory Then
strRecipes = strRecipes + "," + strThisRecipe
End If
Next
arrRecipes = Split(Mid(strRecipes, 2), ",")
' Now process the mapping from the recipes to the ingredients.
For lngRow = 2 To rngRecipesToIngredientsMapping.Rows.Count
For lngCol = 2 To rngRecipesToIngredientsMapping.Columns.Count
strThisValue = Trim(rngRecipesToIngredientsMapping.Cells(lngRow, lngCol))
strThisRecipe = rngRecipesToIngredientsMapping.Cells(lngRow, 1)
strThisIngredient = rngRecipesToIngredientsMapping.Cells(1, lngCol)
bIsRelevant = False
For i = 0 To UBound(arrRecipes)
If arrRecipes(i) = strThisRecipe Then
bIsRelevant = True
Exit For
End If
Next
If bIsRelevant And strThisValue <> "" And strIngredient = strThisIngredient Then
lngCount = lngCount + 1
End If
Next
Next
CalculateCategoryToIngredients = lngCount
End Function
Наконец, добавьте эту формулу в первую ячейку в пределах диапазона, который вы хотите вычислить, и заполните и поперек.
=CalculateCategoryToIngredients(rngCategoriesToRecipes,rngRecipetoIngredients,$A16,B$15)
Естественно, вы 'Вам нужно будет заменить последние 2 параметра ($ A16 = "Категория 1" и B $ 15 = "Ингредиент 1") фактическими ячейками, на которые вы хотите сослаться, в настоящее время они относятся к моей рабочей таблице и к тому месту, где я разместил свои значения.
Я надеюсь, что это работает для вас.Я думаю, что это так, это подчеркнуло, что ваше пересечение матриц "Категория 3", "Ингредиент 3" на самом деле 2, а не 1 ... как вы иллюстрировали.