1

我有一个简单的宏,它通过一系列工作表,根据输入的数据收集名称,然后将它们全部放入格式良好的 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 循环也会停止。因此,如果有人碰巧有相同的姓氏,但没有检查名字,则它不会返回任何内容。

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

4

2 回答 2

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
于 2013-05-10T16:23:02.730 回答
2

似乎您通过尝试解决这个问题来推迟处理真正的问题。

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

获取一个您知道将是唯一的密钥(如 GUID)怎么样?那么就不需要再解决这个问题了。

于 2013-05-10T15:57:47.950 回答