Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3730|回复: 27

[VBA] 用VBA判断平行四边形填充绿色底单元格

[复制链接]
发表于 2016-10-1 08:20 | 显示全部楼层 |阅读模式
本帖最后由 laoau138 于 2016-10-1 08:21 编辑

用VBA判断平行四边形填充绿色底单元格

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-10-1 21:33 | 显示全部楼层
很有意思的题目,大家开动脑筋想啊。
回复

使用道具 举报

发表于 2016-10-1 21:37 | 显示全部楼层
本帖最后由 today0427 于 2016-10-1 21:58 编辑

大神你来做,我来学习!
看了一下,这个题目好像还挺复杂的
回复

使用道具 举报

发表于 2016-10-2 10:27 | 显示全部楼层
  1. Sub tt()
  2.     arr = Range("c11:c" & [c65536].End(3).Row)
  3.     n = UBound(arr)
  4.       
  5.     Set dic = CreateObject("scripting.dictionary")   '储存任意2点的向量所对应的2行
  6.     For i = 1 To n - 1           'n - 1
  7.         k1 = arr(i, 1)
  8.         For j = i + 1 To i + 8     '最大不超过10行
  9.             If j <= n Then
  10.                 k2 = arr(j, 1)
  11.                 xkey = k2 - k1 & "," & j - i  '以向量为key(相同向量表示方向相同,长度相同,2条相同向量可以组成一个平行四边形
  12.                 dic(xkey) = dic(xkey) & "/" & i & "、" & j  '以2行行数为item
  13.             End If
  14.         Next
  15.     Next
  16.    
  17.    
  18.     Set d = CreateObject("scripting.dictionary")
  19.     For Each xkey In dic.keys   '对于相同向量
  20.         y = Mid(dic(xkey), 2)     '取行
  21.         If InStr(y, "/") > 0 Then       '如果超过4个点,可组成平行四边形
  22.             yrr = Split(y, "/")
  23.             For k1 = 0 To UBound(yrr) - 1     '第1、2点
  24.                 ij1 = yrr(k1)
  25.                 i1 = Val(ij1)
  26.                 j1 = Val(Mid(ij1, InStr(ij1, "、") + 1))
  27.                 For k2 = k1 + 1 To UBound(yrr)      '第3、4点
  28.                     ij2 = yrr(k2)
  29.                     i2 = Val(ij2)
  30.                     j2 = Val(Mid(ij2, InStr(ij2, "、") + 1))
  31.                     If i1 <> i2 And i1 <> j2 And j1 <> i2 And j1 <> j2 Then    '没有重合点
  32.                        If j2 - i1 <= 10 Then     '行数限制
  33.                             If j1 > i2 Then       '各点从小到大,进字典去重
  34.                                 d(i1 & "、" & i2 & "、" & j1 & "、" & j2) = ""
  35.                             Else
  36.                                 d(i1 & "、" & j1 & "、" & i2 & "、" & j2) = ""
  37.                             End If
  38.                        End If
  39.                     End If
  40.                 Next
  41.             Next
  42.         End If
  43.     Next
  44.     [y:y] = ""   '显示结果
  45.     If d.Count > 0 Then [y1].Resize(d.Count) = Application.Transpose(d.keys)
  46. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2 +9 收起 理由
today0427 + 6 发现我的结果比你的少了好多,大神帮我看看.
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-10-2 10:28 | 显示全部楼层
结果显示在Y列,每行表示符合条件的4个点。里面的行数是相对于第11行的相对行数。

评分

参与人数 2 +9 收起 理由
today0427 + 6 妈呀终于看懂了,思路太巧妙了,棒!
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-10-2 11:59 | 显示全部楼层
grf1973 发表于 2016-10-2 10:28
结果显示在Y列,每行表示符合条件的4个点。里面的行数是相对于第11行的相对行数。

你在搞什么,把组成平行四边形的行号   放到Y列

需要对,组成平行四边形的数字单元格填充  颜色
回复

