我有一个简单的宏,它通过一系列工作表,根据输入的数据收集名称,然后将其全部放在格式良好的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循环也会停止。因此,如果有人碰巧使用相同的姓氏,但是第一个名字没有检查,则不返回任何内容。
我已经尝试将返回调用放在循环之外,但它仍然没有什么区别。
答案 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)将是独一无二的?然后就不再需要解决这个问题了。