VBA - 搜索&替换偏移值

时间:2013-08-22 12:55:12

标签: excel vba search replace offset

在这里绝望。有一个下午完成这个,我无法弄清楚是什么导致了这个问题。

我有一份数据工作表,在这张表上有一个人员列表,他们使用的系统,他们的用户名,他们的经理等。这些数据来自外部文件,有时过时了,所以我是编写一个手动覆盖过期数据的宏(例如他们的经理)

此提取的数据位于名为“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

“提取”标签

全名|名字|姓氏|部门|用户名|系统|日期|经理访问

很抱歉,如果这没有多大意义。如果您需要我更详细地解释一下,请告诉我。

2 个答案:

答案 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 methodLookAt:=xlPart parameter一起使用会有风险。