以“简单组合”的方式组合细胞

时间:2018-01-09 14:53:05

标签: excel vba excel-vba combinatorics

我在几个论坛和网站上寻找了一种方法,但没有发现任何线索...... 希望可以有人帮帮我!

以下是我拥有的数据示例:

My Data

我希望对这些单元格进行排列,输出对反映特定学生在这些组中进行交互的次数。 换句话说,它是一个简单的组合。对于每个小组,

  • 有n!/ p!*(n-p)!互动的可能性,
  • 其中“n”是每组中学生的数量(样本中,从2到4)
  • 和“p”等于2(相互作用对)。
  

请注意,每个学生群都有不同数量的学生。

因此,输出将是这样的:

enter image description here

这是我的第一篇文章,但我希望我说得够清楚。

2 个答案:

答案 0 :(得分:0)

免责声明:当您尝试解决问题时,阅读rules in StackOverflow关于提问和提供一些代码的确是个好主意。 StackOverflow不是免费的编码服务等。

Howerver,至少你拍了截图,这是什么。在某种方式。 下一步尝试将Excel单元格的值传递给数组或列表(无论您想要什么)。就我而言,我已将其硬编码为group1group4。这些组是数字而不是名称的一致,因为这种方式更快一点,更容易理解。在您的示例中,您可以考虑在最后重新映射它们:

Public Sub TestMe()

    Dim group1, group4
    Dim groupOfAll, group
    Dim student
    Dim cnt         As Long
    Dim cnt2        As Long

    group1 = Array(1, 2, 3)
    group4 = Array(4, 5, 6, 7)
    groupOfAll = Array(group1, group4)

    For Each group In groupOfAll
        cnt2 = 1
        For Each student In group
            For cnt = LBound(group) + cnt2 To UBound(group)
                Debug.Print student; "<>"; group(cnt)
            Next cnt
            cnt2 = cnt2 + 1
        Next student
        Debug.Print "----party------"
    Next group

End Sub

代码中棘手的部分是每个人循环每个人,但是在你完成第一个人之后,你不会再次循环他。这是通过For cnt = LBound(group) + cnt2 To UBound(group)cnt2=cnt2+1实现的。 cnt2 = 1,因为我们从位置0的数组中的第一个元素开始,我们引入&#34;这个学生到下一个。这是结果:

 1 <> 2 
 1 <> 3 
 2 <> 3 
----party------
 4 <> 5 
 4 <> 6 
 4 <> 7 
 5 <> 6 
 5 <> 7 
 6 <> 7 
----party------

答案 1 :(得分:-1)

不幸的是,我没有设法在VBA中对此进行编码。相反,我用Python做到了。这是代码,如果有人也需要这个代码:

from itertools import combinations

groups = open("C:\file.csv", "r")
students = groups.readlines()
for line in students:
    students2 = line.split(",")
    students3 = list(combinations(students2, 2))
    for edges in students3:
        edges2 = str(edges)
        print(edges2)

groups.close()

无论如何,谢谢大家。