Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA创建所有可能的组合(无重复)_Vba_Excel - Fatal编程技术网

Excel VBA创建所有可能的组合(无重复)

Excel VBA创建所有可能的组合(无重复),vba,excel,Vba,Excel,我需要以下excel和VBA问题的帮助 这里的想法是在每个分组中生成所有可能的组合(不重复) 输入 输出 COLUMN A | COLUMN B A | X A | D X | D X | A D | A D | X C | E E | C 我所做的。。。。如何仅当数据在同一组中时才让其运行 Option Explicit Sub Sample() Dim i As Long, j As Long Dim CountComb As Long, lastrow

我需要以下excel和VBA问题的帮助

这里的想法是在每个分组中生成所有可能的组合(不重复)

输入

输出

COLUMN A | COLUMN B

A | X

A | D

X | D

X | A

D | A

D | X

C | E

E | C
我所做的。。。。如何仅当数据在同一组中时才让其运行

Option Explicit

Sub Sample()

    Dim i As Long, j As Long
    Dim CountComb As Long, lastrow As Long

    Application.ScreenUpdating = False

    CountComb = 0: lastrow = 1

    For i = 1 To 10: For j = 1 To 10

        Range("G" & lastrow).Value = Range("A" & i).Value & "/" & _
                                     Range("B" & j).Value

        lastrow = lastrow + 1
        CountComb = CountComb + 1
    Next: Next

    Application.ScreenUpdating = True
End Sub

见下文注意:您需要在工具>>参考中添加参考Microsoft脚本运行时。将范围(“A1:A5”)更改为动态命名范围或静态范围,该例程将为您处理其余部分。它显示从G1开始的结果,但您也可以更改此值/将动态设置为与数据范围的偏移量。由你决定

Option Explicit
Option Base 1

Dim Data As Dictionary

Sub GetCombinations()

    Dim dataObj As Variant
    Dim returnData As Variant
    Set Data = New Dictionary
    Dim i As Double

    dataObj = Range("A1:B5").Value2

    ' Group Data
    For i = 1 To UBound(dataObj) Step 1

        If (Data.Exists(dataObj(i, 2))) Then
            Data(dataObj(i, 2)) = Data(dataObj(i, 2)) & "|" & dataObj(i, 1)
        Else
            Data.Add dataObj(i, 2), dataObj(i, 1)
        End If

    Next i

    ' Extract combinations from groups
    returnData = CalculateCombinations().Keys()

    Range("G1").Resize(UBound(returnData) + 1, 1) = Application.WorksheetFunction.Transpose(returnData)

End Sub

Private Function CalculateCombinations() As Dictionary

    Dim i As Double, j As Double
    Dim datum As Variant, pieceInner As Variant, pieceOuter As Variant
    Dim Combo As New Dictionary
    Dim splitData() As String

    For Each datum In Data.Items

        splitData = Split(datum, "|")
        For Each pieceOuter In splitData
            For Each pieceInner In splitData

                If (pieceOuter <> pieceInner) Then

                    If (Not Combo.Exists(pieceOuter & "|" & pieceInner)) Then
                        Combo.Add pieceOuter & "|" & pieceInner, vbNullString
                    End If

                End If

            Next pieceInner
        Next pieceOuter

    Next datum

    Set CalculateCombinations = Combo

End Function
选项显式
选项基数1
Dim数据作为字典
子集合()
Dim dataObj作为变型
Dim返回数据作为变量
设置数据=新字典
我是双人的
dataObj=范围(“A1:B5”)。值2
"集团数据",
对于i=1到uBond(dataObj)步骤1
如果(Data.Exists(dataObj(i,2)),那么
数据(dataObj(i,2))=数据(dataObj(i,2))&“|”和dataObj(i,1)
其他的
添加dataObj(i,2),dataObj(i,1)
如果结束
接下来我
'从组中提取组合
returnData=CalculateCompositions().Keys()
范围(“G1”).Resize(UBound(returnData)+1,1)=Application.WorksheetFunction.Transpose(returnData)
端接头
专用函数calculateCompositions()作为字典
尺寸i为双精度,j为双精度
尺寸基准作为变型,内件作为变型,外件作为变型
Dim Combo作为新词典
Dim splitData()作为字符串
数据项中的每个基准
拆分数据=拆分(基准面“|”)
对于splitData中的每个pieceOuter
对于splitData中的每个片段内部
如果(外件内件),则
如果(不存在Combo.Exists(pieceOuter&“|”&pieceInner)),则
组合。添加pieceOuter&“|”和pieceInner,vbNullString
如果结束
如果结束
下一段
下一步
下一个基准
设置CalculateCompositions=Combo
端函数

我看不出问题出在哪里。。。只需要设置一些变量,不是吗?我曾尝试使用Excel中的公式来完成它,但如果没有VBA,这似乎是不可能完成的任务。我不知道如何从VBA开始。@user1839229您知道,我有点抱歉,您的问题结束了,因为我认为,您确实有一个好问题,只是以一种非常不幸运的方式问了它。你应该编辑你的初始问题,扔掉这个问题,并尝试重新打开原始问题,现在,你已经在自己努力解决这个问题。投票重新开始-当原来的问题也被关闭时,作为他原来问题的重复关闭没有意义-他永远不会得到答案。B栏中的数字的目的是什么,它们可以被忽略?不知道为什么要删除空白以使其难以阅读!
Option Explicit
Option Base 1

Dim Data As Dictionary

Sub GetCombinations()

    Dim dataObj As Variant
    Dim returnData As Variant
    Set Data = New Dictionary
    Dim i As Double

    dataObj = Range("A1:B5").Value2

    ' Group Data
    For i = 1 To UBound(dataObj) Step 1

        If (Data.Exists(dataObj(i, 2))) Then
            Data(dataObj(i, 2)) = Data(dataObj(i, 2)) & "|" & dataObj(i, 1)
        Else
            Data.Add dataObj(i, 2), dataObj(i, 1)
        End If

    Next i

    ' Extract combinations from groups
    returnData = CalculateCombinations().Keys()

    Range("G1").Resize(UBound(returnData) + 1, 1) = Application.WorksheetFunction.Transpose(returnData)

End Sub

Private Function CalculateCombinations() As Dictionary

    Dim i As Double, j As Double
    Dim datum As Variant, pieceInner As Variant, pieceOuter As Variant
    Dim Combo As New Dictionary
    Dim splitData() As String

    For Each datum In Data.Items

        splitData = Split(datum, "|")
        For Each pieceOuter In splitData
            For Each pieceInner In splitData

                If (pieceOuter <> pieceInner) Then

                    If (Not Combo.Exists(pieceOuter & "|" & pieceInner)) Then
                        Combo.Add pieceOuter & "|" & pieceInner, vbNullString
                    End If

                End If

            Next pieceInner
        Next pieceOuter

    Next datum

    Set CalculateCombinations = Combo

End Function