【问题标题】:EXCEL VBA: CONCAT 3 columns from multiple rows when value from a cell is found on another excel fileEXCEL VBA:当在另一个excel文件中找到单元格的值时,从多行CONCAT 3列
【发布时间】:2021-11-19 17:41:00
【问题描述】:

在我看来,这似乎很复杂,所以请原谅我写的太多。

在 excel 文件 #1 中,A 列对应于“类型”,B 列对应于所需的结果。 (见图1)。

在 excel 文件 #2 中,A 列再次具有“类型”,B、C 和 D 列是感兴趣的列。(见图 2)。

当在同一行上找到来自 #1 的“类型”时,我需要将列 B、C、D 从 #2 连接到 #1,并用换行符添加具有相同“类型”的所有下一行在 #2 中。

B 列和 C 列之间应该是一个“[”,C 列和 D 列之间应该是一个“]”,如图所示。

当“:”在 B 列中时,我们不想连接并跳到下一个。

我已经设法逐步过滤和复制,但是当有人必须处理大数据时它效率不高。

我已经在使用这些功能了:

! 作为连接所有内容的列 E2=A2&"["&B2&"]"&C2)

!another 列来过滤我需要的值 F2=IF(LEFT(E2;2)=":[";"";E2)

!then 不带空格连接 =TEXTJOIN(CHAR(10);TRUE;F2:F26)

希望我没有让你很困惑。

提前致谢。

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    怎么样:

    B2中的公式:

    =SUBSTITUTE(TRIM(CONCAT(FILTER(CHOOSE({1,2,3},E$2:E$10&"[",F$2:F$10&"]",G$2:G$10&" "),(D$2:D$10=A2)*(E$2:E$10<>":"),"")))," ",CHAR(10))
    

    在 Excel 2019 中,它将是一个数组输入公式:

    =SUBSTITUTE(TRIM(CONCAT(IF((D$2:D$10=A2)*(E$2:E$10<>":"),E$2:E$10&"["&F$2:F$10&"]"&G$2:G$10&" "),""))," ",CHAR(10))
    

    【讨论】:

    • 看起来棒极了,但我使用的是 excel 2019(不幸的是忘记提了?),所以我没有可用的“过滤器”功能。
    • @CptCode,查看我编辑的答案以包含 CSE 输入的 Excel 2019 选项。
    • 哇,你的速度真快!我试图用这个来编辑我之前的答案:看起来很棒,但我使用的是 excel 2019(不幸的是忘记提了?),所以我没有可用的 FILTER 功能。我忘了提到的另一件事是“类型”由一个字母数字字符串组成,如“ABC-D10F”(我把我的例子简化了?),所以函数 CHOOSE 不能正常工作。非常感谢您的回复!
    • @CptCode,这对于我整理的答案来说不是问题。它可以很好地处理字母数字字符串,并且与 CHOOSE() 函数无关,后者只是 FILTER() 函数的残余。虽然它现在甚至可以工作,但我们甚至可以删除它并使用 &amp; 连接列。
    • 再次感谢您的回答,我们绝对是在正确的道路上,但是当我尝试时,它不起作用:pasteboard.co/g2Gzx2LRmsJa.png
    【解决方案2】:

    我认为您可以将=CONCAT 函数与一些IF() 语句结合起来。

    CONCAT 以逗号分隔,因此请尝试例如=CONCAT(A1, "[", B1, "]") 等。

    您可以将其与必须在单元格之间匹配的 IF 要求结合起来,并返回您需要的内容。

    【讨论】:

    • IF 是最难的部分 ?。请检查我的 cmets 到 @Jvd,他们有其他信息。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多