VBA(EXCEL)从不同标准的不同行中提取信息

我有一个excel文件,其中包含复合材料的信息,在这一组合的组成部分的1行和下面的行信息。 复合材料下方的组件行数在2 – 20之间变化,文件中可以有许多复合材料。

文件示例我处理

我的问题是:是否有可能以某种方式定义在组件中有多less行,并从每个组件中提取信息到一个单元(连接)。 我面对的问题是每次行数不同,在包含组件的文件中可能会有多个组合。 所以我不知道如何阻止我的循环,并开始一个新的组合聚合。

也许有办法从Request1(ColumnA)循环,并将“Request1”作为文本分配给下面的每个空列,直到到达Request2,然后根据请求“n”完成连接

例如我想要的数据看起来像

结果

~~~~~~~~~~~~ EDIT ~~~~~~~~~~~~~~编辑我的问题

我只是想要为每个特定的组合(包含组件)连接来自不同的行集合(为了简单起见,每行只有1个一致的单元格)的信息到1个单元格中(例如,第一列中的最后一个单元格)我的问题是I不知道如何停止串联,并开始一个新的,当我正在使用一个新的组合(新的一组行)。

因此,作为第一张照片的一个例子,我希望在单元格J1中填充“请求1绿色黄色白色”(单元格A1,F1,F2,F3),并且请求2琥珀色红色白色蓝色(单元格A4 ,F4,F5,F6,F7)填充在单元格J4中

#######编辑

我已经build立了另一种方式,但仍然在拼接公式中挣扎。 在这个图片的例子https://i.stack.imgur.com/iQdNu.jpg

如果我的桌子在第2排

= IF(A2 =“”,J1,A2) – 把它放在J栏中,然后向下拖动我将得到他的请求1请求1请求1请求2请求2请求2请求2

然后删除重复,我将只剩下请求1请求2然后我可以连接列我想要通过请求1或请求2条件(索引匹配),但我不知道如何做到这一点…

您可以使用数组公式来计算开始行和结束行,例如=SMALL(IF($A$2:$A$20<>"",ROW($A$2:$A$20)),ROW()) A1:A20中的下一个填充的单元格,这将在单元格G1中。 所以在G1中,我有一个固定的1,然后在G2下来,我有= H1 + 1,然后在每个H填充下来我有=SMALL(IF($A$2:$A$20<>"",ROW($A$2:$A$20)),ROW())给出了以下内容

在这里输入图像说明

不幸的是我们不能用Excel中的函数来进行concat,所以这将有助于你的循环开始和结束。 产品数量,是2中的差异

如果我正确地阅读你的问题,那么下面的代码可能会有所帮助。 您希望能够在类别行下面添加元素行,并且当您这样做时,它会更改新行下面每行的行号。 这段代码会告诉你,这个类别在哪一行是无关紧要的,因为你可以随时find它的行号,也可以查看它下面的元素数量。

诀窍是在每个类别的列A中添加一个不会在任何元素A值中find的单词。 例如,A1可能会读取“Category:Apples”,“Category:Apples”下面可能会有十个元素行。然后在这些行的下一行,列A中的另一个类别将是“Category:Bananas”。下面的代码寻找在col A的值“Category:”中获取每个类别行的行号以及它下面有多less个元素。用一点mathalgorithm,你可以找出在哪里插入一个新的元素行或者连接哪一行。你不需要硬编码类别的行号,只需运行这个简单的代码,它会给你这些行号来获取和连接任何类别下的所有行。

 Sub findCategoryRows() Dim lastRowColA As Long, myArray() As Variant Dim rowOfCategoryNameArray, nameOfCategoryNameArray, categoryCounter As Long lastRowColA = ActiveSheet.Range("A65536").End(xlUp).Row myArray = Range("A1:A" & lastRowColA) categoryCounter = 1 ReDim rowOfCategoryNameArray(1 To 1) ReDim nameOfCategoryNameArray(1 To 1) For i = 1 To UBound(myArray) If InStr(1, Range("A" & i).Value, "Category: ") Then rowOfCategoryNameArray(categoryCounter) = i nameOfCategoryNameArray(categoryCounter) = Range("A" & i).Value categoryCounter = categoryCounter + 1 ReDim Preserve rowOfCategoryNameArray(1 To categoryCounter) ReDim Preserve nameOfCategoryNameArray(1 To categoryCounter) End If Next i For i = 1 To UBound(rowOfCategoryNameArray) - 1 If i <> UBound(rowOfCategoryNameArray) - 1 Then Debug.Print nameOfCategoryNameArray(i) & " has " & (rowOfCategoryNameArray(i + 1) - rowOfCategoryNameArray(i)) - 1 & " element rows under it." Else Debug.Print nameOfCategoryNameArray(i) & " has " & (lastRowColA - rowOfCategoryNameArray(i)) & " element rows under it." End If Next i End Sub