[英]For Each loop not going through all the data
我有一個簡單的宏,它經過一系列工作表,根據輸入的數據收集名稱,然后將其全部放入格式正確的Word文檔中。 我已經弄清楚了大部分,但是有一個錯誤讓我很煩。 它與根據名稱獲取手機號碼的代碼有關。 這是函數:
Function findCell(namePerson As String) As String
Dim splitName As Variant
Dim lastName As String
Dim firstName As String
splitName = Split(namePerson, " ")
lastName = splitName(UBound(splitName))
ReDim Preserve splitName(UBound(splitName) - 1)
firstName = Join(splitName)
For Each b In Worksheets("IT").Columns(1).Cells
If b.Value = lastName Then
If Sheets("IT").Cells(b.row, 2).Value = firstName Then findCell = Sheets("IT").Cells(b.row, 4).Value
End If
Next
End Function
手機號碼在其自己的表上稱為“ IT”。 第一列具有姓氏,第二列具有名字,第四列具有手機號碼。 有些人的名字有多個部分,這就是為什么您看到一些奇怪的拆分,重新定位和重新結合在一起的原因。 那部分工作正常。
當您有多個姓氏相同的人時,就會出現此問題。 該函數將通過第一個If語句找到姓氏正確的人。 然后它將比較名字。 如果匹配,它將像應返回的那樣返回手機號碼的值。 之后,即使名字不匹配,for循環也會停止。 因此,如果有人碰巧使用了相同的姓氏,但名字沒有被核對,則不會返回任何內容。
我已經嘗試將return調用放到循環外部,但這仍然沒有任何效果。
由於您沒有使用數據庫,因此主鍵列可能很困難。 通過當前設置,您可以嘗試執行此操作。 它
Option Explicit
。
Option Explicit
Function findCell(namePerson As String) As String
Dim splitName As Variant
Dim lastName As String
Dim firstName As String
splitName = Split(namePerson, " ")
lastName = splitName(UBound(splitName))
ReDim Preserve splitName(UBound(splitName) - 1)
firstName = Join(splitName)
Dim ws As Worksheet, lastrow As Long, r As Long
Set ws = Worksheets("IT")
lastrow = ws.Cells(1, 1).End(xlDown).Row 'or whatever cell is good for you
For r = 1 To lastrow
If UCase(Trim(ws.Cells(r, 1))) = UCase(Trim(lastName)) _
And UCase(Trim(ws.Cells(r, 2))) = UCase(Trim(firstName)) Then
findCell = ws.Cells(r, 4)
Exit For
End If
Next r
End Function
看來您是想通過解決此問題來推遲處理實際問題。
您遇到了問題,因為您的“鍵”(名稱)不是唯一的。 您已經解決了一個命名沖突,現在您正嘗試解決另一個命名沖突。
如何獲得您知道唯一的密鑰(如GUID)呢? 這樣就不再需要解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.