excel - VBA 代码中的多个 IF 语句可根据另一列从多列中提取不同的单元格值。
问题描述
抱歉,如果以前有人问过这个问题,但我找不到与我已经拥有的代码匹配的解决方案,除了我添加的条件之外,它几乎可以工作。
解释:
我在 Sheet1 中有多个记录 #s。我需要在 Sheet2 中找到相同的匹配项,当找到时,我需要它根据第 7 列中的值(以及随后的行号)返回第 8 列和第 15 列中的所有值。
例如:
Sheet1:
Column 1
123
999
989
Sheet2:
Column1 Column7 Column8 Column 15
321 PRA PRAABC Completed
123 IRA IRABCD Cancelled
000 TPSD TPSDRST Completed
989 APSD APSDABC In Prog
所以结果将是:
123 IRABCD 取消
第989章
我的代码如下:
Sub CopyBasedonSheet1()
Dim i As Long
Dim j As Long
Sheet1LastRow = Worksheets("Sheet1").Range("O" & Rows.Count).End(xlUp).Row
Sheet2LastRow = Worksheets("Sheet2").Range("B" & Rows.Count).End(xlUp).Row
For j = 1 To Sheet1LastRow
For i = 1 To Sheet2LastRow
If Worksheets("Sheet1").Cells(j, 15).Value = Worksheets("Sheet2").Cells(i, 2).Value Then 'if Engagement # from sheet1 matches sheet2
If Worksheets("Sheet2").Cells(i, 7) = "IRA" Then
Worksheets("Sheet1").Cells(j, 23).Value = Worksheets("Sheet2").Cells(i, 8).Value
Worksheets("Sheet1").Cells(j, 24).Value = Worksheets("Sheet2").Cells(i, 15).Value
If Worksheets("Sheet2").Cells(i, 7) = "TPSD" Then
Worksheets("Sheet1").Cells(j, 25).Value = Worksheets("Sheet2").Cells(i, 8).Value
Worksheets("Sheet1").Cells(j, 26).Value = Worksheets("Sheet2").Cells(i, 15).Value
ElseIf Worksheets("Sheet2").Cells(i, 7) = "CA" Then
Worksheets("Sheet1").Cells(j, 27).Value = Worksheets("Sheet2").Cells(i, 8).Value
Worksheets("Sheet1").Cells(j, 28).Value = Worksheets("Sheet2").Cells(i, 15).Value
Else
End If
Next i
Next j
End Sub
我收到一个"Next without For"
错误Next i
解决方案
这就是您的代码的简化版本。值得注意的变化是
- 声明工作表变量 (
ws1
&ws2
) 以减少您必须键入/读取字符串的次数Worksheets("Sheet#")
- 从
ElseIf
方法切换到使用Select Case
- 更正了最后一行计算中的一些不合格对象
Option Explicit
为清楚起见添加
谈到效率,您可能会更好地循环遍历数组而不是像这样的范围。无论哪种方式,切换Screen Updating
以加快速度都是一个好主意。
Option Explicit
Sub CopyBasedonSheet1()
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Sheet1")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Sheet2")
Dim i As Long, j As Long
Dim LRow1 As Long, LRow2 As Long
LRow1 = ws1.Range("O" & ws1.Rows.Count).End(xlUp).Row
LRow2 = ws2.Range("B" & ws2.Rows.Count).End(xlUp).Row
For j = 1 To LRow1
For i = 1 To LRow2
If ws1.Cells(j, 15).Value = ws2.Cells(i, 2).Value Then
Select Case ws2.Cells(i, 7)
Case "IRA"
ws1.Cells(j, 23).Value = ws2.Cells(i, 8).Value
ws1.Cells(j, 24).Value = ws2.Cells(i, 15).Value
Case "TPSD"
ws1.Cells(j, 25).Value = ws2.Cells(i, 8).Value
ws1.Cells(j, 26).Value = ws2.Cells(i, 15).Value
Case "CA"
ws1.Cells(j, 27).Value = ws2.Cells(i, 8).Value
ws1.Cells(j, 28).Value = ws2.Cells(i, 15).Value
End Select
End If
Next i
Next j
End Sub
推荐阅读
- c# - 如何使用 Yandex Disk c# Api
- node.js - 从 Nodejs 应用程序内部发出 API 请求
- java - 根据可变对象字段对对象列表进行排序
- python - 我想用 OneToOne User 对象字段创建和更新 UserProfile 对象,并在 Django rest 框架中创建一个 api
- html - HTML 和 CSS 新手 | 如何从我的笔记本电脑添加自定义字体?
- python - 提取分隔符熊猫之间的值
- firebase - 拦截通过 URL 传递到 Firebase 上托管的 Flutter Web 应用程序的令牌
- flutter - Flutter 如何获取有状态小部件字段的值?
- javascript - 从表单中输入一个数组并在 ReactJs 中将其发布到服务器
- perl - 使用 @ARGV 从嵌套反引号调用时返回变量