【发布时间】:2020-04-15 19:47:28
【问题描述】:
我正在尝试将一个工作表(“UserProf”)列的值与另一个工作表(“DeptClasses”)列中的值进行比较。如果这些值相同,请使用第二个工作表中另一列的值更新第一个工作表中的单独单元格。这还需要遍历第一个工作表中的值以查找匹配项。
本质上,如果工作表 1 中 A1 中的值等于工作表 2 单元格 D1、D2 或 D3 等中的值,则将工作表 1 上单元格 A2 中的值设置为工作表 2 匹配行中的值列(即如果工作表 2 中的 D1 与工作表 1 A1 匹配,则将 A2 设置为工作表 2 的 E2 单元格中的当前值等)。
每个工作表的列都有唯一的值(没有重复),并且是一个数字,但存储为文本值。我尝试将单元格的格式更改为数字,结果没有变化。每张工作表中的列范围是固定的(因此将“To lastXxx”设置为固定整数,而不使用 End(xlUp).Row 设置值。我已将此方法用于其他电子表格/跨表比较和它按我的预期工作。
在进行故障排除时,我确实添加了更多变量以显示在 VBA 的 Locals 窗口中并“进入”脚本 - 即查看正在评估的值等;据我所知,“If”语句永远不会评估为“True”,即使我可以在 Locals 中看到被比较的单元格值确实匹配。
可能有一种更有效的方法来设置范围等,但这是过去对我有用的一种方法,所以试图保持这种格式 - 主要是因为我理解它。
Sub Profiles()
Dim lastDepClass As Integer
Dim lastClass As Integer
Dim DepClass As Integer
Dim Class As Integer
lastDepClass = 137
lastClass = 106
For Class = 3 To lastClass
For DepClass = 2 To lastDepClass
If Sheets("UserProf").Cells(Class, 1).Value = Sheets("DeptClasses").Cells(DepClass, 5).Value Then
Sheets("DeptClasses").Cells(DepClass, 6) = Sheets("UserProf").Cells(DepClass, 5).Value
End If
Next DepClass
Next Class
End Sub
【问题讨论】:
-
您的工作表名称在您的 If 语句中交换。此外,第一个
DepClass应该是Class。由于您知道每个工作表的最后一行,因此除非最后一行是动态的,否则您不需要变量,只需在 For 语句中使用137和106。创建工作表变量,例如ws1和ws2不会那么混乱。我会使用x和y而不是Class和DepClass,这将使您的代码更易于阅读。根据您的问题描述查看我的简化版代码。