Q:数据放置在列A中,我要得到这些数据中任意3个数据的所有可能组合。如下图1所示,列A中存放了5个数据,要得到这5个数据中任意3个数据的所有可能组合,如列B中所示。如何实现?
图1
(注:这是无意中看到的一个问题,我觉得程序编写得很巧妙,使用了递归的方法来解决,非常简洁,特将该解答稍作整理后辑录于此与大家分享!)
A:VBA代码如下:
Sub Combinations()
Dim rng As Range
Dim n AsLong
Dim vElements As Variant
Dim lRow As Long
Dim vResult As Variant
‘要组合的数据在当前工作表的列A
Set rng =Range(“A1”, Range(“A1”).End(xlDown))
‘设置每个组合需要的数据个数
n = 3
‘在数组中存储要组合的数据
vElements =Application.Index(Application.Transpose(rng), 1, 0)
‘重定义进行组合的数组大小
ReDim vResult(1 To n)
Call CombinationsREC(vElements, CInt(n), vResult, lRow, 1, 1)
End Sub
Sub CombinationsREC(vElements As Variant, _
p As Integer,_
求每隔n行中的单元格之和
很多时候,我们都可能想要对每隔n行中的单元格求和,其中n是一个整数。如下图1所示,每隔1行求和、每隔2行求和、每隔3行求和,等等。 图1 从图1的示例可知,如果我们每隔1行求和,有求奇数行或者偶数行的单元格之和两种情况,其中,奇数行求和的数组公式为: =SUM(IF(MOD(ROW($A$1:$A$15),2
vResult AsVariant, _
lRow As Long,_
iElement AsInteger, _
iIndex AsInteger)
Dim i AsInteger
For i =iElement To UBound(vElements)
vResult(iIndex)= vElements(i)
IfiIndex = p Then
lRow = lRow 1
Range(“B” & lRow) = Join(vResult, “, “)
‘每组组合放置在多列中
Range(“C” &lRow).Resize(, p) = vResult
Else
‘递归调用
Call CombinationsREC(vElements, p, vResult, lRow, i 1, iIndex 1)
End If
Next i
End Sub
代码的关键在于递归调用的实现,有兴趣的朋友可以使用F8键逐语句运行代码观察代码效果,来理解实现过程。
代码的图片版如下:
如果将代码中注释掉的代码恢复,也就是将组合结果放置在多列中,运行后的结果如下图2所示。
如何获取一列数据中重复次数最多的数据?
Q:如下图1所示,在工作表列A中有很多数据(为方便表述,示例中只放置了9个数据),这些数据中有很多重复数据,我想得到重复次数最多的数据是那个,示例中可以看出是“Excel”重复的次数最多,如何获得这个数据? 图1 A:可以使用一个数组公式: =INDEX($A$1:$A$9,MODE(MATCH($A$1:$