ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 关于查找和判断单元格相连并且相加和等于25的解题思路分享

关于查找和判断单元格相连并且相加和等于25的解题思路分享

作者:绿色风 分类: 时间:2022-08-18 浏览:103
楼主
kevinchengcw
关于查找和判断单元格相连并且相加和等于25的解题思路分享

相信大家基本上都玩过扫雷游戏,游戏涉及到一个交集的问题,本问题的解题思路就借鉴了该方法,所不同的是我们是以中心单元格的交集数来判断,而不是四周。

 


我们以一个单元格为中心,其周围会有八个单元格的区域可能出现其他的单元格,如下图

   
红色是中心单元格,**Э赡艹鱿制渌行牡ピ竦姆段?/font
首先考虑,当五个单元格相连时,最少会有几个交集区,下图是交集最少的情况例子

 

 

 


也就是当两头的单元格与其他单元格只有一个交集,中间单元格与其他单元格只有两个交集时,于是我们得到了最少的单元格交集数,1+2+2+2+1=8,但是还不全对,并不是达到这个值就一定是全部紧邻的,还有下面的情况也满足数量,但并不是全部相连的

 

 


所以,除了要判断交集数量外,还要判断是否有孤立的一个或两个单元格,判断有一个孤立的单元格只需要判断五个单元格中是否有一个单元格与其他任何单元格都没有交集即可,判断两个单元格是否孤立在外则要判断是否存在两个相邻并且与其他单元格只有一个交集的情况。

思路有了,下面是看一下所面对的情况,题目中的情况如下图:

 
寻找单元格内相邻的五个数字单元格,且数值不同,相加之和等于25
第一步:将单元格范围赋值给一个Range变量,从而可以用下标提取出相应的单元格。
第二步:因为是要找出相邻的五个单元格,所以我们设置五个变量,让第一个变量值范围从1到单元计数减4,即从第一个到倒数第五个,第二个变量从第一个变量加1到单元格计数减3,即永远是第一个变量的下一个,从而保证不重复,依此类推,设定好五个变量的范围及循环嵌套关系。
第三步:循环时每个变量做为下标,先判断对应单元格是否为空值,非空时是否与外层嵌套中的变量对应的单元格值相等,全部变量满足作为下标时对应的单元格不为空且各个单元格的值全不相等,则进入下面的核心判断过程。
第四步:首先判断五个单元格的交集区域个数,用单元格坐标加offset来判断在八个offset的单元地址是否与其他单元格相同,从而判断交集数。
情况1:当有任意一个单元格的交集数为0时则跳出循环,因为这表明这是一个孤立的单元格,未与其他单元格相邻,不合题意,跳过。
情况2:当一个单元格与其他单元格的交集数为1时,继续判断与他相交的单元格与其他单元格的交集数,如果也为1,则证明是两个孤立的单元格,不符合题意,跳过。
情况3:五个判断完后相加的总和大于8且未出现上述两种情况的组合,符合题意,予以标示记录。
第五步:程序加工润色,提升视觉效果。

