Excel 2016 : 다른 시트의 일치 기준에 따라 목록으로 열 채우기 I | |

내가 할 수있는 한 최선을 다해 표제어를 쓰려고 노력했고 설명하기 위해 최선을 다할 것입니다. 필요한 경우 제목을 다시 지정하는 것에 대한 제안을하겠습니다.

나는 스포츠에서 선수가하는 라운드를 추적하기 위해 사용하려고하는 두 장의 시트가 있습니다. 그들은 본질적으로 다르게 제시된 동일한 데이터입니다.

한 시트에는 12 행이 있고 각 행은 플레이어를 나타내며 B 열에 플레이어 이름이 표시됩니다.

각 행마다 11 개의 열이 있으며 각 열은 게임의 각 라운드를 나타냅니다.

예를 들어,

================================================
|  A  |    B    |    C    |   ...   |    M     |
================================================
| No. | Player  | Round 1 |   ...   | Round 11 |
------------------------------------------------
|  1  | Male 1  |    I    |         |    I     |
|  2  | Male 2  |    I    |         |    I     |
|  3  | Male 3  |    I    |    I    |          |
|  4  | Male 4  |    I    |    I    |          |
|  5  | Male 5  |    I    |    I    |    I     |
|  6  | Male 6  |         |    I    |    I     |
|  7  | Male 7  |         |    I    |    I     |
|  8  | Female1 |    I    |         |          |
|  9  | Female2 |    I    |    I    |          |
|  10 | Female3 |    I    |    I    |    I     |
|  11 | Female4 |         |    I    |    I     |
|  12 | Female5 |         |         |    I     |

단 5 남성 플레이어는 라운드에서 플레이 할 수 있습니다.
단 3 여자 플레이어는 라운드에서 플레이 할 수 있습니다.

그래서 플레이어가 들어간 경우 해당 라운드의 난에 “I”를 입력하고 해당 라운드를 플레이하지 않으면 비어 있습니다.

다른 시트에는 “IN”인 플레이어와 “OUT”인 플레이어를 나타내는 행이 있습니다. 그런 다음 게임 라운드를 나타내는 항목이 있습니다.

그러나이 셀에서는 현재 해당 라운드에서 및 / 또는 나가는 플레이어의 이름을 수동으로 입력 (복사 / 붙여 넣기)하고 있습니다.

================================================
|  A  |    B    |    C    |   ...   |    M     |
================================================
| No. | Status  | Round 1 | Round 2 | Round 3 |
|-----------------------------------------------
| 1   |   IN    | Male 1  | Male 3  | Male 1  |
| 2   |   IN    | Male 2  | Male 4  | Male 2  |
| 3   |   IN    | Male 3  | Male 5  | Male 6  |
| 4   |   IN    | Male 4  | Male 6  | Male 7  |
| 5   |   IN    | Male 5  | Male 7  | Male 7  |
| 6   |   IN    | Female1 | Female2 | Female3 |
| 7   |   IN    | Female2 | Female3 | Female4 |
| 8   |   IN    | Female3 | Female4 | Female5 |
| 9   |   OUT   | Male 6  | Male 1  | Male 3  |
| 10  |   OUT   | Male 7  | Male 2  | Male 4  |
| 11  |   OUT   | Female4 | Female1 | Female1 |
| 12  |   OUT   | Female5 | Female5 | Female2 |

첫 번째 시트의 행과 상태를 기반으로 두 번째 시트의 열에 대한 플레이어의 이름을 자동으로 채우는 방법은 무엇입니까?

편집하다:

사용중인 데이터에 대한보다 자세한 정보를 제공하도록 내 질문이 업데이트되었습니다.

편집하다:

예제에 열 이름을 추가했습니다.



답변

나는 두 개의 도우미 행렬로 그것을 할 수있었습니다.
“도우미 셀”은 중간 값을 도출하거나 계산하는 셀입니다.
입력 데이터로부터.
이 중간 값은 다른 셀에서 사용됩니다.
원하는 결과를 얻을 수 있습니다.
일반적으로 테이블 형식의 데이터에 “도우미 열”이 있어야합니다.
나는 누군가가
내 대답을 합리화하고 더 우아하게 만들 수 있습니다.
하지만 이것은 59 분 만에 나올 수 있었던 최고의 것입니다.

