根据行标题和单元格值返回列标题
我有以下网格的数据:
---------Header 1 Header 2 Header 3 Header 4 Row 1 xxx Row 2 xx Row 3 x Row 4 xxxx
然后我有第二张纸,看起来像这样:
Row 1 Row 2 Row 3 Row 4
我想第二张最后看起来像这样:
Row 1 Row 2 Row 3 Row 4 Header 1 Header 2 Header 3 Header 1 Header 3 Header 3 Header 2 Header 4 Header 3 . Header 4
忽略上一段时间,我只是用它来正确格式化。
我一直在玩MATCH和INDEX几个小时,虽然我可以得到它的一部分,我似乎无法让它一起工作。
编辑:
我只使用“标题1”和“行1”作为示例。 实际数据分别是A列和1行中的文本。 此外,由于源数据将被修改,我宁愿有一些会自动更新第二张表。
这是一个使用VBA函数的方法:
在“开发人员”选项卡(*)中,单击Visual Basic,然后单击“插入”菜单,然后select“模块”以插入新模块。 然后粘贴下面的代码:
Option Explicit Public Function GetHeaderMatchingRow(RowText As String, _ SearchRange As Range, _ iHdrNo As Integer) As String Dim rng As Range Set rng = SearchRange Dim cel As Range 'Get the Row to scan Dim i As Long, rowOff As Long For i = 2 To rng.Rows.Count Set cel = rng.Cells(i, 1) If cel.Value = RowText Then rowOff = i Exit For End If Next i 'Now, scan horizontally for the iHdrNo'th non-blank cell Dim cnt As Integer For i = 2 To rng.Columns.Count Set cel = rng.Cells(rowOff, i) If Not CStr(cel.Value) = "" Then cnt = cnt + 1 If cnt = iHdrNo Then GetHeaderMatchingRow = rng.Cells(1, i).Value Exit Function End If End If Next i GetHeaderMatchingRow = "" End Function
点击“debugging”菜单并select“编译VBAProject”。
现在回到Excel,并在第一个表中定义一个命名范围来覆盖网格中的所有数据。 行名称应该是此范围中的第一列,而标题文本应该是其中的第一行。
现在转到第二张表格,并在每个输出单元格中input这样的公式:
=GetHeaderMatchingRow(A$1, RowHeaderRange, 1)
其中第一个参数是“行”文本,它将尝试在范围的第一列中进行匹配。 我在这里有“1澳元”,因为在我的testing中,我的第二张表格的标题栏也是我的第一张表中的行名,就像你的。
第二个参数是要search的范围(在这种情况下,我们前面定义的命名范围),第三个参数是它正在寻找的匹配的计数(第一,第二,第三等)。
请注意,第一个和第三个参数应根据输出的列和行进行更改。
它是否必须使用工作表函数? 创build一个macros来做这件事会比较简单(我举了一个例子)
编辑该函数以处理第1行的列标题和行标题中的行标题,并将其更改为从“源”表中读取,并将结果写入“输出”表
Public Sub Example() Dim Output As Worksheet Dim Sheet As Worksheet Dim Row As Integer Dim Column As Integer Set Sheet = ThisWorkbook.Worksheets("Source") Set Output = ThisWorkbook.Worksheets("Output") Output.Cells.Clear ' Since were going to rebuild the whole thing, just nuke it. For Row = Sheet.UsedRange.Rows(Sheet.UsedRange.Rows.Count).Row To 2 Step -1 Output.Cells(1, Row - 1).Value = Sheet.Cells(Row, 1).Value For Column = Sheet.UsedRange.Columns(Sheet.UsedRange.Columns.Count).Column To 1 Step -1 If Not IsEmpty(Sheet.Cells(Row, Column)) Then Sheet.Cells(1, Column).Copy Output.Cells(2, Row - 1).Insert xlShiftDown End If Next Column Next Row End Sub
我看了一下用工作表函数来做这件事,而另一些人则表示,如果没有一些vba混合的话,这样做会非常棘手。
如果将其添加到新模块,则可以将其作为工作簿function进行访问。 (不是说这是做这件事的最好方法,只是幻想着去做)
'Return The Column Header of the Nth Non-Blank Cell on Specified Row Public Function NonBlankByIndex(ByVal Row As Integer, ByVal Index As Integer) As Range Dim Sheet As Worksheet Dim Column As Integer Dim Result As Range Set Sheet = ThisWorkbook.Worksheets("Source") ' Change to your source sheet's name Set Result = Nothing Column = 2 ' Skip 1 as its the header Do If Column > Sheet.UsedRange.Columns(Sheet.UsedRange.Columns.Count).Column Then Exit Do End If If Sheet.Cells(Row, Column) = "" Then Column = Column + 1 Else If Index = 1 Then Set Result = Sheet.Cells(1, Column) Exit Do Else Column = Column + 1 Index = Index - 1 End If End If Loop Set NonBlankByIndex = Result End Function
如果您对清单中的空白感到满意,请在sheet2中试试这个!A2:
!= IF(INDEX(Sheet 1中$ B $ 2:$ E $ 5,MATCH(A $ 1,工作表Sheet $ A $ 2:$ A $ 5,0),ROW() – 1)= “X”,INDEX(工作表Sheet $ B! $ 1:$ E $ 1,1,ROW() – 1), “”)
只需复制范围A2:D5的公式