【问题标题】:every possible combination of the contents of 2 columns in excelexcel中两列内容的每种可能组合
【发布时间】:2022-01-28 00:33:09
【问题描述】:

假设我有 2 列:

第一列(包含 1000 行):

U-0001

U-0002 

第二列(包含 10 行):

B01

B02

B03

现在,我想生成这样的两列(10*1000 = 10000 行):

U-0001 B01

U-0001 B02

U-0001 B03

U-0002 B01

U-0002 B02

U-0002 B03

【问题讨论】:

  • Stack Overflow 是一个面向编程爱好者的网站。在这里获得帮助的最好方法是先尝试一些东西。如果您遇到困难,请进行一些研究,尝试自己解决问题,然后再询问有关您尝试的具体问题,展示您尝试过的内容。要求完整解决方案但没有展示解决方案努力的问题通常会被否决并关闭。
  • 你可以用一些简单的excel公式解决这个问题。无需学习 VBA。
  • 在 google-sheets 上有什么解决方案吗?也许有 QUERY 功能?

标签: excel vba


【解决方案1】:

应该这样做:

Sub combineTwoCol()

    ' i,j,k are counters for first col, second col and the answer col in order.
    k = 1
    For i = 1 To 1000
        For j = 1 To 10
            Cells(k, "C").Value = Cells(i, "A").Value
            Cells(k, "D").Value = Cells(j, "B").Value 
            k = k + 1
        Next j
    Next i
End Sub

已编辑:您应该注意到我假设您只有这两列是文件,如果没有将“A”和“B”更改为您需要的相应列。和“C”和“D”到您希望两个输出列所在的位置。

如果 10 和 1000 只是示例而不是真正的值,您可以像这样动态地找到它们:

'this return to the variable the last row in column A
LastRowColA = Range("A65536").End(xlUp).Row

并将1000 替换为LastRowColA

【讨论】:

    【解决方案2】:

    这是一个公式版本:-

    =IF(ROW()-ROW($A$1)<COUNTA(A:A)*COUNTA(B:B),OFFSET($A$1,(ROW()-ROW($A$1))/COUNTA(B:B),0)&" "&OFFSET($B$1,MOD(ROW()-ROW($A$1),COUNTA(B:B)),0),"")
    

    在(比如)C1 中输入并复制下来。

    【讨论】:

      【解决方案3】:

      一个动态数组(溢出)公式。适用于 Excel 365,可能适用于 Excel 2019,可能不适用于以前的版本。您只需要在一个单元格(最好是 C1)中输入公式,它会动态地用数据填充列,无需将其拖动/复制到其他单元格。也不是简单的数组公式,所以不需要ctrl+shift+enter。

      =INDEX(($A:$A),ROUNDUP(SEQUENCE(COUNTA($A:$A)*COUNTA($B:$B),1,1,1)/COUNTA($B:$B),0))&amp;" "&amp;INDEX($B:$B,MOD(SEQUENCE(COUNTA($A:$A)*COUNTA($B:$B),1,0,1),COUNTA($B:$B))+1)

      注意:如果您不想水平拖动公式,您可以删除 $ 符号,将它们留在里面只是一个好习惯。当然没有必要(也不可能)垂直拖动它。

      详细解释:

      -公式有两个 INDEX 函数,用于获取连接所需的数组,以及它们之间的空格

      -INDEX 用于从数组生成单元格引用。本来会喜欢使用 INDIRECT,但目前不支持溢出数组公式

      -first INDEX 生成对 A 列值的引用。只要总值的数量(因此是 COUNTA 函数),它就会生成一个数组,在您的 2*3 示例中,一个长度为 6 的数组。它通过创建一个这么长的序列来做到这一点,并从 1 填充到这个最大值。然后它将序列中的每个数字除以 A 列中的值的数量,并将其向上舍入,从而创建(在此示例中)数组 {1,1,1,2,2,2}。然后 index 对 A 列进行引用,从数组中取出行 - 从而完成第一部分

      -second 索引生成对 B 列值的引用。它再次使用 SEQUENCE 和 COUNTA 生成适当长度的数组,但这里我们从 0 开始。这很重要,因为稍后我们使用 MOD 函数,它返回除法余数,并且只能从 COUNTA($B:$ B)-1。所以我们在MOD后面加1,这就是为什么我们从0开始序列,所以最后的数组{1,2,3,1,2,3}从1开始 - 最后的 INDEX 函数因此创建了一对 A 列和 B 列值。正如您从产生的数组中看到的那样,它们将是 {[A1 B1],[A1 B2],[A1 B3],[A2 B1],[A2 B2],[A3 B3]} 并且当然实际上放入他们的价值观,这才是我们最终想要的

      【讨论】:

        猜你喜欢
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多