簡體   English   中英

根據行標題和單元格值返回列標題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM