【问题标题】:Excel VBA. Need a macro to randomize permutations (3p3) 3 times without repeating any permutationExcel VBA。需要一个宏来随机化排列(3p3)3次而不重复任何排列
【发布时间】:2012-11-01 17:26:11
【问题描述】:

我有 9 个单元格(我认为分为 3 组),每组包含字母 A、B 和 C。3 组之间的顺序是平衡的,因此没有字母在同一位置两次,例如:

A B C C A B B A C

我还有 3 个包含字母 d、e 和 f 的单元格。我想使用以下规则将 d、e 和 f 分配给 A、B 和 C:

  1. d、e 和 f 在每个组中分别表示一次。
  2. d、e 和 f 分别与 A、B 和 C 组合一次

例如:

Ad Be Cf Ce Af Bd Bf Ae Cd

基本上我想编写一个 VBA 宏,它给我随机分配 d e f 到 A B C 遵循这些规则。我希望宏通过将包含 d e f 的单元格放在包含 A B C 的单元格下方来向我展示这一点。

抱歉,我什至还没有尝试编写代码来执行此操作,如果这是一个有点令人困惑/格式不正确的问题,我也很抱歉。我是 VBA 和 stackexchange 的新手,在解释这个问题时遇到了一些麻烦。

干杯

【问题讨论】:

  • 这似乎与 stackoverflow.com/q/8760185/973283 重复。如果不是,您需要解释为什么您的要求不同。
  • 我无法理解该线程,但我认为这是不同的,因为 a)我想随机生成这些排列,而不是全部列出,b)我只想要 3 个的完整排列遵守我列出的规则的三组,即 Ad Be Cf Ce Af Bd Bf Ae Cd 是一个解决方案,因为它有 9 列

标签: vba excel


【解决方案1】:

如果一行的开头有四个空格,则该行以固定大小的字体输出。这用于代码,但也允许您创建您所寻找的图像。我最好的猜测是你有这样的东西:

   |  A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  J  |
 --+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
 1 |  A  |  B  |  C  |     |     |     |  d  |  e  |  f  |     |
 2 |     |     |     |     |     |     |     |     |     |     |
 3 |     |     |     |     |     |     |     |     |     |     |

从这个起始位置,下面的代码创建:

   |  A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  J  |
 --+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
 1 |  A  |  B  |  C  |     |     |     |  d  |  e  |  f  |     |
 2 |     |     |     |     |     |     |     |     |     |     |
 3 |  Ad |  Ae |  Af |  Bd |  Be |  Bf |  Cd |  Ce |  Cf |     |

我的输出值与您的输出值不同,但不在您的规则列表中。

您说您有第一组值的三个版本,每个可能的序列中都有一个。你没有解释第二个和第三个版本的目的,所以我没有包括它们。

如果这不是您想要的,您必须对您的要求提供更完整的解释。

Option Explicit
Sub Permutate()

  Dim ColDestCrnt As Long

  Dim ColSrc1First As Long
  Dim ColSrc1Crnt As Long
  Dim ColSrc1Last As Long

  Dim ColSrc2First As Long
  Dim ColSrc2Crnt As Long
  Dim ColSrc2Last As Long

  Dim RowSrc1 As Long
  Dim RowSrc2 As Long
  Dim RowDest As Long

  ' Specify the position of the first set of source values
  RowSrc1 = 1
  ColSrc1First = 1      ' Column A
  ColSrc1Last = 3       ' Column C

  ' Specify the position of the second set of source values
  RowSrc2 = 1
  ColSrc2First = 6      ' Column F
  ColSrc2Last = 8       ' Column H

  ' Specify the start the destination
  RowDest = 3
  ColDestCrnt = 1

  With Worksheets("Sheet1")

    ' Loop through first set of values and within that loop through
    ' the second set.
    For ColSrc1Crnt = ColSrc1First To ColSrc1Last
      For ColSrc2Crnt = ColSrc2First To ColSrc2Last
        ' Combine one value from the first set with one value in the second set.
        .Cells(RowDest, ColDestCrnt).Value = _
             .Cells(RowSrc1, ColSrc1Crnt).Value & _
             .Cells(RowSrc2, ColSrc2Crnt).Value
        ColDestCrnt = ColDestCrnt + 1
      Next
    Next
  End With

End Sub       

【讨论】:

  • @Luke 如果我的回答有帮助,我很高兴,但我不明白为什么。您的问题是如此简单,以至于我不会费心创建一个程序来解决它。真正的问题是否更复杂,但您相信您可以调整我的代码来解决它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多