打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel VBA【案例分享】彩票号码组合并求和值/两列数字组合并按单个数字求和

快速浏览

往期合集:【2023年3月】【2023年4月】【2023年5月】【2023年6月2023年7月2023年8月2023年9月

实用案例

|日期控件||简单的收发存||收费管理系(Access改进版)|

|电子发票管理助手||电子发票登记系统(Access版)|

|文件合并||表格拆分||审计凭证抽查底稿|

|中医诊所收费系统(Excel版)||中医诊所收费系统(Access版)|

收费使用项目

|财务管理系统||工资薪金和年终奖个税筹划|

内容提要

  • 两列数字组合并按单个数字求和
大家好,我是冷水泡茶,今天在某论坛上看到一则求助贴:

光看这个标题,不知道他是要干嘛,下载附件来看看再说。
原来他是这样的,M列有27行,N列有26行:

他的意思是M列、N列所有数字进行组合,目标应该都是5个数字。但是如果M列数据多于N列则会出现3个数字的情况,显然是不行的。
这个应该没有什么难度啊,两个循环应该能解决。
再看他的O列数字,应该是单个数字的和。我有点明白了,这应该是一种彩票的号码模式吧。VBA真是用途广泛啊!
改代码是不可能改的,我们就按照自己的思路重新写吧,这里应该用到很多数组的操作,我们前面分享过【VBA教程:数组(1)】、【VBA教程:数组(2)】,正好重温一下,我们一起来看看吧。

基本思路

1、把M列、N列数据装入数组arr()。
2、循环数组arr,把第一列与第二列逐一组合。
3、把组合后的字符串分列为一个数组arrTem,元素就是一个个数字。
4、循环数组arrTem,把各个元素相加,得到和值。
5、组合的和值存在于K1单元格的数字中,则把和值组合存入一个数组arrResult
6、循环完毕,把arrResult转置存入arrTem
7、把arrTem数据存入工作表O列到P列。

VBA代码

1、在模块1里,Combine过程:

Sub Combine()    Dim ws As Worksheet   '定义一个Worksheet对象    Dim lastRow As Integer '定义一个整型变量,用来存放单元格最大已使用行号    Dim arr(), arrResult(), arrTem() As String, strRef As String, total As Integer    Dim temp As String        '将当前工作簿中名为 "Sheet1" 的工作表对象分配给变量 ws,以便在后续的代码中可以通过 ws 来引用这个工作表。    '或者说把ws这个工作表对象变量指向"Sheet1"工作表    '或者说给ws赋值,反正后面ws就代表Sheet1    Set ws = ThisWorkbook.Sheets("Sheet1")    With ws   '针对ws进行操作,在引用其属性、方法时,ws可以省略,直接以"."开始                '取得工作表最大已使用行号,存入变量lastRow        lastRow = ws.UsedRange.Rows.Count                '清除已有数据        .Range("O1").Resize(lastRow, 2).Clear                '把M到N列,有数据的最大区域装入数组,我们不能直接把M:N列整列装入数组,那数据量就超级多了,也许会报错。        arr = .Range("M1:N" & lastRow).Value                '和值的参照,必须等于其中一个数字        strRef = "," & .Range("K1") & ","                '从行方向循环数组,这里lastRow一般应该用Ubound(arr)        For i = 1 To lastRow            If arr(i, 1) <> "" Then '判断数组第一列的值不为空                For j = 1 To lastRow '再循环数组                    If arr(j, 2) <> "" Then '判断数组第一列的值不为空                        temp = arr(i, 1) & "," & arr(j, 2)  '组合值                        '把组合的值分列为一个数组arrTem                        arrTem = Split(temp, ",")                                                '循环arrTem,把它的各个元素转换为数值后相加,累加到arrResult的第一行。                        For m = LBound(arrTem) To UBound(arrTem)                            total = total + CInt(arrTem(m))                        Next                        If InStr(strRef, "," & total & ",") Then '如果组合值的和值在那几个数字中,则为有效组合,存入数组。                                                        '动态扩展定义数组                            ReDim Preserve arrResult(0 To 1, 0 To k)                                                        '把arr第一列与第二列的非空元素逐一组合,中间用","隔开,存到arrResult的第二行。                            arrResult(0, k) = total                            arrResult(1, k) = temp k = k + 1   '计数器增加1                        End If                        total = 0                    End If                Next            End If        Next                '重定义arrTem,使之与arrResult行列转置        '也可以用application.worksheetfunction.transpose函数转置数组,但数据量不能太大        '这里干脆重弄个转置数组,把arrResult的值写到arrTem中        ReDim arrTem(1 To UBound(arrResult, 2) + 1, 1 To 2)        For i = 1 To UBound(arrTem)            arrTem(i, 1) = arrResult(0, i - 1)            arrTem(i, 2) = arrResult(1, i - 1)        Next                '把arrTem的数据回写到工作表        .Range("O1").Resize(UBound(arrTem), 2) = arrTem    End WithEnd Sub
代码解析:
(1)由于代码量不大,我基本进行了逐行注释,下面就简单解释。
(2)line20,把M列、N列数据装入数组arr,这里如果用两个数组也可以。
(3)line23,把和值strRef的参照值前后用加上“,”,便于后面精确匹配。
4)line27,检查判断数组元素不为空。我们用lastRow来构造数组数据范围,空单元格肯定是有的,所以这里要跳过空单元格。29行也是一样。
(5)line32,把组合后的字符串分列到一个数组arrTem,这里arrTem要定义为String类型的,否则会报错:“类型不匹配“。
(6)line35~47,计算和值,并使用Instr函数检查是否存在于限定的和值中,如果存在,则为有效组合,把和值、组合存入数组arrResult中。
(7)line57~61,通过循环的方式,把数组arrResult转置到arrTem。也可以用Transpose转置函数,但在数据量很大的情况下会出错。
2、在工作表Sheet1里:
Private Sub CmdClear_Click()    ThisWorkbook.Sheets("Sheet1").Columns("O:P").ClearEnd Sub
Private Sub CmdCombine_Click() Call CombineEnd Sub

代码解析:

(1)line2,清除O列到P列的内容。

(2)line6,调用Combine过程。

后记

1、说不去修改别人的代码,但在文章写得差不多了,最后还是仍不住看了一下,这一看不打紧,看得我头皮一阵发麻:原来我并没有完全理解对方的意图。
2、我刚开始并没有注意K1单元格里的数字,没有想到它有什么用。

3、看了他原来的代码,才发现,这是和值的筛选指标,也就是所有组合中,和值等于其中一个数字的,才存下来。
4、于是只好再修改代码,好在这个判断不太复杂,很快就改好了。
5、提到彩票,我想说两句,彩票是概率游戏,中大奖的概率是极低的,下点小注玩玩无可厚非,权当真的支持体育、福利事业了,但千万别沉迷,别下重注。从理性的角度来说,如果想赢钱,买彩票不是一个好办法。

扯远了,今天就这样。


~~~~~~End~~~~~~

喜欢就点个、点在看留言评论、分享一下呗!感谢支持!

案例文件分享说明

  • 案例文件可免费分享,但需符合以下要求:

  • 关注点赞点在看点广告留言,方便的话分享一下就完美啦!如果不便走上面的“流程”,请打赏,万分感谢!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Excel函数教程
Excel函数的参数
学习Excel函数公式,这些知识你是必须要掌握的!
46函数数组的这个新功能,用起来确实很酷
Python与Excel协同应用初学者指南
Vlookup函数实例(全)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服