Excel 对给定的值求和并达到另一个值

Excel 对给定的值求和并达到另一个值,excel,powershell,Excel,Powershell,我需要对一组值求和,然后得到另一个值,这组值可以变化(意味着它可以包含4个或20个值),但我只需要一个组合,使用这些值而不修改任何值,并达到正确的最终值 例如: 金额: 435.97 40180.6 261.19 14861.68 108.7 77.97 316.02 1345.4 1255.96 10851.02 3517.04 使用上述金额组合达到的值:57050.23 演示了如何在几种语言中执行非常类似的操作,但我需要在PowerShell中使用它或在Excel中使用的公式。我们设法通过

我需要对一组值求和,然后得到另一个值,这组值可以变化(意味着它可以包含4个或20个值),但我只需要一个组合,使用这些值而不修改任何值,并达到正确的最终值

例如:

金额:
435.97
40180.6
261.19
14861.68
108.7
77.97
316.02
1345.4
1255.96
10851.02
3517.04
使用上述金额组合达到的值:57050.23


演示了如何在几种语言中执行非常类似的操作,但我需要在PowerShell中使用它或在Excel中使用的公式。

我们设法通过PowerShell调用Excel宏,它正在工作。这是一个相当广泛的代码(815行),但下面是我们调用vba宏的部分,并将结果放在向量上,以过滤与我们希望达到的值匹配的值(在本例中为顺序):

$WorksheetAutomation12.Activate()
$ExcelAutomation.Run("Descobrir")

$WorksheetAutomation12.Columns.Item('D').NumberFormat = "0"

$AuxMacro = $CNPJCount+5

$FilterOrdersMacro = @()

for($i=6;$i -le $AuxMacro;$i++)
{
    $MacroValue = $WorksheetAutomation12.Cells.Item($i, 4).value()
    if(($MacroValue -ne 0) -and ($MacroValue -ne $null))
    {
        $FilterOrdersMacro += , "$MacroValue"
    }
}

$FilterOrdersMacro
和VBA宏:

Option Explicit

Dim dv() As Double
Dim dvTeste() As String

Dim dMeta As Double

Dim e As Long
Dim eTeste As Long

Dim blAchou As Boolean

Dim vOrigem()
Dim vOrigemTeste()

Dim rLast As Long
Dim blParar
Dim dDiferença As Double

Sub Descobrir()

        With ThisWorkbook.Sheets("Macro")
            'rLast is the last used row:
            rLast = .Cells(.Rows.Count, "A").End(xlUp).Row

            'Put column A into a vector:
            vOrigem = Application.Transpose(.Range("A1:A" & rLast))
            vOrigemTeste = Application.Transpose(.Range("B1:B" & rLast))


            '"Meta" is the value we want to reach
            dMeta = .Range("C2")

            .Range("C5:C" & rLast + 4).ClearContents
            .Range("E2:F2").ClearContents
            .Range("E4") = "Executing . . ."

            Recursar

            .Range("E4").ClearContents

            'Throw the solution on the worksheet
            If blAchou Then
'                DisporResultado

            Else
                If blParar Then

                Else

                End If
            End If
        End With

End Sub

Sub DisporResultado()
    With ThisWorkbook.Sheets("Macro")
        Dim n As Long
        Dim nTeste As Long

        .Range("C5:C" & rLast + 5).ClearContents
        .Range("D5:D" & rLast + 5).ClearContents
        .Range("E2") = Soma(dv)

        .Range("F2") = dDiferença

        For n = 1 To UBound(dv)
            .Cells(n + 5, "C") = dv(n)
        Next n

        For nTeste = 1 To UBound(dvTeste)
            .Cells(nTeste + 5, "D") = dvTeste(nTeste) '
        Next nTeste


    End With
End Sub

Function Recursar(Optional r0 As Long)

    Dim r As Long
    Dim n As Long

    Dim rTeste As Long
    Dim nTeste As Long

    Dim dSoma As Double

   If r0 = 0 Then

        e = 0
        eTeste = 0

        r0 = 1
        blAchou = False
        blParar = False

        dDiferença = 1.79769313486231E+308
    End If

    DoEvents

    For r = r0 To rLast
        e = e + 1
        eTeste = eTeste + 1

        ReDim Preserve dv(1 To e)
        ReDim Preserve dvTeste(1 To eTeste)

        dv(e) = vOrigem(r)
        dvTeste(eTeste) = vOrigemTeste(r)

        If Abs(dSoma - dMeta) < Abs(dDiferença) Then
            dDiferença = dSoma - dMeta
            DisporResultado
        End If
        Select Case dSoma
            Case Is < dMeta
                If r = rLast Then
                    e = e - 2
                    eTeste = eTeste - 2
                    If e > 0 Then
                        ReDim Preserve dv(1 To e)
                        ReDim Preserve dvTeste(1 To eTeste)
                    End If
                Else
                    Recursar r + 1
                End If
            Case Is > dMeta
                e = e - 1
                eTeste = eTeste - 1
                If e > 0 Then
                    ReDim Preserve dv(1 To e)
                    ReDim Preserve dvTeste(1 To eTeste)
                End If
                If r = rLast Then
                    e = e - 1
                    eTeste = eTeste - 1
                    If e > 0 Then
                        ReDim Preserve dv(1 To e)
                        ReDim Preserve dvTeste(1 To eTeste)
                    End If
                End If
            Case dMeta
                blAchou = True
        End Select
        If blAchou found Or blParar Then Exit Function
    Next r

