组合发电机仍然保持有序

时间:2013-08-16 23:08:32

标签: excel-vba vba excel

想知道是否有人可以帮助我。我很难过。自从我使用excel以来已经很久了....

我有9个列,每个单元格中的值不同,每列的单元格数不同。

我需要一个公式/宏来吐出单元格的所有组合,但仍保持完全相同的列顺序。

例如 专栏:

D   / 003 / 23  / 3 / 3R  / C  / VFX

... / 005 / 48  / 3 / 12  / .. / VDF

... / 007 / ... / 1 / ... /... / HSF

它吐出来像这样:

D0032333RCVFX

D0032333RCVDF

D0032333RCHSF

D0034833RCVFX

D0034833RCVDF

等...... 等等......

1 个答案:

答案 0 :(得分:1)

据推测,您需要使用“序列号”调用此功能 - 这样您就可以调用“第N个组合”。然后问题分为两部分:

第1部分:弄清楚,对于给定的“序列号”,您需要每列的哪个元素。如果你在每一列中有相同数量的元素E,那就很简单:就像在基数E中写N.当每列中的元素数量不同时,它有点棘手 - 就像这样:

Option Base 1
Option Explicit

Function combinationNo(r As Range, serialNumber As Integer)
' find the number of entries in each column in range r
' and pick the Nth combination - where serialNumber = 0 
' gives the top row
' assumes not all columns are same length
' but are filled starting with the first row

Dim ePerRow()
Dim columnIndex As Integer
Dim totalElements As Integer
Dim i, col
Dim tempString As String

ReDim ePerRow(r.Columns.Count)
totalElements = 1
i = 0
For Each col In r.Columns
  i = i + 1
  ePerRow(i) = Application.WorksheetFunction.CountA(col)
 totalElements = totalElements * ePerRow(i)
Next

If serialNumber >= totalElements Then
  combinationNo = "Serial number too large"
  Exit Function
End If

tempString = ""
For i = 1 To UBound(ePerRow)
  totalElements = totalElements / ePerRow(i)
  columnIndex = Int(serialNumber / totalElements)
  tempString = tempString & r.Cells(columnIndex + 1, i).Value
  serialNumber = serialNumber - columnIndex * totalElements
Next i

combinationNo = tempString

End Function

您可以使用列所在的范围和序列号调用此函数(从“仅限顶行”开始,为0)。它假定任何空白区域位于每列的底部。否则,它将返回一个字符串,该字符串是每列中值组合的串联,正如您所描述的那样。

编辑或许下面的图片展示了如何使用它以及它实际上做了什么,这有帮助。请注意,第一个引用(到不同长度的列表)是绝对引用(使用$符号,因此当您将它从一个单元格复制到另一个单元格时,它会一直引用到第二个参数 relative (因此它依次指向0, 1, 2, 3等)。

enter image description here