2013-10-27 2 views
1

다른 시트의 정보를 사용하여 두 시트 모두 식별 할 수있는 열이있는 Excel 문서의 시트에 대한 정보를 여러 그룹으로 정렬하려고합니다. 특히 남성과 여성이 게임을하고 있으며 두 번째 시트의 게임 결과를 세 개의 열로 정렬하고 싶습니다. 전반적으로 남성과 여성이지만 플레이어 정보는 첫 번째 시트에 보관되며 결과 시트의 유일한 식별 기능은 첫 번째 시트에도있는 고유 한 ID 번호입니다.VBA Excel : 문이 작동하지 않는 경우

시트 1 :

 A  | B | C | D 
    Name  | Gender| | ID 
Alex   | M | | 171 
Alexis  | F | | 172 
Kelly  | F | | 177 
Chris  | M | | 179 

시트 2 :

A | B | C | D 
ID | | | Score 
171 | | | 58.2 
172 | | | 67.1 
177 | | | 73.4 
179 | | | 68.95 

지금 난 그냥 시도하고 그렇게 그 일을 얻을 수 그래서 기본적으로 I는 다음과 같이 두 장을 남성용으로 식별 된 모든 ID와 점수는 다른 시트로 복사되었으므로 두 가지 해결책이 있지만 둘 다 작동하지 않습니다.

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim lc1, lc2, x, y, i, vLook, z 

Set sh1 = Sheets("players") 
Set sh2 = Sheets("Results") 
Set sh3 = Sheets("temp") 

rcount1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row 
rcount2 = sh2.Cells(Rows.Count, "A").End(xlUp).Row 

x = 2 
y = 2 
z = 2 




Dim t As Integer 
Dim k As Integer 
k = 1 
t = 1 


For t = 1 To rcount2 

If sh2.Range("A1").Offset(t).Value = sh1.Range("D1").Offset(t).Value Then 
If sh1.Range("B1").Offset(t).Value = "M" Then 


sh3.Range("A1").Offset(k).Value = sh2.Range("A1").Offset(t).Value 
sh3.Range("B1").Offset(k).Value = sh2.Range("D1").Offset(t).Value 

k = k + 1 
End If 
End If 

Next t 

'if'문을 제거하면 범위는 'if'문으로 복사되지만 아무것도 수행하지 않습니다.

내 다른 해결책은 이것이다 :

For i = 2 To rcount2 
    vLook = Application.WorksheetFunction.VLookup(sh1.Cells(i, 4), Range(sh2.Cells(1, 1), sh2.Cells(rcount2, 4)), 4, "false") 
    If sh1.Cells(i, 2) = "M" Then 
     sh3.Cells(x, 1) = sh1.Cells(i, 4) 
     sh3.Cells(x, 2) = vLook 
     x = x + 1 
    ElseIf sh1.Cells(i, 2) = "F" Then 
     sh3.Cells(y, 3) = sh1.Cells(i, 4) 
     sh3.Cells(y, 4) = vLook 
     y = y + 1 
     Else 
     sh3.Cells(z, 5) = sh1.Cells(i, 4) 
     sh3.Cells(z, 6) = vLook 
     z = z + 1 
    End If 
Next i 

그러나 여기 그들은 단지 '다른 사람'에 맞게 것처럼이하는 모든 모든 것을 치료입니다 그래서 기본적으로 지금까지의 내가, 그것은 아무것도 표시되지 않는 것 볼 수 B 열에 M 또는 F로 표시됩니다. 도움이나 제안을 주시면 감사하겠습니다.

+1

성별 값 주변에 공백이 있는지 확인하십시오 (예 : "M"). 있다면,'TRIM $()'을 테스트에 추가 할 수 있습니다. –

+2

나는 귀하의 논리가 좋아 보이기 때문에 귀하의 서식에 동의합니다. 다음과 같이 와일드 카드를 사용할 수 있습니다 :'Sh1.Range ("B1") .Offset (t) .Value "* M *"처럼' –

답변

2

나는 당신이 위에서 제공 한 정보에 기초하고 있습니다.
이 코드는 남성 ID와 점수를 모두 Colums A and B의 임시 시트에 복사합니다.

Dim rcount1, rcount2, t as long 
Dim sh1, sh2, sh3 as Worksheet 
Dim wb as Workbook 
Dim score 

Set wb = Thisworkbook 'i included wb for flexibility, your call if you want to adopt 
Set sh1 = wb.Sheets("Players") 
Set sh2 = wb.Sheets("Results") 
Set sh3 = wb.Sheets("Temp") 

rcount1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row 

For t = 2 to rcount1 
    If sh1.Range("B" & t).Value Like "*M*" Then 
     'rcount2 should be inside your loop, otherwise you'll only overwrite values 
     rcount2 = sh3.Cells(Rows.Count, "A").End(xlUp).Row 
     sh1.Range("D" & t).copy sh3.Range("A" & rcount2 + 1) 
     'I used Vlookup function instead of nesting another loop 
     With Application.WorksheetFunction 
      score = .Vlookup(sh1.Range("D" & t).Value, sh2.Columns("A:D"), 4, 0) 
      sh3.Range("B" & rcount2 + 1).value = score 
     End with 
    End if 
Next t 

End Sub 

이 코드는 위의 작업을 조합 한 것과 같습니다.
희망이 시작되었습니다.

이 코드는 "Players"및 "Results"시트의 정보 만 통합합니다.
의미, "Temp"시트에 이미 ID가 있는지 확인하지 않습니다.
또한 요약하지 않습니다.
나는 나머지를 너에게 맡긴다.

+0

포틀랜드 러너 코드를 추가하는 대답이 업데이트되었습니다. – L42

+0

+1 코드를 통합하는 데 사용되는 좋은 방법입니다. –

관련 문제