想知道是否有人可以帮助我。我很难过。自从我使用excel以来已经很久了....
我有9个列,每个单元格中的值不同,每列的单元格数不同。
我需要一个公式/宏来吐出单元格的所有组合,但仍保持完全相同的列顺序。
例如 专栏:
D / 003 / 23 / 3 / 3R / C / VFX
... / 005 / 48 / 3 / 12 / .. / VDF
... / 007 / ... / 1 / ... /... / HSF
它吐出来像这样:
D0032333RCVFX
D0032333RCVDF
D0032333RCHSF
D0034833RCVFX
D0034833RCVDF
等...... 等等......
答案 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
等)。