2

次のデータグリッドがあります。

         ---------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

次に、次のような 2 番目のシートがあります。

Row 1         Row 2        Row 3        Row 4

2 番目のシートを次のように仕上げたいと思います。

    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 のテキストです。また、ソースデータが変更されるため、2 番目のシートを自動的に更新するものがあればよいと思います。

4

3 に答える 3

0

ワークシート関数を使用する必要がありますか?それを行うためのマクロを作成する方がかなり簡単です(例を作成しました)

列の行ヘッダーと行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
于 2012-07-12T20:16:27.570 に答える
0

リストの空白に満足している場合は、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にコピーするだけです

于 2012-08-05T12:22:02.890 に答える
0

VBA 関数を使用してこれを行う 1 つの方法を次に示します。

[開発者] タブ(*) で 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 に戻り、最初のシートで名前付き範囲を定義して、グリッド内のすべてのデータをカバーします。行名はこの範囲の最初の列である必要があり、ヘッダー テキストはその最初の行である必要があります。

次に、2 番目のシートに移動し、すべての出力セルに次のような数式を入力します。

=GetHeaderMatchingRow(A$1, RowHeaderRange, 1)

First パラメーターは、範囲の最初の列で一致を試みる行テキストです。私のテストでは、2 番目のシートの列ヘッダーも最初のシートの行名であるため、ここに「A$1」があります。

2 番目の引数は検索する範囲 (この場合は、前に定義した名前付き範囲) で、3 番目の引数は探している一致の数 (1 番目、2 番目、3 番目など) です。

1 番目と 3 番目のパラメーターは、出力対象の列と行に基づいて変更する必要があることに注意してください。

于 2012-07-12T21:24:00.393 に答える