2013-10-27 220 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 

現在我只是想獲得它使工作所有標識爲男性的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 

但在這裏它是所有治療的一切,如果他們只適合「其他」 所以基本上就我所看到的,它不是在看什麼表1的B欄作爲M或F.任何幫助或建議,將不勝感激。

+1

檢查性別值是否有空格,例如「M」。如果有的話,你可以在測試中添加'TRIM $()'。 –

+2

我同意,你的邏輯看起來不錯,所以它可能是你的格式。你可以嘗試使用這樣的通配符:'如果sh1.Range(「B1」)。Offset(t).Value Like「* M *」Then' –

回答

2

我只是基於你上面提供的信息。
此代碼分別將所有男性ID和分數複製到Colums A and B的Temp表單中。

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 

所以這段代碼就像你上面的作品的組合。
希望這個得到你的開始。

此代碼僅合併「玩家」和「結果」表中的信息。
含義,它不檢查ID是否已存在於「Temp」表中。
此外,它不總結。
我把剩下的給你。

+0

更新回答添加波特蘭跑者代碼。 – L42

+0

+1用於合併代碼的好方法。 –