对于每个循环不通过所有数据

时间:2013-05-10 15:52:58

标签: vba excel-vba excel

我有一个简单的宏,它通过一系列工作表,根据输入的数据收集名称,然后将其全部放在格式良好的Word文档中。我已经弄明白了,但是一个bug让我感到烦恼。它与根据名称获取手机号码的代码有关。这是功能:

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”。第一列具有姓氏,第二列具有名字,第四列具有手机号码。有些人的名字有多个部分,这就是为什么你会看到一些奇怪的分裂,ReDiming和重新加入的原因。那部分工作正常。

如果您有多个姓氏相同的人,则会出现问题。该函数将找到具有正确姓氏的人,通过第一个If语句。然后它将比较名字。如果匹配,它将返回手机号码的值,就像它应该的那样。之后,即使第一个名称不匹配,for循环也会停止。因此,如果有人碰巧使用相同的姓氏,但是第一个名字没有检查,则不返回任何内容。

我已经尝试将返回调用放在循环之外,但它仍然没有什么区别。

2 个答案:

答案 0 :(得分:4)

由于您没有使用数据库,因此主键列可能很难。根据您当前的设置,您可以试试这个。 它

  • 不会查看列中的每个单元格
  • 使用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

答案 1 :(得分:2)

通过尝试修复此问题,您似乎正在推迟处理真正的问题。

您遇到了问题,因为您的“密钥”(名称)不是唯一的。你已经解决了一个命名冲突,现在你正试图解决另一个。

如何获得您知道的密钥(如GUID)将是独一无二的?然后就不再需要解决这个问题了。