헬퍼를 실제 데이터와 동일한 시트에 넣을 수 있습니다.
일반적으로 숨겨진 다른 열 또는 행에 표시됩니다.
또는 별도의 시트에 넣을 수도 있습니다.
이 답변에는 두 가지가 필요하기 때문에 두 가지 기술을 모두 설명해 드리겠습니다.
그런 다음 하나의 기술을 일관되게 사용하도록 선택할 수 있습니다.

귀하의 소스 데이터 (질문에 표시됨)
에있다 Sheet1!A2:D8행 1에 헤더가 있습니다.
놓다

=IF(B2="", "blank", B2)

세포에 AB2, 아래로 드래그 / 채우기 AB8 및 오른쪽 열에 AD.
이로 인해

   |    AA    |    AB    |    AC    |    AD    |
---+----------+----------+----------+----------+
 1 |          |          |          |          |
 2 |          |   I      |   blank  |   I      |
 3 |          |   I      |   blank  |   I      |
 4 |          |   I      |   I      |   blank  |
 5 |          |   I      |   I      |   blank  |
 6 |          |   I      |   I      |   I      |
 7 |          |   blank  |   I      |   I      |
 8 |          |   blank  |   I      |   I      |

나는 아무런 설명이 필요 없다고 믿는다.

이제는 더 복잡해집니다.
몹시 떠들어 대다 Sheet3 다음 수식을 입력하십시오.

  • B2=MATCH("I", Sheet1!AB$2:AB$8, 0)
  • B3=MATCH("I", OFFSET(Sheet1!AB$2,B2,0):Sheet1!AB$8, 0) + B2
  • B7=MATCH("blank", Sheet1!AB$2:AB$8, 0)
  • B8=MATCH("blank", OFFSET(Sheet1!AB$2,B7,0):Sheet1!AB$8, 0) + B7

셀 드래그 / 채우기 B3 아래로 B6.
만약 당신이 당신의 계획을 바꿔서 “아웃”한 명 이상의 선수가 있다면
한 번에 셀을 드래그 / 채우기해야합니다. B8 적절히 다운.
이전과 마찬가지로 열을 드래그 / 채우기 B 오른쪽에서 열까지 D.
당신은 얻을 것이다 :

   |    A    |    B    |    C    |    D    |
---+---------+---------+---------+---------+
 1 |         |         |         |         |
 2 |         |      1  |      3  |      1  |
 3 |         |      2  |      4  |      2  |
 4 |         |      3  |      5  |      5  |
 5 |         |      4  |      6  |      6  |
 6 |         |      5  |      7  |      7  |
 7 |         |      6  |      1  |      3  |
 8 |         |      7  |      2  |      4  |

설명:

  • B2 첫 번째 (상대적) 위치를 포함 I 범위 안에서 Sheet1!AB$2:AB$8.
    이것은 1, 때문에 Sheet1!AB2 ~을 포함하다 I,
    그 범위의 첫 번째 셀입니다.
    비슷하게, C2D2 있다 31,
    때문에 Sheet1!AC4Sheet1!AD2 (제 3 및 제 1 셀,
    각각 Player3 및 Player1에 해당),
    첫 번째 위치 I 그 열에
  • 보면서 B3OFFSET(Sheet1!AB$2,B2,0) ~이다. OFFSET(Sheet1!AB$2,1,0),
    이는 Sheet1!AB3.
    그래서 이건 MATCH 범위를보고있다. Sheet1!AB3:AB8.
    MATCH 또한 돌아올 것이다. 1,
    때문에 Sheet1!AB3 ~을 포함하다 I, 그리고 그것은 첫 번째 세포입니다 범위.
    그런 다음 B2 ( 1 ) 그것에, 점점 2,
    어느 위치에 둘째 I …에서 Sheet1!AB2:AB8.
  • 유사하게, MATCH 셀 안에 D4 범위를보고있다. Sheet1!AD4:AB8.
    MATCH 돌아올거야. 3,
    때문에 Sheet1!AD6 에있는 첫 번째 셀입니다. 포함 된 범위 I.
    첨가 D3 ( 2 ) 우리에게 주어지다 5그 행은 Player5에 해당하기 때문입니다.
  • 그런 다음 행 7과 8에서 동일한 작업을 수행합니다. blank.

    나는 그럴 필요가 없었을 것이다. Sheet1!AA:AD 도우미 매트릭스,
    분명히, 당신은 사용할 수 없습니다. MATCH("", …) 빈 셀을 찾는다.