End Function

Function Soma(v As Variant) As Double

    Dim n As Long
    Dim dSoma As Double
    For n = 1 To UBound(v)
        dSoma = dSoma + v(n)
    Next n
    Soma = dSoma
End Function

Sub Parar()
    blParar = True
End Sub
选项显式
Dim dv()为双精度
Dim dvTeste()作为字符串
将dMeta设置为双精度
暗淡如长
长得一样暗
布尔型模糊blAchou
Dim vOrigem()
Dim vOrigemTeste()
迟迟不见
暗黑
Dim dDiferença为双人
副描述()
使用ThisWorkbook.Sheets(“宏”)
'rLast是最后使用的行:
rLast=.Cells(.Rows.Count,“A”).End(xlUp).Row
'将列A放入向量:
vOrigem=Application.Transpose(.Range(“A1:A”&rLast))
vOrigemTeste=Application.Transpose(.Range(“B1:B”和rLast))
“元”是我们想要达到的价值
dMeta=.范围(“C2”)
.范围(“C5:C”和rLast+4).清除内容
.范围(“E2:F2”).ClearContents
.Range(“E4”)=“正在执行…”
递归的
.Range(“E4”).ClearContents
'将解决方案扔到工作表上
如果是布拉乔的话
“DisporResultado
其他的
如果是blParar那么
其他的
如果结束
如果结束
以
端接头
子DisporResultado()
使用ThisWorkbook.Sheets(“宏”)
长
只要
.范围(“C5:C”和rLast+5)。清除内容
.Range(“D5:D”和rLast+5).ClearContents
.范围(“E2”)=胞体(dv)
.范围(“F2”)=dDiferença
对于n=1至UBound(dv)
.单元(n+5,“C”)=dv(n)
下一个
对于nTeste=1至UBound(dvTeste)
.单元(nTeste+5,“D”)=dvTeste(nTeste)'
下一站
以
端接头
函数递归(可选的r0长度)
变暗,变长
长
淡而无味
只要
双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲
如果r0=0,则
e=0
eTeste=0
r0=1
blAchou=False
blParar=False
dDiferença=1.79769313486231E+308
如果结束
多芬特
对于r=r0至rLast
e=e+1
eTeste=eTeste+1
重拨保存dv(1到e)
ReDim保留dvTeste(1到eTeste)
dv(e)=vOrigem(r)
dvTeste(eTeste)=vOrigemTeste(r)
如果Abs(dSoma-dMeta)0,则
重拨保存dv(1到e)
ReDim保留dvTeste(1到eTeste)
如果结束
其他的
递归r+1
如果结束
案例>dMeta
e=e-1
eTeste=eTeste-1
如果e>0,则
重拨保存dv(1到e)
ReDim保留dvTeste(1到eTeste)
如果结束
如果r=rLast,则
e=e-1
eTeste=eTeste-1
如果e>0,则
重拨保存dv(1到e)
ReDim保留dvTeste(1到eTeste)
如果结束
如果结束
案例D梅塔
布拉乔
结束选择
如果找到blAchou或blParar,则退出函数
下一个r
端函数
函数Soma(v作为变量)作为Double
长
双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲双盲
对于n=1至UBound(v)
dSoma=dSoma+v(n)
下一个
体细胞=体细胞
端函数
副帕拉尔()
blParar=True
端接头
标题:Parar=停止。Soma=总和。Achou=找到的值。

感谢您的帮助:)

那么,什么是“正确的最终价值”?显然,这不是所有输入值的总和。到目前为止你试过什么?因此,这不是一个你定义需求,其他人为你编写代码的地方。正确的最终值是我希望在最后达到的数量,在本例中为57050.23。您不需要对所有值求和,只有一个可以达到该值的组合就足够了。我没有任何代码,我试图在Excel上找到一个公式,可以达到正确的值,比如排列或类似的东西,但还没有找到它。一旦我编写了代码,我就把它贴在这里,对不起,你能将每个值添加多次吗?或者你能只使用一次每个值来达到所需的数量吗?每个值只使用一次,不能重复或更改值