0

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

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

此提取的数据位于名为“Extract”的工作表上。

我有另一个名为“数据”的工作表,在这个工作表中我有两个表;系统名称 - “NoS” - 和覆盖管理器名称 - “OMN”。这些表彼此相邻。这个想法是我的宏将在NoS上搜索一个名称,如果找到它,它将用“OWN”中相邻单元格中的值替换他们的管理器(右边是 7 个单元格)

注意我正在使用表/命名范围,以便在添加名称时范围在 VBA 上动态更新

目前,当我运行宏时,它正在更改人员经理的名称,但是它也在更改其他行上其他单元格的值(即使“提取”中的人员名称不在“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

“数据”选项卡

系统名称 | 覆盖经理名称

唐唐纳森 | 新经理

亚伦亚伦森 | 新经理 2

大卫戴维森 | 新经理 3

“提取”选项卡

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

对不起,如果这没有多大意义。如果您需要我更详细地解释某些事情,请告诉我。

4

2 回答 2

1

我可能在这里误解了您的意图,但我只会VLOOKUP在“提取”表的第 8 列中使用一个公式。

=IF(ISNA(VLOOKUP(Extract!A1,NameAndManager,2,FALSE)), "manager not found",VLOOKUP(Extract!A1,NameAndManager,2,FALSE))

将 NoS 和 OMN 合并为一个范围,NameAndManager。

您可以将该公式复制到“经理访问”列中的所有单元格中。

如果您不希望出现“找不到经理”,并且希望它保持现有名称不变,只需将此公式放入新列中,如果未找到名称,则将其默认为“”。然后你可以做一个简单的IF公式来创建一个包含所有正确经理名称的新列。

于 2013-08-22T13:34:26.770 回答
0

我的第一个想法是建议您尝试使用 F8 键运行您的子程序,以查看您的代码执行方式。这应该会有所帮助。

但是,我认为(但我不确定,因为我无法检查)您需要添加:

   Set FoundOne = Nothing

就在.Replace方法之后,但在If Not FoundOne Is Nothing Then结构内。

如果合适,您还可以考虑使用Exit For退出循环。

此外,如果我们看不到您的数据,就很难确切地提出建议。尤其是.Find methodLookAt:=xlPart parameter.

于 2013-08-22T13:35:18.067 回答