2013-10-27 4 views
1

Я пытаюсь отсортировать некоторую информацию на листе в документе excel в разных группах, используя информацию из другого листа, причем оба листа имеют столбец для их идентификации. В частности, игра проводится мужчинами и женщинами, и я хочу сортировать результаты игры во втором листе на три столбца; в целом, мужчины и женщины, но информация о игроках хранится в первом листе, причем единственной идентифицирующей функцией в листе результатов является их уникальный идентификационный номер, который также находится на первом листе. Поэтому в основном у меня есть два листа, которые выглядят следующим образом: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 

Прямо сейчас я просто пытаюсь заставить его работать так, чтобы все идентификаторы и оценки, обозначенные как мужчина, скопированы на другой лист, для этого у меня есть два разных решения, но ни одна из них не работает.

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 столбца листа 1 как M или F. Любая помощь или предложения будут оценены.

+1

Проверьте, есть ли какие-либо пробелы вокруг ваших гендерных значений, например «M». Если есть, вы можете добавить 'TRIM $()' к вашим тестам. –

+2

Я согласен, ваша логика выглядит хорошо, поэтому, вероятно, это ваше форматирование. Вы можете попробовать использовать подстановочный знак следующим образом: 'Если sh1.Range (" B1 "). Offset (t) .Value Like" * M * "Then' –

ответ

2

Я просто основывал это на информации, которую вы указали выше.
Этот код копирует все идентификаторы мужчин и баллы на лист Temp в 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 

Так что этот код похож на комбинацию ваших работ выше.
Надеюсь, что вы начали.

Этот код только консолидирует информацию с листа «Игроки» и «Результаты».
Смысл, он не проверяет, существует ли идентификатор в листе «Темп».
Кроме того, он не суммирует.
Я оставляю остальное вам.

+0

обновленный ответ, добавляющий код Portland Runners. – L42

+0

+1 Хорошие методы, используемые для консолидации кода. –

Смежные вопросы