我有一个excel文件,其中包含1行和以下行中复合信息,该组合的组件信息。复合材料下面的组件行数在2 - 20之间变化,文件中可以有很多复合材料。
我的问题是:是否有可能以某种方式定义组件中有多少行,并从每个组件中提取信息到一个单元格(连接)。我面临的问题是每次行数不同,并且包含组件的文件中可能有多个复合。所以我不知道如何停止循环并开始新的复合聚合。
也许有办法从Request1(ColumnA)循环并分配" Request1"作为下面每个空列的文本,直到它到达Request2,然后根据Request" n"完成连接。
示例我希望数据看起来像什么
~~~~~~~~~~~~ EDIT ~~~~~~~~~~~~~~~~~~~~ 我的问题可能过于复杂了
我只是想将来自不同行集的信息(为简单起见,每行只有1个一致的单元格)连接到每个特定复合(包含组件)的1个单元格(例如第一列中的最后一个单元格)问题是当我使用新的复合(新的行集)时,我不知道如何停止连接并开始新的连接。
所以作为第一张照片中的一个例子,我想要#34;请求1绿黄白" (单元格:A1,F1,F2,F3)填充在单元格J1中,"请求2琥珀色红色白色蓝色" (细胞:A4,F4,F5,F6,F7)填充i细胞J4
#######编辑我已经建立了另一种做法,但仍然在使用连接公式。 在这个图片示例中 https://i.stack.imgur.com/iQdNu.jpg
如果我的桌子来自第2行
= IF(A2 ="",J1,A2) - 把它放在J列并向下拖动我会得到他的请求1 要求1 要求1 要求2 要求2 要求2 请求2
然后删除重复项我将只留下 要求1 要求2 然后我可以连接请求1或请求2条件(索引匹配)的列,但我无法弄清楚如何做...
答案 0 :(得分:1)
您可以使用数组公式计算起始行和结束行,例如=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
答案 1 :(得分:0)
如果我正确阅读您的问题,则以下代码可能有所帮助。您希望能够在类别行下添加元素行,并且当您这样做时,它会更改新行下面的每一行的行号。此代码将向您显示类别所在的行无关紧要,因为您可以随时找到它的行号,以及它下面的元素数。
诀窍是在每个类别的col A中添加一个单词,该单词在任何元素A值中都找不到。例如,A1可能会读取“Category:Apples”,“并且”Category:Apples“下可能有十个元素行。然后在这些行下,col A中的另一个类别将是”Category:Bananas“。下面的代码查找在col A中输入值“Category:”并获取每个类别行的行号以及它下面的元素数量。通过一些数学运算,您可以确定在哪里为新元素行或要连接的行插入新行。并且您不需要对类别的行号进行硬编码。只需运行这个简单的代码,它就会为您提供这些行号以获取并连接任何类别下的所有行。
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