打开Excel表格,按下图所示填写内容,其中B列为现实中你所拥有的实际发票单张面额,需求值为你需要凑出的金额,这里用1000示例,误差为你允许的金额误差,这里用误差为零,即我们需要凑出1000元整的金额。
点击开发工具,点击Visual Basic按钮,打开VBA编辑窗口。
1、 右键点击左侧工程栏点击插入,模块,新建模块1
1、 点击模块1,将以下代码复制粘贴进右侧代码编辑栏Sub MP() Sheet1.Range('E2') = '' Dim csh As Double Dim brr() As Double Dim SS As Integer Dim MM As Integer Dim HH As Integer SS = Second(Time) MM = Minute(Time) HH = Hour(Time) Dim diff As Double diff = Sheet1.Cells(2, 4) Dim zoci As Double Dim ci As Integer Dim DeVa As Double Dim Weiba As Integer DeVa = Sheet1.Cells(2, 3) Dim jar As Double Dim arr() As Double Dim tot As Double zoci = 0 ci = 0 jar = 0 Weiba = Sheet1.Cells(3000, 2).End(xlUp).Row ReDim arr(2 To Weiba) ReDim brr(1 To Weiba) Dim MaVa As Double Dim SeLaVa As Double brr(1) = 0 For i = 2 To Weiba arr(i) = Sheet1.Cells(i, 2) brr(i) = arr(i) Next For i = 2 To Weiba - 1 For p = i + 1 To Weiba If brr(i) > brr(p) Then csh = brr(i) brr(i) = brr(p) brr(p) = csh End If Next Next For i = 2 To Weiba Sheet1.Cells(i, 2) = brr(Weiba + 2 - i) Next For i = 1 To Weiba tot = tot + brr(i) Next For i = 2 To Weiba MaVa = MaVa + brr(i) Next SeLaVa = MaVa - brr(2) If (DeVa >= brr(2) And DeVa <= SeLaVa) Or DeVa = MaVa Then Call SB(DeVa, Weiba, 2, jar, ci, zoci, diff, arr(), brr(), tot) Else MsgBox '金额超限啦!请更改需求值或添加发票!' End If Debug.Print '耗时:' & Second(Time) - SS + (Minute(Time) - MM) * 60 + (Hour(Time) - HH) * 3600 & '秒'End SubSub SB(DeVa As Double, Weiba As Integer, x As Integer, jar As Double, ci As Integer, zoci As Double, diff As Double, arr() As Double, brr() As Double, tot As Double) Dim caob As Double Static caomm As Integer For i = x To Weiba ci = ci + 1 zoci = zoci + 1 jar = jar + arr(i) Sheet1.Cells(i, 2).Interior.ColorIndex = 37 'Debug.Print zoci & '层次=' & ci & ' ' & 'i=' & i & ' ' & '上一个jar=' & jar - Sheet1.Cells(i, 2), 'jar=' & jar If jar <= DeVa + diff And jar >= DeVa - diff Then Sheet1.Cells(2, 5) = jar Exit Sub End If If jar < DeVa + diff Then Call SB(DeVa, Weiba, i + 1, jar, ci, zoci, diff, arr(), brr(), tot) If jar <= DeVa + diff And jar >= DeVa - diff Then Sheet1.Cells(2, 5) = jar Exit For End If Sheet1.Cells(i, 2).Interior.ColorIndex = -4142 jar = jar - arr(i) ci = ci - 1 Next If jar = 0 Then MsgBox '现有发票无法凑出所需金额,请增加发票数或增加误差值!'End Sub
1、 点击开发工具,点击插入,点击下拉栏中的按钮标签,在表格中点击插入按钮,并命名为科学计算,如下图所示。
1、 右键单击科学计算按钮,点击指定宏。
1、 在弹出的指定宏框中选中MP,并点击确定。
1、 保存表格,命名为发票凑数,保存类型选择下拉栏里的Excel启用宏的工作薄(*.xlsm)。
1、 再次打开发票凑数表格,点击启用内容
1、 点击科学计算按钮,蓝色填充部分为参加进凑数计算得发票,按照颜色把实际发票挑出即为你所需要的凑数发票。
如果你的Excel表格没有开发工具这一栏,可以按照下图所示添加,点击文件,点击选项,在打开的选项框中,选择自定义功能区,在右侧主选项卡中勾选中开发工具,并点击确定即可。