前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >问与答62: 如何按指定个数在Excel中获得一列数据的所有可能组合?

问与答62: 如何按指定个数在Excel中获得一列数据的所有可能组合?

作者头像
fanjy
发布2019-08-13 12:01:59
5.4K0
发布2019-08-13 12:01:59
举报
文章被收录于专栏:完美Excel完美Excel

excelperfect

Q:数据放置在列A中,我要得到这些数据中任意3个数据的所有可能组合。如下图1所示,列A中存放了5个数据,要得到这5个数据中任意3个数据的所有可能组合,如列B中所示。如何实现?

图1

(注:这是无意在ozgrid.com中看到的一个问题,我觉得程序编写得很巧妙,使用了递归的方法来解决,非常简洁,特将该解答稍作整理后辑录于此与大家分享!)

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,_

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所示。

图2

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档