ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2134|回复: 8

求三个数相加尾相同等式代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-4-25 18:15 | 显示全部楼层 |阅读模式
本帖最后由 abc3d 于 2014-4-25 18:18 编辑

ABCD
0389
3904
6790
4518
9045
1425
5726
4824

求三个数相加尾相同等式代码
例如:黑色加粗字体的(①)A4+C2+A5=4+1+9=4,粉红字体的②C3+D3+D5=9+0+5=4,同时对应的③A5+C3+A6=④C4+D4+D6
说明1:同时满足条件①=②(指尾数),③=④,不是①=②=③=④
说明2:①③、②④具有同等对应关系,例如①下拉可一行得到③,即(①)A4+C2+A5下拉一行是②A4+C3+A6,当然可以不下拉或下拉两行、三行主要是说其同等对应关系。
说明3:一个等式的三个数字每行最多出现两个
说明4:每组数据固定4列8行,A1=B1+C1+D1之尾
说明5:一组数据可能出现多个等式,不知道怎样表明等式代码更容易实现,或者不同等式标出不同颜色,当然能在旁边列出等式  最好比如 A4+C2+A5=C3+D3+D5
说明6:最好将代码直接保存在excel工作表中,下载即可使用。(本人初识VBA,还不会保存代码)
说明6:非常感谢您的指教!顺祝五一节快乐!事事如意!
如果没说清楚,我会跟贴继续说明。谢谢!

新建 Microsoft Office Excel 2007 Workbook.rar

7.27 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2014-4-25 20:50 | 显示全部楼层
看懂了,代码也写好了。

