[英]Return column header based on row header and cell value
我有以下數據網格:
---------Header 1 Header 2 Header 3 Header 4
Row 1 x x x
Row 2 x x
Row 3 x
Row 4 x x x x
然后,我有第二張紙,看起來像這樣:
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行中的文本。 另外,由於將修改源數據,所以我希望有可以自動更新第二張工作表的內容。
是否必須使用工作表功能? 創建一個宏來完成它要簡單得多(我已經舉了一個例子)
編輯該函數以使用col a中的行標題和第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的情況下執行它非常棘手。
如果將其添加到新模塊中,則可以將其作為工作簿功能來訪問。 (並不是說這是最好的方法,只是幻想一下)
'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
這是使用VBA功能的一種方法:
在“開發人員”選項卡(*)中,單擊Visual Basic,然后單擊那里的“插入”菜單,然后選擇“模塊”以插入新模塊。 然后粘貼以下代碼:
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
單擊“調試”菜單,然后選擇“編譯VBAProject”。
現在返回Excel,在第一個工作表中定義一個“命名范圍”,以覆蓋網格中的所有數據。 行名稱應為該范圍內的第一列,標題文本應為該范圍內的第一行。
現在轉到第二頁,在每個輸出單元格中輸入如下公式:
=GetHeaderMatchingRow(A$1, RowHeaderRange, 1)
第一個參數是它將在范圍的第一列中嘗試匹配的行文本。 我在這里有“ A $ 1”,因為在測試中,第二張表的列標題也是第一張表中的行名,就像您的表一樣。
第二個參數是要搜索的范圍(在這種情況下,是我們之前定義的“命名范圍”),第三個參數是它要查找的匹配項的計數(第一,第二,第三等)。
請注意,第一個和第三個參數應該根據輸出所針對的列和行而改變。
如果您對清單中的空白感到滿意,請在sheet2!A2中嘗試以下操作:
= IF(INDEX(Sheet1!$ B $ 2:$ E $ 5,MATCH(A $ 1,Sheet1!$ A $ 2:$ A $ 5,0),ROW()-1)=“ x”,INDEX(Sheet1!$ B $ 1:$ E $ 1,1,ROW()-1),“”)
只需將公式復制到范圍A2:D5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.