我正在针对跨越多列的值执行hlookup
。我的数据与此类似:
A B C D
---------------------------
1| Col1 Col2
2| x y z w
3|
4|
在第3行和第4行(A3,B3,C3,D3等)中,我想在工作簿中放置一个会在其他地方执行hlookup的公式。诀窍是,我希望它为列A和B查找“Col1”,为列C和D查找“Col2”。“Col1”在A1中,但实际上是A1和B1合并。当我引用A1时,会出现“Col1”,但是当我引用B1时,返回值为空白。
有什么想法吗?
答案 0 :(得分:15)
这是另一个解决方案,当合并的单元格具有不同的宽度时,它也可以工作,让我用一个例子说明:
如果您可以使用不同宽度的多个合并单元格,只需将公式粘贴到所有这些单元格中即可。
这项工作背后的原因是因为微软的perculier design choice。看起来当你在合并单元格中粘贴公式时,每个底层单元格都会收到公式(相反,如果你输入一个值,只有左上角的单元格得到它)所以你可以利用它来利用它并粘贴一个参考的公式旁边的单元格,然后使用您想要的值覆盖左上角的单元格,然后合并单元格下面的每个单元格都将具有该值。
答案 1 :(得分:10)
要访问“Col1”和“Col2”标签,您可以使用以下内容:
= INDEX($ 1:$ 1,1,COLUMN() - MOD(COLUMN() - 1,2))
注意:这假设您将相同数量的单元格组合在一起。如果它是三个单元格,您只需将公式中的最后一个数字更改为3,依此类推。
编辑:以下是它的工作原理:
INDEX($ 1:$ 1,1,x)返回第1行第x列中单元格的值。如果您的表实际上不在工作表的左上角,则可以将其更改为包含所有合并标签的实际范围。在这种情况下,它将是: INDEX($ A $ 1:$ D $ 1,1,x)
COLUMN()返回当前单元格的列号(A列中为1,B列中为2,等等)
MOD(COLUMN() - 1,x)返回从当前列到保存正确标签的列的偏移量
答案 2 :(得分:4)
我在vba中构建了一个简单的函数来解决这个问题:
Function mergedText(rngMergedCell As Range)
If rngMergedCell.MergeCells = True Then
mergedText = rngMergedCell.MergeArea(1, 1)
Else
mergedText = rngMergedCell
End If
End Function
如果单元格是合并的单元格,则该函数将返回合并单元格的第一个元素中的值 - 这是合并单元格存储其值的位置
答案 3 :(得分:2)
e.James提案的更通用的变体是:
={INDEX($A$1:A1, 1, MAX(NOT(ISBLANK($A$1:A1))*COLUMN($A$1:A1)-COLUMN($A$1)+1))}
这取决于合并的单元格除了第一个单元格之外是空的(除非你是像马丁的建议一样)。
注意:花括号用于标记数组公式(不要输入它们,只需按alt + return以验证单元格中的公式)。
答案 4 :(得分:1)
我意识到我迟到了这个帖子,但我找到了一个非常简单的答案。
例如,如果您的标签在4列a1:d1中合并,并且如果您引用b1,则返回“”。要动态查找正确的标签,请在新表中使用此fx:
=if(OriginalTable!B1="",ThisTable!A1,OriginalTable!B1)
我相信你会意识到这会在你拖过时捕获e1:h1等的范围。
就是这样。希望它可以帮到某人。
答案 5 :(得分:0)
单元格B1和D2不包含任何值,只有A1和C1内部有一些内容。
因此,您只需要确保A列和B列中的公式都将A1作为查找值引用,并且C列和D列中的公式都引用C1作为查找值。
答案 6 :(得分:0)
有了新的动态参考,现在有更多选择。这是我编写的一个通用函数,它将搜索单元格的左侧并返回第一个值。它没有经过优化,但对我有用。
=LET(
TargetCell, A1,
TargetRow, ROW(TargetCell),
TargetCol, COLUMN(TargetCell),
RowReference, INDIRECT(TargetRow & ":" & TargetRow),
RowValues, TRANSPOSE(FILTER(RowReference,ISBLANK(RowReference)=FALSE)),
RowValueColumns, MATCH(RowValues, RowReference,0),
ReturnColumn, MAX(FILTER(RowValueColumns,RowValueColumns<=TargetCol)),
Return, INDIRECT(ADDRESS(TargetRow,ReturnColumn)),
Return
)