Как разделить значения ячеек и сравнить в Excel с помощью формулы? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть два значения (A и B), как показано на рисунке ниже.Я хочу рассчитать приведенные ниже значения, используя A и B.

enter image description here

  1. Common: Процент общих значений вA и B (например, только 1 является обычным в 1-м примере. Таким образом, процент составляет 1/4)
  2. Только A: Процент только для элементов A (например, в первом примере1, 5 только в A. Таким образом, процент составляет 2/4)
  3. Только B: Процент только B элементов (например, в первом примере 6 только в B. Такпроцент составляет 1/4)

Я не смог найти правильную формулу Excel, чтобы разделить числа в одной ячейке запятой и сравнить ее со следующей ячейкой столбца (например, 1,4,5 против4,6).Пожалуйста, дайте мне знать, если есть какая-либо конкретная формула ms-excel, которую я могу использовать для этого.

Я с удовольствием предоставлю более подробную информацию, если это необходимо:)

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Использование UDF с дополнительным параметром для расчета выхода.


Примечания:

Функция GetPercentage.Возвращает процент в соответствии с переданным аргументом опции.

Arg1 : rng1 объект диапазона 1, например, ячейка A2

Arg2 : * диапазон 1020 *объект 2, например, ячейка B2

Arg3 : calcOption;"C" = Общий, "A" только, "B" только Б.


Код:

Option Explicit

Public Function GetPercentage(ByRef rng1 As Range, ByRef rng2 As Range, ByVal calcOption As String) As Double
    Application.Volatile
    'calcOption C  = Common , A is a only, B is B only.
    Dim arr1() As String, arr2() As String, totalAItems As Long, totalBItems As Long, totalItems As Long
    arr1 = Split(rng1.Value, ",")
    arr2 = Split(rng2.Value, ",")
    totalAItems = GetDistinctCount(arr1)
    totalBItems = GetDistinctCount(arr2)
    totalItems = GetDistinctCount(Split(rng1.Value & "," & rng2.Value, ","))
    Dim commonItemCount As Long
    commonItemCount = GetSharedCount(arr1, arr2)

    Select Case calcOption
    Case "C"
        GetPercentage = commonItemCount / totalItems
    Case "A"
        GetPercentage = OnlyInOneCell(arr1, arr2) / totalItems
    Case "B"
        GetPercentage = OnlyInOneCell(arr2, arr1) / totalItems
    End Select

End Function

Public Function GetDistinctCount(ByVal arr As Variant) As Long
    Dim tempDict As Object, i As Long
    Set tempDict = CreateObject("Scripting.Dictionary")

    For i = LBound(arr) To UBound(arr)
        If Not tempDict.Exists(arr(i)) Then tempDict.Add arr(i), arr(i)
    Next i

    GetDistinctCount = tempDict.Count

End Function

Public Function GetSharedCount(ByVal arr1 As Variant, ByVal arr2 As Variant) As Long
    Dim outCount As Long, i As Long
    For i = LBound(arr1) To UBound(arr1)
        If Not IsError(Application.Match(arr1(i), arr2, 0)) Then outCount = outCount + 1
    Next i

    GetSharedCount = outCount

End Function

Public Function OnlyInOneCell(ByVal arr1 As Variant, ByVal arr2 As Variant) As Long
    Dim outCount As Long, i As Long, tempDict As Object
    Set tempDict = CreateObject("Scripting.Dictionary")
    For i = LBound(arr1) To UBound(arr1)
        If IsError(Application.Match(arr1(i), arr2, 0)) Then
            If Not tempDict.Exists(arr1(i)) Then tempDict.Add arr1(i), arr1(i)
        End If
    Next i
    OnlyInOneCell = tempDict.Count
End Function

UDFв листе

UDF

0 голосов
/ 02 июня 2018

Вот решение для common .Введите следующий UDF в стандартный модуль:

Public Function Kommon(s1 As String, s2 As String) As Double
    Dim arry1, arry2, C As Collection

    arry1 = Split(s1, ",")
    arry2 = Split(s2, ",")

    Set C = New Collection
    On Error Resume Next
        For Each a In arry1
            C.Add a, CStr(a)
        Next a
        For Each a In arry2
            C.Add a, CStr(a)
        Next a
    On Error GoTo 0
    cc = CDbl(C.Count)

    For Each a In arry1
        For Each b In arry2
            If a = b Then
                k = k + 1
                Exit For
            End If
        Next b
    Next a

    Kommon = k / cc

End Function

Затем используйте следующее:

enter image description here

два других случая малыВариация этого.

...