ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 随机男女配对

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-19 19:37 | 显示全部楼层 |阅读模式
最近在开放式竞赛专区看到一函数竞赛题,感到很有意思,请喜爱VBA的坛友试试练练手
http://club.excelhome.net/forum. ... peid%26typeid%3D102

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-19 19:39 | 显示全部楼层
抛砖引玉,先贴出我的代码
  1. Sub dsmch()
  2. arr = Range("a1").CurrentRegion
  3. For i = 2 To UBound(arr)
  4.     p = "": p3 = ""
  5.     For j = 2 To UBound(arr, 2) '单双(10)
  6.         p = p & arr(i, j) Mod 2
  7.     Next
  8.     If arr(i, 2) Mod 2 = 1 Then
  9.         zf = "10": GoSub 100
  10.         For j = 2 To Len(p2) Step 2
  11.            If Val(Mid(p2, j, 1)) - Val(Mid(p2, j - 1, 1)) < 0 Then p3 = p3 & " " & Mid(p2, j - 1, 2)
  12.         Next
  13.         p2 = Mid(p3, 2)
  14.     Else
  15.         zf = "01": GoSub 100
  16.         For j = 2 To Len(p2) Step 2
  17.            If Val(Mid(p2, j, 1)) - Val(Mid(p2, j - 1, 1)) > 0 Then p3 = p3 & " " & Mid(p2, j - 1, 2)
  18.         Next
  19.         p2 = Mid(p3, 2)
  20.     End If
  21.     Cells(i, "o") = p2
  22. Next
  23. Exit Sub
  24. 100:
  25. s = 1: p2 = ""
  26. Do Until s = 0
  27.     For k = 1 To Len(zf)
  28.         Z = Mid(zf, k, 1)
  29.         y = InStr(s, p, Z)
  30.         If y <> 0 Then p2 = p2 & arr(i, y + 1): s = y + 1 Else Exit Do
  31.     Next
  32. Loop
  33. Return
  34. End Sub
复制代码

奇偶配对解题88.rar

22.69 KB, 下载次数: 31

TA的精华主题

TA的得分主题

发表于 2019-1-19 20:15 | 显示全部楼层
本帖最后由 一把小刀闯天下 于 2019-1-20 10:04 编辑

'示例有问题的吧,,,
=========
'按规则修改了一下:

Option Explicit

Sub test()
  Dim arr, i, j, k, s As String
  arr = [b2:k25]
  For i = 1 To UBound(arr, 1)
    For j = 1 To UBound(arr, 2)
      If (arr(i, 1) + arr(i, j)) Mod 2 = 0 Then
        For k = j + 1 To UBound(arr, 2)
          If (arr(i, j) + arr(i, k)) Mod 2 = 1 Then
            If arr(i, j) Mod 2 = 0 Xor arr(i, j) > arr(i, k) Then s = s & Space(1) & arr(i, j) & arr(i, k)
            j = k: Exit For
          End If
        Next
      End If
    Next
    arr(i, 1) = s: s = vbNullString
  Next
  [m2].Resize(UBound(arr, 1)) = arr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-19 20:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2019-1-19 20:15
'示例有问题的吧,,,
Option Explicit

数字代表年龄,单数为男,双数为女,配对的男女,男的年龄大于女的年龄。单数开始的配对单双、单双……
双数开始的配对双单、双单…………

TA的精华主题

TA的得分主题

发表于 2019-1-19 21:29 | 显示全部楼层
  1. Sub biandui()
  2.     Dim arr(23)
  3.     brr = [b2:k25]
  4.     For i = 1 To 24
  5.         br = Array("", "", "", "", "", "", "", "", "", "")
  6.         n = 0: br(n) = brr(i, 1)
  7.         For k = 2 To 10
  8.             If Val(brr(i, k) + brr(i, k - 1)) Mod 2 Then n = n + 1: br(n) = brr(i, k)
  9.         Next
  10.         For k = 1 To 9 Step 2
  11.             If Val(br(0)) Mod 2 And br(k) < br(k - 1) Or Val(br(0)) Mod 2 = 0 And br(k) > br(k - 1) And br(k) <> "" Then x = x & br(k - 1) & br(k) & " "
  12.         Next
  13.         arr(m) = x: x = "": m = m + 1
  14.     Next
  15.     [n2:n25] = Application.Transpose(arr)
  16. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-1-19 21:30 | 显示全部楼层
直接引用区域,总觉得应该有简单的办法,代码比函数写的还复杂

TA的精华主题

TA的得分主题

发表于 2019-1-19 21:46 | 显示全部楼层
dsmch 发表于 2019-1-19 20:48
数字代表年龄,单数为男,双数为女,配对的男女,男的年龄大于女的年龄。单数开始的配对单双、单双……
...

嗯,找了一下规律是这样的。如果行开始男女不限后面条件相同不晓得公式是否能解决。我不会公式,就算单数开始要用公式去解决也是挺难想象的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-20 06:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-20 06:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 dsmch 于 2019-1-20 08:30 编辑
一把小刀闯天下 发表于 2019-1-19 21:46
嗯,找了一下规律是这样的。如果行开始男女不限后面条件相同不晓得公式是否能解决。我不会公式,就算单数 ...


有同感!原以为,函数能做到的,用VBA是小菜一碟。细想一下,函数就是用的固化后自定义函数和api函数,和vba彼此不分家

TA的精华主题

TA的得分主题

发表于 2019-1-20 19:25 | 显示全部楼层
还是VBA好,循环加判断,楼上几位老师的代码很精简,我来篇作文
  1. Sub qq()
  2. Dim arr, r%, i%, j%, m%, s$, brr() As String
  3. r = Cells(Rows.Count, 1).End(xlUp).Row
  4. arr = Range("b2:k" & r)
  5. ReDim brr(1 To UBound(arr), 1 To 1)
  6. For i = 1 To UBound(arr)
  7. m = arr(i, 1) Mod 2: s = arr(i, 1)
  8. For j = 2 To UBound(arr, 2)
  9. If s = "" And arr(i, j) Mod 2 = m Then s = arr(i, j)
  10. If arr(i, j) Mod 2 <> m Then
  11. If m Then
  12. If Val(s) > arr(i, j) And s <> "" Then
  13. brr(i, 1) = brr(i, 1) & " " & s & arr(i, j)
  14. s = ""
  15. Else
  16. s = ""
  17. End If
  18. Else
  19. If Val(s) < arr(i, j) And s <> "" Then
  20. brr(i, 1) = brr(i, 1) & " " & s & arr(i, j)
  21. s = ""
  22. Else
  23. s = ""
  24. End If
  25. End If
  26. End If
  27. Next
  28. Next
  29. [n2].Resize(UBound(brr)).Clear
  30. [n2].Resize(UBound(brr)) = brr
  31. End Sub
复制代码

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-24 23:13 , Processed in 0.038604 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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