不过运行起来可能耗时太长……符合条件的结果太多了。

  1. Sub kagawa() '2014/04/25
  2.     Dim i11&, j11&, i12&, j12&, i13&, j13&
  3.     Dim i21&, j21&, i22&, j22&, i23&, j23&
  4.     Dim t11&, t21&, t12&, t22&, r&, s$, tms#
  5.     tms = Timer
  6. '    arr = [a1:d8]
  7.     Dim arr&(1 To 8, 1 To 4)
  8.     Dim brr&(1 To 8, 1 To 4)
  9.     For i11 = 1 To 8
  10.       For j11 = 1 To 4
  11.         arr(i11, j11) = Cells(i11, j11)
  12.       Next
  13.     Next
  14.    
  15.     r = 12
  16.     For i11 = 1 To 6
  17.       For j11 = 1 To 4
  18.         brr(i11, j11) = 1
  19.         For i12 = 1 To 7
  20.           For j12 = IIf(i11 = i12, j11 + 1, 1) To 4
  21.             If brr(i12, j12) Then Stop
  22.             brr(i12, j12) = 1
  23.             For i13 = i11 + 1 To 7
  24.               For j13 = IIf(i12 = i13, j12 + 1, 1) To 4
  25.                 If brr(i13, j13) Then Stop
  26.                 brr(i13, j13) = 1
  27.                
  28.     For i21 = i11 To 6
  29.       For j21 = IIf(i11 = i21, j11 + 1, 1) To 4
  30.         If brr(i21, j21) Then
  31. '          Stop 'pass
  32.         Else
  33.           brr(i21, j21) = 1
  34.           For i22 = 1 To 7
  35.             For j22 = IIf(i21 = i22, j21 + 1, 1) To 4
  36.               If brr(i22, j22) Then
  37. '                Stop 'pass
  38.               Else
  39.                 brr(i22, j22) = 1
  40.                 For i23 = i21 + 1 To 7
  41.                   For j23 = IIf(i22 = i23, j22 + 1, 1) To 4
  42.                     If brr(i23, j23) Then
  43. '                      Stop 'pass
  44.                     Else
  45.                     
  46.                       t11 = (arr(i11, j11) + arr(i12, j12) + arr(i13, j13)) Mod 10
  47.                       t21 = (arr(i21, j21) + arr(i22, j22) + arr(i23, j23)) Mod 10
  48.                       If t11 = t21 Then
  49.                         t12 = (arr(i11 + 1, j11) + arr(i12 + 1, j12) + arr(i13 + 1, j13)) Mod 10
  50.                         t22 = (arr(i21 + 1, j21) + arr(i22 + 1, j22) + arr(i23 + 1, j23)) Mod 10
  51.                         If t12 = t22 Then
  52. '                          Stop
  53.                           Cells(r, 1) = Cells(i11, j11).Address(0, 0)
  54.                           Cells(r, 2) = Cells(i12, j12).Address(0, 0)
  55.                           Cells(r, 3) = Cells(i13, j13).Address(0, 0)
  56.                           
  57.                           Cells(r, 5) = Cells(i21, j21).Address(0, 0)
  58.                           Cells(r, 6) = Cells(i22, j22).Address(0, 0)
  59.                           Cells(r, 7) = Cells(i23, j23).Address(0, 0)
  60.                           
  61.                           Cells(r, 9) = Cells(i11 + 1, j11).Address(0, 0)
  62.                           Cells(r, 10) = Cells(i12 + 1, j12).Address(0, 0)
  63.                           Cells(r, 11) = Cells(i13 + 1, j13).Address(0, 0)
  64.                           
  65.                           Cells(r, 13) = Cells(i21 + 1, j21).Address(0, 0)
  66.                           Cells(r, 14) = Cells(i22 + 1, j22).Address(0, 0)
  67.                           Cells(r, 15) = Cells(i23 + 1, j23).Address(0, 0)
  68.                           r = r + 1
  69.                           
  70.                           Cells(r, 1) = arr(i11, j11)
  71.                           Cells(r, 2) = arr(i12, j12)
  72.                           Cells(r, 3) = arr(i13, j13)
  73.                           Cells(r, 4) = t11
  74.                           Cells(r, 5) = arr(i21, j21)
  75.                           Cells(r, 6) = arr(i22, j22)
  76.                           Cells(r, 7) = arr(i23, j23)
  77.                           
  78.                           Cells(r, 9) = arr(i11 + 1, j11)
  79.                           Cells(r, 10) = arr(i12 + 1, j12)
  80.                           Cells(r, 11) = arr(i13 + 1, j13)
  81.                           Cells(r, 12) = t22
  82.                           Cells(r, 13) = arr(i21 + 1, j21)
  83.                           Cells(r, 14) = arr(i22 + 1, j22)
  84.                           Cells(r, 15) = arr(i23 + 1, j23)
  85.                           r = r + 1
  86.                         End If
  87.                       End If
  88.    
  89.                     End If
  90.                   Next
  91.                 Next
  92.                 brr(i22, j22) = 0
  93.               End If
  94.             Next
  95.           Next
  96.           brr(i21, j21) = 0
  97.         End If
  98.       Next
  99.     Next
  100.                 brr(i13, j13) = 0
  101.               Next
  102.             Next
  103.             brr(i12, j12) = 0
  104.           Next
  105.         Next
  106.         brr(i11, j11) = 0
  107.       Next
  108.     Next
  109.    
  110.     MsgBox Format(Timer - tms, "0.000s")
  111. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-4-25 20:54 | 显示全部楼层
上附件。自己运行一下看需要多少时间。

二组尾数相同.rar

19.23 KB, 下载次数: 12

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-25 21:06 | 显示全部楼层
香川群子 发表于 2014-4-25 20:50
看懂了,代码也写好了。

不过运行起来可能耗时太长……符合条件的结果太多了。

谢谢版主!
首先条件1与条件2单元格不能重复,首先条件3与条件4单元格不能重复
同时满足(1=2)*(3=4)的为一个等式

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-25 21:17 | 显示全部楼层
①A4+C2+A5
③A5+C3+A6

②C3+D3+D5
④C4+D4+D6

您看1与3差1行  2与4也差一行   这就是上面说的对应关系

1/满足1=2         2/满足3=4       3/满足上面的对应关系

三个条件都具备为一个等式,估计满足条件的不超过5个等式

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-25 21:21 | 显示全部楼层
本帖最后由 abc3d 于 2014-4-25 21:51 编辑

看到附件了,正是要的,能不能再加一个条件,求版主改为4列6行,就是1234等式之间的行数<=4.