이제 우리는 단지 내리막 길을 걸을 수 있습니다.
넣다 =INDEX(Sheet1!$A$2:$A$8, Sheet3!B2) 으로 Sheet2!B2.

+--------+---------+---------+---------+
| Status | Round 1 | Round 2 | Round 3 |
+--------+---------+---------+---------+
| IN     | Player1 | Player3 | Player1 |
| IN     | Player2 | Player4 | Player2 |
| IN     | Player3 | Player5 | Player5 |
| IN     | Player4 | Player6 | Player6 |
| IN     | Player5 | Player7 | Player7 |
| OUT    | Player6 | Player1 | Player3 |
| OUT    | Player7 | Player2 | Player4 |


답변

이 VBA 코드는 트릭을 수행합니다.

Public Sub players_rounds()
    first_sheet = "Sheet1"
    second_sheet = "Sheet2"
    Dim wkb As Workbook
    Dim wk1 As Worksheet
    Dim wk2 As Worksheet
    Set wkb = ThisWorkbook
    Set wk1 = wkb.Worksheets(first_sheet)
    Set wk2 = wkb.Worksheets(second_sheet)
    wk1_lastColumn = wk1.Cells(1, Columns.Count).End(xlToLeft).Column
    wk1_lastRow = wk1.Cells(Rows.Count, 1).End(xlUp).Row
    count_in = 0
    For i = 2 To wk1_lastRow
        If wk1.Cells(i, 2) = "I" Then count_in = count_in + 1
    Next i
    wk2.Cells.Clear
    wk2.Rows(1).value = wk1.Rows(1).value
    wk2.Cells(1, 1).value = "Status"
    count_out = wk1_lastRow - count_in - 1

    For i = 2 To count_in + count_out + 1
        If i <= count_in + 1 Then
            wk2.Cells(i, 1).value = "IN"
        Else
            wk2.Cells(i, 1).value = "OUT"
        End If
    Next i

    For i = 2 To wk1_lastRow
        thisplayer = wk1.Cells(i, 1)
        For j = 2 To wk1_lastColumn
            playervalue = wk1.Cells(i, j)
            playerround = wk1.Cells(1, j)
            If playervalue = "I" Then
                firstrow = 2
                lastrow = count_in + 1
            Else
                firstrow = count_in + 2
                lastrow = count_in + count_out + 1
            End If
            For k = 2 To wk1_lastColumn
                If wk2.Cells(1, k) = playerround Then
                    For m = firstrow To lastrow
                        If wk2.Cells(m, k) = "" Then
                            wk2.Cells(m, k) = thisplayer
                            m = lastrow
                            k = wk1_lastColumn
                        End If
                    Next m
                End If
            Next k
        Next j
    Next i
End Sub

다음을 사용하여 VBA / 매크로 열기 Alt + F11 , 클릭 ThisWorkbook 마우스 오른쪽 버튼을 클릭하고 끼워 넣다 그것 밑에있는 모듈. 오른쪽에 코드를 붙여 넣습니다.

변수의 값을 확인하십시오. first_sheetsecond_sheet 워크 시트의 이름과 일치해야합니다.

이 매크로를 실행할 때마다 첫 번째 시트의 값에 따라 두 번째 시트가 업데이트됩니다.

더 많은 것을 만들기 위해서 자동적 인 매크로에서 두 번, 첫 번째 시트를 두 번 클릭하고, 오른쪽에서 선택합니다. 워크 시트 변화 .

다음과 같이 만듭니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    Call players_rounds
End Sub

이제 첫 번째 시트에서 변경 될 때마다 두 번째 시트가 업데이트됩니다.