【问题标题】:VBA Macro for creating combinations用于创建组合的 VBA 宏
【发布时间】:2015-09-11 12:46:27
【问题描述】:

我正在尝试为下面提到的情况编写一个宏。

输入是:

Col A   Col B
A       B
A       C
B       D
C       A
C       B
C       E
D       A
D       B
E       A

我正在尝试进行组合,例如 输出:

A   B   D   A       
A   C   A           
A   C   B   D   A   
A   C   E   A       
B   D   B           
C   A   B   D   A   C
C   A   C           
C   B   D   A   C   
C   E   A   C

|
|
|

等等

输出可以在同一个工作表上。

输出的起点和终点应该相同。 循环应从第一行开始,并以起点和终点相同的方式寻找组合。

我根本不知道如何创建这样的循环。

请提出一些想法。

【问题讨论】:

  • 我认为您需要编辑您的问题,然后再次尝试描述您想要的内容。根据您的描述,我希望第一个输出行是“ABCA”,因为它以“A”开头,并以第二列中第一次出现的“A”结束。但这不是你所期望的。
  • 我很抱歉没有提到这一点,但输出基本上是一个循环。因此,对于第一行,算法应该从 col B 中获取值,即“B”,并在 col A 中查找“B”。如果 Col A 具有“B”,那么它应该检查“B”是否具有值“A”(colB ) 或不。如果是,那么它应该构成循环并且应该在输出中。如果不是,那么它将采用“B”旁边的值,即“D”(在这种情况下)并在 Col A 中查找“D”。如果“D”在 Col A 中,那么它应该在旁边查找“A” D. 如果有“A”,则循环完成。我希望这是有道理的。我知道这很令人困惑。

标签: excel vba


【解决方案1】:

有向图,避免循环和递归。美丽的挑战。 代码需要很多改进,但现在是凌晨 1 点,我不得不在家安装 Excel:/

我假设您的数据在 A1:B9 范围内。解决方案打印在即时窗口中(您自己的格式工作)。

Option Explicit

Sub EveningFun()

    Dim rCell As Range
    Dim rRng As Range

    Dim goal As String

    Dim availablePaths(1 To 9) As Boolean

    Dim i As Integer

    For i = 1 To 9
        availablePaths(i) = True
    Next i


    Set rRng = Sheet1.Range("A1:A9")

    For Each rCell In rRng.Cells
        goal = rCell.value

        Call RecursiveFun(goal, rCell.Offset(0, 1).value, goal, availablePaths)

    Next rCell

End Sub

Sub RecursiveFun(goal As String, nextElement As String, path As String, availablePaths() As Boolean)

    Dim rCell As Range
    Dim rRng As Range

    Set rRng = Sheet1.Range("A1:A9")

    For Each rCell In rRng.Cells

        If goal = nextElement Then
            'Debug.Print path & nextElement
             Range("D" & Rows.Count).End(xlUp).Cells.Offset(1, 0) = path & nextElement
             Exit Sub
        End If

        If nextElement = rCell.value And availablePaths(rCell.Row) Then
            Dim onePathLess(1 To 9) As Boolean
            Call CopyArrays(availablePaths(), onePathLess())
            'some key place, we have to avoid cycles
            onePathLess(rCell.Row) = False

            Call RecursiveFun(goal, rCell.Offset(0, 1).value, path & nextElement, onePathLess())
        End If

    Next rCell

End Sub

Sub CopyArrays(source() As Boolean, target() As Boolean)

    Dim i As Integer

    For i = 1 To 9
        target(i) = source(i)
    Next i

End Sub

+4 表示非常棒的任务,但 -3 表示没有尝试。

【讨论】:

  • ;] 。我希望你觉得上面有用。 GL!
  • 非常感谢!这真的很有帮助。我现在有一些好的开始。我添加了宏,但它没有给我任何输出或任何结果。但我正在努力,并会尽快给你一些反馈。我很抱歉一开始就没有写我的代码。其实我是 Macro 的新手,我不想让观众感到困惑。
  • 这么快的教程。转到 VBA 编辑器 *alt+f11"。打开即时窗口 "ctrl+G"。转到 Sheet1 中的代码。点击进入函数 EveningFun() 的主体。按 F5。Tadam!
  • 谢谢.. 我知道如何运行宏,但是在这种情况下,当我运行它时,我没有收到任何错误或结果。有没有办法可以在这里发布测试文件?
  • 这是我的输出:abda aca acbda acea bdab bdacab bdacb bdaceab bdb cabdac cac cbdac ceabdac ceac dabd dacabd dacbd daceabd eabdace eace dbd。您是否提交了从 A1 到 B9 的单元格?
猜你喜欢
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2013-05-25
  • 2022-11-01
  • 1970-01-01
  • 2021-01-28
  • 2013-09-20
相关资源
最近更新 更多