TA的精华主题

TA的得分主题

发表于 2014-4-25 21:58 | 显示全部楼层
本帖最后由 香川群子 于 2014-4-25 22:56 编辑
abc3d 发表于 2014-4-25 21:17
①A4+C2+A5
③A5+C3+A6

经过计算,8行4列时,满足条件的①②③④算一组,那么一共有 210,211组。
2007版新程序计算和输出,总耗时大约半分钟。(检查有效组合 20,996,136组)


6行4列时,满足条件的共有 17,091组 (检查有效组合 1,725,840组)

TA的精华主题

TA的得分主题

发表于 2014-4-25 22:26 | 显示全部楼层
本帖最后由 香川群子 于 2014-4-25 22:49 编辑
abc3d 发表于 2014-4-25 21:21
看到附件了,正是要的,能不能再加一个条件,求版主改为4列6行,就是1234等式之间的行数

那这样缩减行数以后,计算结果数大大减少……剩下 17091组

程序修改:
① 行列大小自动按照A1所在区域的实际行、列数。
② 计算结果存入数组,按5000次单位输出到工作表
  1. Sub kagawa() '2014/04/25
  2.     Dim i11&, j11&, i12&, j12&, i13&, j13&
  3.     Dim i21&, j21&, i22&, j22&, i23&, j23&
  4.     Dim t11&, t21&, t12&, t22&
  5.     Dim ar, m&, n&, r&, s$, cnt&, tms#
  6.     tms = Timer
  7.    
  8.     ar = [a1].CurrentRegion
  9.     m = UBound(ar): n = UBound(ar, 2)
  10.     ReDim arr&(1 To m, 1 To n)
  11.     ReDim brr&(1 To m, 1 To n)
  12.     For i11 = 1 To m
  13.       For j11 = 1 To n
  14.         arr(i11, j11) = Cells(i11, j11)
  15.       Next
  16.     Next
  17.    
  18.     ReDim crr(1 To 10000, 1 To 15)
  19.     [h11] = 0: r = 0
  20.     [a11].CurrentRegion.Offset(2) = ""
  21.     For i11 = 1 To m - 2
  22.       For j11 = 1 To n
  23.         brr(i11, j11) = 1
  24.         For i12 = 1 To m - 1
  25.           For j12 = IIf(i11 = i12, j11 + 1, 1) To n
  26.             'If brr(i12, j12) Then Stop
  27.             brr(i12, j12) = 1
  28.             For i13 = i11 + 1 To m - 1
  29.               For j13 = IIf(i12 = i13, j12 + 1, 1) To n
  30.                 'If brr(i13, j13) Then Stop
  31.                 brr(i13, j13) = 1
  32.                
  33.     For i21 = i11 To m - 2
  34.       For j21 = IIf(i11 = i21, j11 + 1, 1) To n
  35.         If brr(i21, j21) Then
  36. '          Stop 'pass
  37.         Else
  38.           brr(i21, j21) = 1
  39.           For i22 = 1 To m - 1
  40.             For j22 = IIf(i21 = i22, j21 + 1, 1) To n
  41.               If brr(i22, j22) Then
  42. '                Stop 'pass
  43.               Else
  44.                 brr(i22, j22) = 1
  45.                 For i23 = i21 + 1 To m - 1
  46.                   For j23 = IIf(i22 = i23, j22 + 1, 1) To n
  47.                     If brr(i23, j23) Then
  48. '                      Stop 'pass
  49.                     Else
  50.                       cnt = cnt + 1   
  51.                       t11 = (arr(i11, j11) + arr(i12, j12) + arr(i13, j13)) Mod 10
  52.                       t21 = (arr(i21, j21) + arr(i22, j22) + arr(i23, j23)) Mod 10
  53.                       If t11 = t21 Then
  54.                         t12 = (arr(i11 + 1, j11) + arr(i12 + 1, j12) + arr(i13 + 1, j13)) Mod 10
  55.                         t22 = (arr(i21 + 1, j21) + arr(i22 + 1, j22) + arr(i23 + 1, j23)) Mod 10
  56.                         If t12 = t22 Then
  57. '                          Stop
  58.                           r = r + 1
  59.                           crr(r, 1) = Cells(i11, j11).Address(0, 0)
  60.                           crr(r, 2) = Cells(i12, j12).Address(0, 0)
  61.                           crr(r, 3) = Cells(i13, j13).Address(0, 0)

  62.                           crr(r, 5) = Cells(i21, j21).Address(0, 0)
  63.                           crr(r, 6) = Cells(i22, j22).Address(0, 0)
  64.                           crr(r, 7) = Cells(i23, j23).Address(0, 0)

  65.                           crr(r, 9) = Cells(i11 + 1, j11).Address(0, 0)
  66.                           crr(r, 10) = Cells(i12 + 1, j12).Address(0, 0)
  67.                           crr(r, 11) = Cells(i13 + 1, j13).Address(0, 0)

  68.                           crr(r, 13) = Cells(i21 + 1, j21).Address(0, 0)
  69.                           crr(r, 14) = Cells(i22 + 1, j22).Address(0, 0)
  70.                           crr(r, 15) = Cells(i23 + 1, j23).Address(0, 0)
  71.                           
  72.                           r = r + 1
  73.                           crr(r, 1) = arr(i11, j11)
  74.                           crr(r, 2) = arr(i12, j12)
  75.                           crr(r, 3) = arr(i13, j13)
  76.                           crr(r, 4) = t11
  77.                           crr(r, 5) = arr(i21, j21)
  78.                           crr(r, 6) = arr(i22, j22)
  79.                           crr(r, 7) = arr(i23, j23)

  80.                           crr(r, 9) = arr(i11 + 1, j11)
  81.                           crr(r, 10) = arr(i12 + 1, j12)
  82.                           crr(r, 11) = arr(i13 + 1, j13)
  83.                           crr(r, 12) = t22
  84.                           crr(r, 13) = arr(i21 + 1, j21)
  85.                           crr(r, 14) = arr(i22 + 1, j22)
  86.                           crr(r, 15) = arr(i23 + 1, j23)
  87.                           
  88.                           If r = 10000 Then
  89.                             Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(10000, 15) = crr
  90.                             [h11] = [h11] + 5000: r = 0
  91.                           End If
  92.                           
  93.                         End If
  94.                       End If
  95.    
  96.                     End If
  97.                   Next
  98.                 Next
  99.                 brr(i22, j22) = 0
  100.               End If
  101.             Next
  102.           Next
  103.           brr(i21, j21) = 0
  104.         End If
  105.       Next
  106.     Next
  107.    
  108.         Application.StatusBar = i11 & "," & j11 & " " & i12 & "," & j12 & " " & i13 & "," & j13 & "| " & [h11] + r / 2
  109.                 brr(i13, j13) = 0
  110.               Next
  111.             Next
  112.             brr(i12, j12) = 0
  113.           Next
  114.         Next
  115.         brr(i11, j11) = 0
  116.       Next
  117.     Next
  118.     [h11] = [h11] + r / 2
  119.     Application.StatusBar = i11 & "," & j11 & " " & i12 & "," & j12 & " " & i13 & "," & j13 & "| " & [h11]
  120.     If r Then Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(r, 15) = crr
  121.     MsgBox Format(Timer - tms, "0.000s ") & [h11] & " / " & cnt
  122. End Sub
复制代码
附件为2003版 和 2007版
二组尾数相同2.rar (32.14 KB, 下载次数: 21)


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-26 06:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 abc3d 于 2014-4-27 15:16 编辑
香川群子 发表于 2014-4-25 22:26
那这样缩减行数以后,计算结果数大大减少……剩下 17091组

程序修改早早起来测试一下,数据之多远远超出想象,想请版主再修改下

修改:四个等式中最后一行只能出现一个数,例如
A1        B1        A2                B2        A3        D3                A2        B2        A3                B3        A4        D4
上面四个等式的最后一行为第四行,但第四行出现A4、D4两个数,这样的等式不显示。即行数最大的一行中只有一个值参与计算。



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 04:36 , Processed in 0.037745 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表