내가 할 수있는 한 최선을 다해 표제어를 쓰려고 노력했고 설명하기 위해 최선을 다할 것입니다. 필요한 경우 제목을 다시 지정하는 것에 대한 제안을하겠습니다.
나는 스포츠에서 선수가하는 라운드를 추적하기 위해 사용하려고하는 두 장의 시트가 있습니다. 그들은 본질적으로 다르게 제시된 동일한 데이터입니다.
한 시트에는 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
,
그 범위의 첫 번째 셀입니다.
비슷하게,C2
과D2
있다3
과1
,
때문에Sheet1!AC4
과Sheet1!AD2
(제 3 및 제 1 셀,
각각 Player3 및 Player1에 해당),
첫 번째 위치I
그 열에- 보면서
B3
–OFFSET(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_sheet
과 second_sheet
워크 시트의 이름과 일치해야합니다.
이 매크로를 실행할 때마다 첫 번째 시트의 값에 따라 두 번째 시트가 업데이트됩니다.
더 많은 것을 만들기 위해서 자동적 인 매크로에서 두 번, 첫 번째 시트를 두 번 클릭하고, 오른쪽에서 선택합니다. 워크 시트 과 변화 .
다음과 같이 만듭니다.
Private Sub Worksheet_Change(ByVal Target As Range)
Call players_rounds
End Sub
이제 첫 번째 시트에서 변경 될 때마다 두 번째 시트가 업데이트됩니다.