我正在自动化我的工作流程,并试图解决将来会出现的一些问题。我的部分流程是导入不同的电子表格,查找员工姓名,然后找出他们的经理是谁。我面临的问题是人们在不同的系统上被称为不同的名字。例如,名为“Donald Donaldson”的人在系统上可能被称为“Don Donaldson”,但他的全名在员工名单上。或者,戴夫戴维森是系统上的戴维戴维森。
这会发生很多次(因为有些人在系统列表中出现了 2 次)并且会减慢整个过程,而我的同事会手动解决问题。为了解决这个问题,我在我的数据选项卡上创建了 3 个表/动态命名范围。每张表(如下所示)都有不同的用途;错误名称列表(“名称”)、替换名称列表(“Rep”)和从系统中提取的名称列表(“比较”)。我想查看比较列表以查看是否出现任何“名称”实例。如果它找到一个实例,那么它将用正确的名称替换名称
我觉得我非常接近完成需要完成的任务,但我缺乏那一刻的辉煌来帮助我突破。
我的方法
我有 3 个动态命名范围(范围长度会根据从其他文件中提取的内容而变化),并且我将它们存储为 3 个动态数组(出于这个原因)。我的代码循环遍历 Names 中的每个元素、Rep 中的每个元素和 Compare 中的每个元素。如果 Compare (z) 中的值等于 Names (x) 中的值,那么我们将它的值更改为 Rep 中的值(所以 z = y) 问题是只有 z 的值发生了变化,并且不是我数组中的相应值。即唐唐纳森是比较中的第三个元素。我找到了一个匹配项,因此 Z 从 Don Donaldson 更改为 Donald Donaldson。然而,比较(3)仍然是唐唐纳森。
我尝试制作第 4 个动态数组,并使用 ReDim 在每次迭代时增加它的长度。每次匹配时,myArr(index) 都等于 y,并且在循环之后将第四个命名范围(“TestRange”)设置为此数组的值,这种方法也不起作用。
有人可以帮助我吗?如何更改数组中元素的值(比较)以及如何将这个新数组输出到命名范围?
我的代码和我的数据示例如下所示。
请帮忙。谢谢
Sub mySub()
Dim Arr() As Variant
Arr = Worksheets("Data").Range("Names").Value
Dim comArr() As Variant
comArr = Worksheets("Data").Range("Compare").Value
Dim repArr() As Variant
repArr = Worksheets("Data").Range("Rep").Value
Dim comInt As Integer
comInt = 0
Dim RowCounter As Long
Dim ArrayCounter As Long
Dim x As Variant
Dim y As Variant
Dim z As Variant
Dim zInt As Integer
zInt = 0
Dim myArr() As Variant
For Each x In Arr
For Each y In repArr
For Each z In comArr
'ReDim myArr(0 To zInt) As Variant
If z = x Then
z = y
'myArr(zInt) = y
End If
zInt = zInt + 1
Next z
Next y
Next x
'Worksheets("Data").Range("TestRange").Value = comArr()
'Worksheets("Data").Range("TestRange").Value = myArr()
End Sub
*我的命名范围 抱歉布局混乱
“名字” 唐唐纳森、大卫戴维森、迈克迈克尔斯、帕特帕特森、史蒂夫史蒂文森、杰克杰克逊、罗伯特罗伯逊、哈维哈维、约翰约翰逊
“众议员” 唐纳德·唐纳森、戴夫·戴维森、迈克尔·迈克尔斯、帕特里克·帕特森、史蒂文·斯蒂芬森、杰克·杰克逊、罗伯·罗伯逊、哈夫·哈维、乔恩·约翰逊
“比较” 唐唐纳森、迈克迈克尔斯、杰克杰克逊、约翰约翰逊、帕特帕特森、珀西帕金斯、唐唐纳森、汤姆汤姆森、哈维哈维、马克马库斯、克里斯克里斯托弗森、米奇米切尔、杰克杰克逊、罗伯罗伯逊