2013-05-29 76 views
2

我搜遍了整个网站,试图寻找一个宏(或函数),它将从相邻列中的给定列表中创建唯一的组合。在Excel中创建组合VBA

所以基本上,我有:

A 1 F1 R1 
B 2 F2 
C  F3 
D 
E 

而且我想列出所有的信息(在同一个工作表,并在不同的列):

A 1 F1 R1 
A 1 F2 R1 
A 1 F3 R1 
A 2 F1 R1 
A 2 F2 R1 
A 2 F3 R1 
B 1 F1 R1 
B 1 F2 R1 
B 1 F3 R1 
B 2 F1 R1 
B 2 F2 R1 
B 2 F3 R1 
...etc. 

(加奖金能够切换列表在纸上打印的位置)

+0

由于您的示例似乎无法正确显示此功能,因为您缺少大量值并正在行间混合项目,所以您不清楚“独特组合”的含义。 – enderland

+0

你到底是什么?你是否在这个列表中包含了单元格名称? – Bathsheba

+0

一组中总是有4个项目吗?该集可以重复吗?换句话说,A-A-F1-F1是一个有效的成员? A-B-C是一个有效的成员吗?您需要更具体地了解构成有效集的内容。 –

回答

1

获得所有可能的组合的代码如下

Option Explicit 

Sub Combinations() 

    Dim ws As Worksheet 
    Set ws = Sheets("Sheet1") 
    Dim a As Range, b As Range, c As Range, d As Range 
    Dim x&, y&, z&, w& 

    For x = 1 To ws.Range("A" & Rows.Count).End(xlUp).Row 
     Set a = ws.Range("A" & x) 
     For y = 1 To ws.Range("B" & Rows.Count).End(xlUp).Row 
      Set b = ws.Range("B" & y) 
      For z = 1 To ws.Range("C" & Rows.Count).End(xlUp).Row 
       Set c = Range("C" & z) 
       For w = 1 To ws.Range("D" & Rows.Count).End(xlUp).Row 
        Set d = ws.Range("D" & w) 
        Debug.Print a & vbTab & b & vbTab & c & vbTab & d 
        Set d = Nothing 
       Next 
       Set c = Nothing 
      Next 
      Set b = Nothing 
     Next y 
     Set a = Nothing 
    Next x 

End Sub 

和输出

A 1 F1 R1 
A 1 F2 R1 
A 1 F3 R1 
A 2 F1 R1 
A 2 F2 R1 
A 2 F3 R1 
B 1 F1 R1 
B 1 F2 R1 
B 1 F3 R1 
B 2 F1 R1 
B 2 F2 R1 
B 2 F3 R1 
C 1 F1 R1 
C 1 F2 R1 
C 1 F3 R1 
C 2 F1 R1 
C 2 F2 R1 
C 2 F3 R1 
D 1 F1 R1 
D 1 F2 R1 
D 1 F3 R1 
D 2 F1 R1 
D 2 F2 R1 
D 2 F3 R1 
E 1 F1 R1 
E 1 F2 R1 
E 1 F3 R1 
E 2 F1 R1 
E 2 F2 R1 
E 2 F3 R1 
+0

Hi @mehow我运行了宏,但是它没有输出任何结果到工作表 – user2425910

+0

@ user2425910它没有被告知这么做:)如果你在运行代码之前/之后点击CTRL + G,你将在称为立即窗口的VBE视图中打开一个窗口,该窗口是一个debbuging控制台'VBA'和你的输出将在那里。你可以修改'Debug.Print'输出到工作表 – 2013-05-29 20:23:34

0

试试这个VBA代码:

Type tArray 
    value As String 
    count As Long 
End Type 

Sub combineAll() 
    Dim sResult(10) As tArray, rRow(10) As Long, str() As String 
    Dim sRow As Long, sCol As Long 
    Dim i As Long, r As Long 
    Dim resRows As Long 
    sRow = 1: sCol = 1: r = 0 

    With ActiveSheet 
     Do 
      rRow(sCol) = 1 
      If (Trim(.Cells(sRow, sCol).value) = "") Then Exit Do 
      Do 
       If (Trim(.Cells(sRow, sCol).value) = "") Then Exit Do 
       sResult(sCol).value = sResult(sCol).value & Trim(.Cells(sRow, sCol).value) & ";" 
       sResult(sCol).count = sResult(sCol).count + 1 
       sRow = sRow + 1 
      Loop 
      sCol = sCol + 1 
      sRow = 1 
     Loop 

     Do 
      r = r + 1 
      For i = 1 To sCol - 1 
       str = Split(sResult(i).value, ";") 
       .Cells(r, sCol + i).value = str(rRow(i) - 1) 
      Next i 

      For i = sCol - 1 To 1 Step -1 
       If rRow(i) < sResult(i).count Then 
        rRow(i) = rRow(i) + 1 
        Exit For 
       Else 
        rRow(i) = 1 
       End If 
      Next i 

      If rRow(1) >= sResult(1).count Then Exit Do 
     Loop 

    End With 

End Sub