在这里绝望。有一个下午完成这个,我无法弄清楚是什么导致了这个问题。
我有一份数据工作表,在这张表上有一个人员列表,他们使用的系统,他们的用户名,他们的经理等。这些数据来自外部文件,有时过时了,所以我是编写一个手动覆盖过期数据的宏(例如他们的经理)
此提取的数据位于名为“Extract”的工作表上。
我有另一个名为“Data”的工作表,在这个工作表中我有两个表;系统名称 - “NoS” - 和覆盖管理员名称 - “OMN”。这些表彼此相邻。我的想法是我的宏将在 NoS 上搜索一个名称,如果它找到了它,那么它将替换它们的管理器(右边的7个单元格)中的相邻单元格中的值。强> “自己”
的 N.B。我正在使用表/命名范围,以便在添加名称时,范围在VBA上动态更新
目前,当我运行宏时,它正在更改人员管理器的名称,但是它也会更改其他行上其他单元格的值(即使“Extract”中的人员姓名不在“NoS”上)我的代码,以及我的一些数据如下,是否有人知道导致问题的原因以及我如何解决它?
Dim c, exceptionNames, extractNames, FoundOne As Range
Set exceptionNames = Range("NoS")
Set extractNames = Worksheets("Extract").Range("A1:I200")
For Each c In exceptionNames
With extractNames
Set FoundOne = .Find(What:=c, LookAt:=xlPart)
If Not FoundOne Is Nothing Then
extractNames.Replace What:=FoundOne.Offset(0, 7), Replacement:=c.Offset(0, 1).Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End If
End With
Next c
End Sub
“数据”标签
系统上的名称|覆盖管理员名称
唐·唐纳森|新经理Aaron Aaronson |新经理2
大卫戴维森|新经理3“提取”标签
全名|名字|姓氏|部门|用户名|系统|日期|经理访问
很抱歉,如果这没有多大意义。如果您需要我更详细地解释一下,请告诉我。
答案 0 :(得分:1)
我可能会在这里误解你的意图,但我只会在第8栏的'Extract'页面上使用VLOOKUP
公式。
=IF(ISNA(VLOOKUP(Extract!A1,NameAndManager,2,FALSE)), "manager not found",VLOOKUP(Extract!A1,NameAndManager,2,FALSE))
将NoS和OMN合并到一个范围,即NameAndManager。
您只需将该公式复制到“管理员访问权限”列中的所有单元格即可。
如果您不希望出现“找不到经理”,并且您希望它保持现有名称不变,只需将此公式放入新列中,如果找不到该名称,则将其默认为“”。然后,您可以使用简单的IF
公式创建一个包含所有正确管理器名称的新列。
答案 1 :(得分:0)
我的第一个想法是建议您尝试使用F8键运行您的sub,以查看您的代码执行的方式。这应该有所帮助。
然而,我认为(但我不确定,因为我无法检查)你需要添加:
Set FoundOne = Nothing
仅在.Replace
方法之后,但在If Not FoundOne Is Nothing Then
结构中。
如果合适,您还可以考虑使用Exit For
退出循环。
此外,如果我们看不到您的数据,很难确定某些内容。特别是将.Find method
与LookAt:=xlPart parameter
一起使用会有风险。