[英]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.