综上,一个提速的方法是先建立一个非空值的单元格地址数组,则可省略五个变量循环判断一次的时间。
详见附件


  1. Sub test()
  2. Dim Rng, Uni As Range
  3. Dim A, B, C, D, E, F, G, H, I, J, K, L, M, N, P, Q As Integer
  4. Dim Ad As String
  5. Dim Arr
  6. tt = MsgBox("您是否要检测搜索到的结果?", vbYesNo)
  7. If tt = vbNo Then Application.ScreenUpdating = False
  8. Set Rng = Range("g5:k12")
  9. M = Rng.Cells.Count
  10. N = 0
  11. For A = 1 To M - 4
  12.     If Rng(A) <> "" Then
  13.     For B = A + 1 To M - 3
  14.         If Rng(B) <> "" And Rng(B) <> Rng(A) Then
  15.         For C = B + 1 To M - 2
  16.             If Rng(C) <> "" And Rng(C) <> Rng(B) And Rng(C) <> Rng(A) Then
  17.             For D = C + 1 To M - 1
  18.                 If Rng(D) <> "" And Rng(D) <> Rng(A) And Rng(D) <> Rng(B) And Rng(D) <> Rng(C) Then
  19.                 For E = D + 1 To M
  20.                     If Rng(E) <> "" And Rng(E) <> Rng(A) And Rng(E) <> Rng(B) And Rng(E) <> Rng(C) And Rng(E) <> Rng(D) Then
  21.                         If Rng(A).Value + Rng(B).Value + Rng(C).Value + Rng(D).Value + Rng(E).Value = 25 Then
  22.                             Arr = Array(Rng(A).Address, Rng(B).Address, Rng(C).Address, Rng(D).Address, Rng(E).Address)
  23.                             'Debug.Print Rng(A).Address & " : " & Rng(B).Address & " : " & Rng(C).Address & " : " & Rng(D).Address & " : " & Rng(E).Address
  24.                             K = 0
  25.                             For G = 0 To 4
  26.                                 J = 0
  27.                                 For H = 0 To 4
  28.                                     If H <> G Then
  29.                                         Select Case Arr(H)
  30.                                             Case Is = Range(Arr(G)).Offset(-1, -1).Address
  31.                                                 Ad = Arr(H)
  32.                                                 J = J + 1
  33.                                             Case Is = Range(Arr(G)).Offset(-1, 0).Address
  34.                                                 Ad = Arr(H)
  35.                                                 J = J + 1
  36.                                             Case Is = Range(Arr(G)).Offset(-1, 1).Address
  37.                                                 Ad = Arr(H)
  38.                                                 J = J + 1
  39.                                             Case Is = Range(Arr(G)).Offset(0, -1).Address
  40.                                                 Ad = Arr(H)
  41.                                                 J = J + 1
  42.                                             Case Is = Range(Arr(G)).Offset(0, -1).Address
  43.                                                 Ad = Arr(H)
  44.                                                 J = J + 1
  45.                                             Case Is = Range(Arr(G)).Offset(1, -1).Address
  46.                                                 Ad = Arr(H)
  47.                                                 J = J + 1
  48.                                             Case Is = Range(Arr(G)).Offset(1, 0).Address
  49.                                                 Ad = Arr(H)
  50.                                                 J = J + 1
  51.                                             Case Is = Range(Arr(G)).Offset(1, 1).Address
  52.                                                 Ad = Arr(H)
  53.                                                 J = J + 1
  54.                                         End Select
  55.                                     End If
  56.                                 Next H
  57.                                 If J = 0 Then GoTo skip1
  58.                                 If J = 1 Then
  59.                                     Q = 0
  60.                                     For L = 0 To 4
  61.                                         P = 0
  62.                                         If Arr(L) <> Ad Then
  63.                                             Select Case Arr(L)
  64.                                                 Case Is = Range(Ad).Offset(-1, -1).Address
  65.                                                     P = P + 1
  66.                                                 Case Is = Range(Ad).Offset(-1, 0).Address
  67.                                                     P = P + 1
  68.                                                 Case Is = Range(Ad).Offset(-1, 1).Address
  69.                                                     P = P + 1
  70.                                                 Case Is = Range(Ad).Offset(0, -1).Address
  71.                                                     P = P + 1
  72.                                                 Case Is = Range(Ad).Offset(0, -1).Address
  73.                                                     P = P + 1
  74.                                                 Case Is = Range(Ad).Offset(1, -1).Address
  75.                                                     P = P + 1
  76.                                                 Case Is = Range(Ad).Offset(1, 0).Address
  77.                                                     P = P + 1
  78.                                                 Case Is = Range(Ad).Offset(1, 1).Address
  79.                                                     P = P + 1
  80.                                             End Select
  81.                                         End If
  82.                                         Q = Q + P
  83.                                     Next L
  84.                                     If Q = 1 Then GoTo skip1
  85.                                 End If
  86.                                 K = K + J
  87.                             Next G
  88.                             If K < 8 Then GoTo skip1
  89.                             N = N + 1
  90.                             If tt = vbYes Then
  91.                                 Rng(A).Interior.Color = vbRed
  92.                                 Rng(B).Interior.Color = vbRed
  93.                                 Rng(C).Interior.Color = vbRed
  94.                                 Rng(D).Interior.Color = vbRed
  95.                                 Rng(E).Interior.Color = vbRed
  96.                                 ask = MsgBox("检测结果,是继续,否退出程序", vbYesNo)
  97.                                 Rng(A).Interior.Color = xlNone
  98.                                 Rng(B).Interior.Color = xlNone
  99.                                 Rng(C).Interior.Color = xlNone
  100.                                 Rng(D).Interior.Color = xlNone
  101.                                 Rng(E).Interior.Color = xlNone
  102.                                 If ask = vbNo Then Exit Sub
  103.                             End If
  104.                         End If
  105.                     End If
  106. skip1:
  107.                 Next E
  108.                 End If
  109.             Next D
  110.             End If
  111.         Next C
  112.         End If
  113.     Next B
  114.     End If
  115. Next A
  116. Application.ScreenUpdating = True
  117. MsgBox "共找到 " & N & " 种组合", vbOKOnly, ""
  118. End Sub

查找和判断单元格相邻并且相加和等于25.rar
关于查找和判断单元格相邻并且相加和等于25的解题思路分享.rar
查找和判断单元格相邻并且相加和等于25_07版.rar
2楼
rongjun
学习K版代码

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap