Excel IF/MID 显示附加数据的循环结果
Excel IF/MID loop result showing additional data
我正在处理一个包含 100,000 多行的固定格式文本文件,我将其复制并粘贴到名为 DATA 的 sheet 中。此 sheet 中的所有行都以 AVS 或 AVD 开头。我有下面的代码,它使用 IF
MID
函数循环遍历 DATA sheet 。如果该行的前 3 个字符以 AVS 开头,我只希望它提取数据。当它运行时,它会正确地从 AVS 行检索数据,但随后的行显示相同的数据,即使它们以 AVD 开头。我在下面列出了一个示例。我认为这可能与错误处理有关,但我不知道。我没有收到任何错误,我只是收到了不需要的额外数据。你们能提供的任何帮助都会很棒!
Sub AVS()
Dim ws As Worksheet
Dim ws1 As Worksheet
Set ws = ThisWorkbook.Worksheets("DATA")
Set ws1 = ThisWorkbook.Worksheets("AVS")
Dim lastRow, myLoop, newValue
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).row
Application.ScreenUpdating = False
'Range("A" & lastRow).ClearContents
For myLoop = 1 To lastRow
If MID(ws.Range("A" & myLoop).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
End If
ws1.Range("A" & myLoop).Value = newValue
Next
Application.ScreenUpdating = True
End Sub
数据样本 sheet:
AVS00001 Y6678 NN B5UP
AVD00001 6678 N INQN B5UP6678
AVS00001 Y6678 NN 0067
AVD00001 6678 N INQN 00676678
AVS00001 G6678 NN 1381
AVD00001 6678 N INQN 13816678
AVS00001 Y6678 NN 1922
AVD00001 6678 N INQN 192210-61096-58
AVD00001 6678 N INQN 19226678
AVD00001 6678 N INQN 19226678
AVS00001 Y6678 NN 5018
当前结果
B5UP (CORRECT)
B5UP (WRONG, ROW STARTS WITH AVD)
0067 (CORRECT)
0067 (WRONG, ROW STARTS WITH AVD)
1381 (CORRECT)
1381 (WRONG, ROW STARTS WITH AVD)
1922 (CORRECT)
1922 (WRONG, ROW STARTS WITH AVD)
1922 (WRONG, ROW STARTS WITH AVD)
1922 (WRONG, ROW STARTS WITH AVD)
5018 (CORRECT)
铜
如果我从评论中理解正确,这应该有效:
Dim RowCounter as long
RowCounter = 1
For myLoop = 1 To lastRow
If MID(ws.Range("A" & myLoop).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
ws1.Range("A" & RowCounter).Value = newValue
RowCounter = RowCounter + 1
End If
Next
我正在处理一个包含 100,000 多行的固定格式文本文件,我将其复制并粘贴到名为 DATA 的 sheet 中。此 sheet 中的所有行都以 AVS 或 AVD 开头。我有下面的代码,它使用 IF
MID
函数循环遍历 DATA sheet 。如果该行的前 3 个字符以 AVS 开头,我只希望它提取数据。当它运行时,它会正确地从 AVS 行检索数据,但随后的行显示相同的数据,即使它们以 AVD 开头。我在下面列出了一个示例。我认为这可能与错误处理有关,但我不知道。我没有收到任何错误,我只是收到了不需要的额外数据。你们能提供的任何帮助都会很棒!
Sub AVS()
Dim ws As Worksheet
Dim ws1 As Worksheet
Set ws = ThisWorkbook.Worksheets("DATA")
Set ws1 = ThisWorkbook.Worksheets("AVS")
Dim lastRow, myLoop, newValue
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).row
Application.ScreenUpdating = False
'Range("A" & lastRow).ClearContents
For myLoop = 1 To lastRow
If MID(ws.Range("A" & myLoop).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
End If
ws1.Range("A" & myLoop).Value = newValue
Next
Application.ScreenUpdating = True
End Sub
数据样本 sheet:
AVS00001 Y6678 NN B5UP
AVD00001 6678 N INQN B5UP6678
AVS00001 Y6678 NN 0067
AVD00001 6678 N INQN 00676678
AVS00001 G6678 NN 1381
AVD00001 6678 N INQN 13816678
AVS00001 Y6678 NN 1922
AVD00001 6678 N INQN 192210-61096-58
AVD00001 6678 N INQN 19226678
AVD00001 6678 N INQN 19226678
AVS00001 Y6678 NN 5018
当前结果
B5UP (CORRECT)
B5UP (WRONG, ROW STARTS WITH AVD)
0067 (CORRECT)
0067 (WRONG, ROW STARTS WITH AVD)
1381 (CORRECT)
1381 (WRONG, ROW STARTS WITH AVD)
1922 (CORRECT)
1922 (WRONG, ROW STARTS WITH AVD)
1922 (WRONG, ROW STARTS WITH AVD)
1922 (WRONG, ROW STARTS WITH AVD)
5018 (CORRECT)
铜
如果我从评论中理解正确,这应该有效:
Dim RowCounter as long
RowCounter = 1
For myLoop = 1 To lastRow
If MID(ws.Range("A" & myLoop).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
ws1.Range("A" & RowCounter).Value = newValue
RowCounter = RowCounter + 1
End If
Next