Как сделать перекрестную ссылку между двумя рабочими листами и суммой / группой по вхождениям на 3-м листе? - PullRequest
0 голосов
/ 28 января 2019

Я чрезвычайно новичок в рабочих листах Excel и мне нужна помощь, чтобы разобраться с этой проблемой.На первом листе Cookbook перечислены отделы и соответствующие рецепты.Между департаментами и продуктами существует отношение многих ко многим.

enter image description here

У меня есть еще один лист Ingredients, в котором перечислены Ingedients и чтоRecipes они принадлежат:

enter image description here

Я хочу получить общее количество каждой категории по ингредиентам на третьем листе под названием Category x Ingredient Totals:

enter image description here

X в таблице Ingredients представляет 1 неявно, но я не уверен, как преобразовать это (среди прочего).

1 Ответ

0 голосов
/ 28 января 2019

Это будет работать для вас, но может быть кто-то, кто может сделать это лучше.Мне нравится, что мой код довольно многословен, но сокращаю его по мере необходимости.

С первой таблицей создайте диапазон данных (не включая заголовок) под названием " 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 ... как вы иллюстрировали.

...