VBA - 使用条件列表选择、清除、替换数值

3

好的,我回来了。这次我想快速选择与单独列表中的值匹配的范围内所有值,我的第一轮尝试将是清除无效ID的内容,第二轮尝试将选择这些值,然后用相应的新值替换它们。

我之前提出了另一个有关VBA的问题,并被建议提到我尝试过自学并找到资源来解决这些问题,但人们似乎很生气我在问,如果你至少可以指引我去某个地方学习这些问题(或者甚至是可以学习基本逻辑和具有可用函数列表而不必浏览所有“如何为一些没人关心的问题制作您的第一个Excel VBA”),我会非常感激。

无论如何,我尝试观看了几个视频,然后组合了一些东西,但很明显他们使用的函数不能用于其他用途。目前我拥有以下代码:

Sub FilterElim()
    finalRow = Range("g2").End(xlDown).Row
    Range("A1").ClearContents _
        Action:= xlClearContents, _
        CriteriaRange: Range("Sheet4!B1:B10"), _
        Unique:= False
End Sub

根据一些有用的问题,我进行了编辑以包括一个示例和期望的结果。

示例集合: 输入图片描述

期望的最终结果:

输入图片描述

我假设在清除内容之前需要根据条件执行某种选择,但我没有找到任何有用的信息来解决这个问题。请帮忙,谢谢。

| Contractor   ID | Cont Name         | Proj 1 | Proj 2 | Proj 3 |   |   | Old ID | Reconciliation |
|-----------------|-------------------|--------|--------|--------|---|---|--------|----------------|
| C1001           | Boba Fet          | P1120  |        |        |   |   | P1001  | Void           |
| C1003           | Jules Winnfield   | P1031  | P1045  |        |   |   | P1002  | P1010          |
| C1002           | Dom Cobb          | P1001  |        |        |   |   | P1005  | Void           |
| C1010           | Patrick Verona    | P1020  | P1224  | P1251  |   |   | P1020  | Void           |
| C1007           | Matt Damon        | P1008  | P1005  | P1300  |   |   | P1045  | P1100          |
| C1004           | Ned Plimpton      | P1002  |        |        |   |   | P1224  | P1300          |
| C1020           | Derek Zoolander   | P1020  | P1290  |        |   |   |        |                |
| C1009           | Charles Marlow    | P1002  | P0090  |        |   |   |        |                |
| C1011           | Robert Jordan     | P1119  |        |        |   |   |        |                |
| C1015           | Perrin Aybara     | P1200  | P1224  |        |   |   |        |                |
| C1005           | Fuzzy Dunlop      | P1005  |        |        |   |   |        |                |
| C1008           | Thomas A Anderson | P1001  | P1000  |        |   |   |        |                |
|                 |                   |        |        |        |   |   |        |                |

1
你能分享一些数据和期望的输出吗?你可以使用markdown表格生成器以一种我们可以复制粘贴格式化的方式共享数据。当你将markdown表格粘贴到问题中时,通过[编辑]突出显示表格并按Ctrl+K键输入格式化。 - QHarr
啊,太感谢你的回复了。我看到你的初始问题后就立刻开始制作示例,没有看到你的Markdown建议。我已经进行了编辑,并且如果你认为这是一个安全的方法,我可以分享一个Google表格的示例? - Colter Miller
好的,我已经将数据放入了一个 Markdown 表格中。 - Colter Miller
1个回答

3

您为什么选择使用VBA解决方案?如果没有查看数据和预期结果,很难做出更多的事情。

非VBA选项:

=IFERROR(INDEX($G$2:$G$15,MATCH(A32,$F$2:$F$15,0)),B32)

enter image description here

如果选择VBA选项,则可以尝试以下方法:

Option Explicit

Sub update_id()

Dim D1 As Object: Set D1 = CreateObject("scripting.dictionary")
Dim R1 As Range: Set R1 = Range("A2:A32")
Dim R2 As Range: Set R2 = Range("E2:E15")
Dim Rtmp As Range

For Each Rtmp In R2
    D1(Rtmp.Value) = Rtmp.Offset(0, 1).Value
Next Rtmp

For Each Rtmp In R1
    If D1.exists(Rtmp.Value) Then Rtmp.Offset(0, 1) = D1(Rtmp.Value)
Next Rtmp

End Sub

我正在处理以下设置:

enter image description here

如果没有更好地了解您的数据和问题,很难更加精确。


非常感谢!我并没有固定使用VBA,这个过程我可能需要以多种方式多次执行,所以我只是想通过创建可复制的过程来节省长期时间,并认为VBA可能最好地促进了这一点。我已经包含了一个示例集,并且如果您认为这是一种安全共享的方式,我可以提供访问谷歌表格的权限。 - Colter Miller
嘿,O.Pal,我添加了一些信息。我不确定它是否会改变你的方法,但想让你知道。最好-C - Colter Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接