5

以下のような名前と人々の役割でいっぱいのスプレッドシートがあります。

Role Name  Change
1     A     Yes
2     A     No
5     A     N/Ap
1     B     Yes
3     B     No
2     C     Yes
4     C     No

以下のようなスプレッドシートを作成する必要があります。

     1        2        3        4        5        6
A   Yes                     
B                       
C                       

基本的に、最初のスプレッドシートから情報を取得し、2 番目のスプレッドシートに明確に配置する必要があります。

手動で行うには名前とロールが多すぎます。VLMOVEうまくいかないので、試してみましMATCHINDEX

4

5 に答える 5

2

@RocketDonkey の代わりに (しかし、より完全な目的の結果をありがとう!) 役割と名前をつなぎ合わせることができます (シート 1 の B と C の間に挿入された列で言う [OP は結果用に別のシートが必要だと思うため]):

C2=A1&B2  copied down as required

次に、Sheet2!B2 でルックアップを使用します。

=IFERROR(VLOOKUP(B$1&$A2,Sheet1!$C$2:$D$8,2,FALSE),"")  

必要に応じて上下にコピーします。

これは、結果のグリッド (問題のように) が構築されていることを前提としています (そして、データを含む 7 行があることを前提としています - それ以外の場合は、必要に応じて $8 を調整してください)。

于 2012-12-21T21:48:02.163 に答える
1

VBA を使用しない別の方法があります。最初のスプレッドシートの最初の 2 つを連結する別の列を作成すると、次のようになります。

Role Name  Change  CheckColumn
1     A     Yes    1A
2     A     No     2A
5     A     N/Ap   5A
1     B     Yes    1B
3     B     No     3B
2     C     Yes    2C
4     C     No     4C

次に、関数OffsetMatch関数を一緒に使用して、2 番目のシートの変更を見つけることができます。したがって、データがセル A1 から配置されていると仮定すると、セル B2 の式は次のようになります。

=iferror(offset(Sheet1!$A$1,match(B$1&$A2,sheet1!$D:$D,0),2),"")

または、連結された列をロール列の前vlookupにシート 1 に配置すると、シート 2 で使用できます。式は次のとおりです。

=iferror(vlookup(B$1&$A2,sheet1!$A:$D,4,false),"")

于 2012-12-21T21:53:20.567 に答える
1

タグがあるのでExcel-VBA、VBA に追加することでソリューション タイプが完成すると考えました :) 次のコードはエレガントではありません。コード ベースを使用する必要がある場合は、試してみてください :)

コード:

Option Explicit

Public Sub sortAndPivot()
Dim d As Object
Dim ws As Worksheet
Dim sourceArray As Variant, pvtArray As Variant, v As Variant
Dim maxRole As Long
Dim i, j, k, m As Integer

    Set d = CreateObject("Scripting.Dictionary")
    Set ws = Worksheets("Sheet3") '-- set according to your sheet
    '-- you could enhance by using an input box to select the range
    sourceArray = Application.WorksheetFunction.Transpose(ws.Range("B3:D9").Value)
    '-- max role number
    maxRole = Application.WorksheetFunction.Max(ws.Range("B3:B9"))

    '-- find unique name list
    For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
        If Not d.exists(sourceArray(2, i)) Then
            d.Add sourceArray(2, i), i
        End If
    Next i

    ReDim pvtArray(d.Count, maxRole)
    pvtArray(0, 0) = "Name"

    '-- add unique names from dictionary
    j = 1
    For Each v In d.keys
        pvtArray(j, 0) = v
        j = j + 1
    Next

    '-- add unique Role number list
    For i = UBound(pvtArray, 2) To LBound(pvtArray) + 1 Step -1
        pvtArray(0, i) = i
    Next i

    '-- sort into the correct positions
    For k = LBound(pvtArray, 1) + 1 To UBound(pvtArray, 1)
        For m = LBound(pvtArray, 2) + 1 To UBound(pvtArray, 2)
            For i = LBound(sourceArray, 2) To UBound(sourceArray, 2)
                If pvtArray(k, 0) = sourceArray(2, i) Then
                    If pvtArray(0, m) = sourceArray(1, i) Then
                        pvtArray(k, m) = sourceArray(3, i)
                    End If
            End If
        Next i
        Next m
    Next k

    'Output the processed array into the Sheet in pivot view.
    Range("F2").Resize(UBound(pvtArray) + 1, _
    UBound(Application.Transpose(pvtArray))) = pvtArray

    Set d = Nothing
End Sub

結果:

ここに画像の説明を入力

于 2012-12-22T00:25:55.263 に答える
1

修正

構造を変更せずに、配列数式を使用してテーブルを再編成できます。データがシート 1 の範囲 A2:C8 にあり、結果テーブルがシート 2 の範囲 A1:G4 にあると仮定すると、次の式は結果テーブルの最初のエントリ (役割 1 と名前 A) になります。

   =IFERROR(INDEX(Sheet1!$A$2:$C$8,MATCH(B$1&$A2,Sheet1!$A$2:$A$8&Sheet1!$B$2:$B$8,0),3),"-")

MATCH 式は、役割と名前の組み合わせ 1A が発生する行番号を返します。INDEX 関数は、MATCH 式で見つかった行番号と列番号 3、つまりデータ テーブルの変更列にあるセルの内容を返します。ロール/名前の組み合わせがデータ テーブルにない場合、IFERROR は「-」を返します。

Control-Shift-Enter キーの組み合わせを使用して数式を入力してください。次に、数式を結果テーブルの残りのセルにコピーします。

Sheet1 のデータ テーブル:

Sheet1 のデータ テーブル

Sheet2 の結果テーブル:

シート上の結果表

于 2012-12-21T22:19:24.667 に答える