使用道具 举报

发表于 2016-10-2 17:22 | 显示全部楼层
本帖最后由 today0427 于 2016-10-2 20:14 编辑

这题把我快弄头昏死,做完了,都变绿了,我也没办法,结果的行号和列号显示在V列和W列,每四个为一组,反正我测试了,每四个确实能组成平行四边形,楼主也没说清楚要求,我是把所有的平行四边形的可能性全部列出来了,有重复利用的单元格。
  1. Dim arr(), n&, brr(1 To 10000, 1 To 2), k&, h&
  2. Sub pxsbx() '平行四边形
  3.     Dim rng As Range, rg As Range, i&
  4.     e = Sheets("sheet2").[a65536].End(3).Row
  5.     Set rng = Range("e11:t" & e)
  6.     ReDim arr(1 To e, 1 To 2)
  7.     For Each rg In rng
  8.         If rg <> "" Then
  9.             i = i + 1: arr(i, 1) = rg.Row: arr(i, 2) = rg.Column
  10.         End If
  11.     Next
  12.     For n = 1 To UBound(arr) - 3
  13.         Call r2(n)
  14.     Next
  15. '    MsgBox k
  16.     With Sheets("sheet2")
  17.         For i = 1 To k
  18.             .Cells(brr(i, 1), brr(i, 2)).Interior.ColorIndex = 4
  19.         Next
  20.         .[v13].Resize(k, 2).Clear
  21.         .[v13].Resize(k, 2) = brr
  22.     End With
  23.     Erase brr: Erase arr: n = 0: h = 0: k = 0
  24. End Sub
  25. Function r2(n)
  26.     Dim hc%, lc%, i&
  27.     For i = n + 1 To n + 7
  28.         If i < UBound(arr) - 2 Then
  29.             hc = arr(i, 1) - arr(n, 1): lc = arr(i, 2) - arr(n, 2)
  30.             Call r34(hc, lc, i)
  31.         End If
  32.     Next
  33. End Function
  34. Function r34(hc, lc, m)
  35.     Dim i&, j&
  36.     For i = m + 1 To n + 8
  37.         For j = i + 1 To i + hc
  38.             If arr(j, 1) - arr(n, 1) < =10 And arr(j, 1) - arr(i, 1) = hc And arr(j, 2) - arr(i, 2) = lc Then
  39.                 k = k + 1
  40.                 brr(k, 1) = arr(n, 1): brr(k, 2) = arr(n, 2)
  41.                 brr(k + 1, 1) = arr(m, 1): brr(k + 1, 2) = arr(m, 2)
  42.                 brr(k + 2, 1) = arr(i, 1): brr(k + 2, 2) = arr(i, 2)
  43.                 brr(k + 3, 1) = arr(j, 1): brr(k + 3, 2) = arr(j, 2)
  44.                 k = k + 3: Exit For
  45.             End If
  46.         Next
  47.     Next
  48. End Function

复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-10-2 18:10 | 显示全部楼层

高手再看这个

用VBA推算组成平行四边形最后一个数字

http://www.excelpx.com/thread-424828-1-1.html


回复

使用道具 举报

 楼主| 发表于 2016-10-2 18:10 | 显示全部楼层
today0427 发表于 2016-10-2 17:22
这题把我快弄头昏死,做完了,都变绿了,我也没办法,结果的行号和列号显示在V列和W列,每四个为一组,反正 ...

高手再看这个

用VBA推算组成平行四边形最后一个数字

http://www.excelpx.com/thread-424828-1-1.html


回复

使用道具 举报

发表于 2016-10-2 18:26 | 显示全部楼层
grf1973 发表于 2016-10-2 10:28
结果显示在Y列,每行表示符合条件的4个点。里面的行数是相对于第11行的相对行数。

大神,有空帮我看看为什么我的结果比你少了好多组,查看了你的结果确实对着,但是我的代码哪里有漏洞了?辛苦大神了!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 21:54 , Processed in 0.331448 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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