-2

我需要找到在 Excel Vba 中创建下面显示的最大组合的值

假设,我有这样的组合

a   a+b a+b+c   1   1+2 1+2+1   3   4
b   a+c a+b+d   2   1+1 1+2+3   2   6
c   a+d a+b+e   1   1+3 1+2+2   4   5
d   a+e a+c+d   3   1+2 1+1+3   3   5
e   b+c a+c+e   2   2+1 1+1+2   3   4
    b+d a+d+e       2+3 1+3+2   5   6
    b+e b+c+d       2+2 2+1+3   4   6
    c+d b+c+e       1+3 2+1+2   4   5
    c+e b+d+e       1+2 2+3+2   3   7
    d+e c+d+e       3+2 1+3+2   5   6

我需要找出哪些组合创造了最大值,在这种情况下,值“7”是由 2、3、2 创建的最大值。因此,我希望这些值作为唯一单元格中的输出。我可能有数千种组合,因此我希望自动找到这些组合并自动输出到唯一的单元格中并进一步运行程序。请帮忙。

谢谢巴拉吉

4

2 回答 2

1

概念 :

一组 n 中 m 个值的最大和是 m 个较大值的总和。一旦值按降序排序,解决方案就很简单了。

这是一个纯 Excel 解决方案,没有 VBA。

设计与实施:

用户输入(变量名称和值)位于 C4:D8 中。

思路如下:

  1. 确定数据的顺序。为此,我RANK在 B 列中使用。
  2. 然后在 G 和 H 列中使用 VLOOKUP 根据排名对数据进行排序。
  3. 然后计算最大总和是微不足道的: n 个较大数字的总和。

这是代码:

     A                      B    C     D E    F                              G                              H I         J                                                      K
1                                            
2                           User input        Sorted by rank                                                            Maximum sums        
3    Rank                   name value   Rank name                           value                                      name                                                   value
4    =RANK.EQ(C4;$C$4:$C$8) a    45      1    =VLOOKUP(E4;$A$4:$C$8;2;FALSE) =VLOOKUP(E4;$A$4:$C$8;3;FALSE)   2 numbers =CONCATENATE($F$4;"+";$F$5)                            =$G$4+$G$5
5    =RANK.EQ(C5;$C$4:$C$8) b    1       2    =VLOOKUP(E5;$A$4:$C$8;2;FALSE) =VLOOKUP(E5;$A$4:$C$8;3;FALSE)   3 numbers =CONCATENATE($F$4;"+";$F$5;"+";$F$6)                   =$G$4+$G$5+$G$6
6    =RANK.EQ(C6;$C$4:$C$8) c    2       3    =VLOOKUP(E6;$A$4:$C$8;2;FALSE) =VLOOKUP(E6;$A$4:$C$8;3;FALSE)   4 numbers =CONCATENATE($F$4;"+";$F$5;"+";$F$6;"+";$F$7)          =$G$4+$G$5+$G$6+$G$7
7    =RANK.EQ(C7;$C$4:$C$8) d    12      4    =VLOOKUP(E7;$A$4:$C$8;2;FALSE) =VLOOKUP(E7;$A$4:$C$8;3;FALSE)   5 numbers =CONCATENATE($F$4;"+";$F$5;"+";$F$6;"+";$F$7;"+";$F$8) =$G$4+$G$5+$G$6+$G$7+$G$8
8    =RANK.EQ(C8;$C$4:$C$8) e    33      5    =VLOOKUP(E8;$A$4:$C$8;2;FALSE) =VLOOKUP(E8;$A$4:$C$8;3;FALSE)                

结果如下:

     A       B    C     D  E   F    G    H    I            J          K
1                                            
2            User input        Sorted by rank              Maximum sums        
3    Rank    name value   Rank name value                  name       value
4    1       a    45      1    a    45        2 numbers    a+e        78
5    5       b    1       2    e    33        3 numbers    a+e+d      90
6    4       c    2       3    d    12        4 numbers    a+e+d+c    92
7    3       d    12      4    c    2         5 numbers    a+e+d+c+b  93
8    2       e    33      5    b    1                

请注意,它可以轻松扩展到更多变量。

于 2013-09-17T06:42:35.040 回答
1

扩展 d-stroyer 的答案,并将其转换为 VBA:

创建UDF:

Option Explicit

Function GetMax(RNames As Range, RVals As Range, MaxNums As Long) As String
Dim i As Long
Dim j As Long
Dim tmpName As String
Dim tmpVals As Long
Dim Names()
Dim Vals()

Names = RNames
Vals = RVals

For i = 1 To UBound(Names) - 1 'bubble sort
    For j = i + 1 To UBound(Names)
        If Vals(i, 1) < Vals(j, 1) Then 'largest first
            tmpName = Names(i, 1)
            Names(i, 1) = Names(j, 1)
            Names(j, 1) = tmpName
            tmpVals = Vals(i, 1)
            Vals(i, 1) = Vals(j, 1)
            Vals(j, 1) = tmpVals
        End If
    Next j
Next i

For i = 1 To MaxNums
    If Vals(i, 1) <= 0 Then Exit For 
    'adding zero, or negative numbers will lower the total
Next i

For j = 1 To i - 1
    GetMax = GetMax & Names(j, 1) & ","
    'now we know how many values to use (from previous loop)
    'make the string up
Next j

If Len(GetMax) > 0 Then
    GetMax = Left(GetMax, Len(GetMax) - 1)
    'remove the final comma
Else
    GetMax = "No result found"
End If

End Function

=getmax(A1:A5,D1:D5,3) 使用结果调用将是d,b,e

我将把剩下的留给你检查错误情况,例如超过 1 列在范围内传递,或范围大小不等,或返回的最大项目数大于范围大小

于 2013-09-17T15:52:56.350 回答