尝试循环 IF(MID 工作表中的函数
Trying to loop IF(MID function in worksheet
我有一个名为 Data
的 sheet,我从固定宽度的 .txt
文件中复制和粘贴数据。我需要遍历每一行并从中提取数据,大约有 100,000 多行数据,如果它符合条件,它会在名为 AVS
的 sheet 上显示结果。我确定我遗漏了一些简单的东西,但对于我的一生来说,它只会给我第一行的结果,然后才停止。
这是我目前的情况:
Sub AVSRev()
Dim ws As Worksheet, thisRng As Range, ws1 As Worksheet
Dim lastrow As Long
Set ws1 = ThisWorkbook.Sheets("Data")
Set ws = ThisWorkbook.Sheets("AVS")
Set thisRng = ws.Range("A1")
Application.ScreenUpdating = False
With ws
lastrow = .Range("A" & .Rows.Count).End(xlUp).row
If Mid(ws1.Range("A1:A" & lastrow).Value, 1, 3) = "AVS" Then
thisRng = Mid(ws1.Range("A1:A" & lastrow).Text, 48, 4)
End If
On Error Resume Next
Cells.SpecialCells(xlCellTypeFormulas, xlErrors).Clear
Application.ScreenUpdating = True
End With
End Sub
经过几天的折腾,我重写了如下代码。我没有像以前那样收到任何错误,但它需要很长时间,完成后没有列出任何数据。
Option Explicit
Sub test123()
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
Dim AVS As Range
Application.ScreenUpdating = False
Range("A" & lastRow).ClearContents
For myLoop = 1 To lastRow
On Error Resume Next
AVS = MID(ws.Range("A1:A" & myloop).Value, 1, 3)
If IsError(AVS.Value) Then
If Err.Number <> 0 Then
Err.Clear
On Error GoTo 0
End If
Else
If AVS = "AVS" Then
'If MID(ws.Range("A1:A" & lastRow).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
End If
End If
ws1.Range("A" & myLoop).Value = newValue
Next
Application.ScreenUpdating = True
End Sub
我还在下面列出了我试图从 "Data" sheet 上检索的数据示例。
Sample Data
感谢大家的帮助!
感谢@ScottHoltman 和@Gaffi,我设法让我的代码循环如下:
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
它确实提出了另一个问题,我将通过另一个 post 来解决。
谢谢。
我有一个名为 Data
的 sheet,我从固定宽度的 .txt
文件中复制和粘贴数据。我需要遍历每一行并从中提取数据,大约有 100,000 多行数据,如果它符合条件,它会在名为 AVS
的 sheet 上显示结果。我确定我遗漏了一些简单的东西,但对于我的一生来说,它只会给我第一行的结果,然后才停止。
这是我目前的情况:
Sub AVSRev()
Dim ws As Worksheet, thisRng As Range, ws1 As Worksheet
Dim lastrow As Long
Set ws1 = ThisWorkbook.Sheets("Data")
Set ws = ThisWorkbook.Sheets("AVS")
Set thisRng = ws.Range("A1")
Application.ScreenUpdating = False
With ws
lastrow = .Range("A" & .Rows.Count).End(xlUp).row
If Mid(ws1.Range("A1:A" & lastrow).Value, 1, 3) = "AVS" Then
thisRng = Mid(ws1.Range("A1:A" & lastrow).Text, 48, 4)
End If
On Error Resume Next
Cells.SpecialCells(xlCellTypeFormulas, xlErrors).Clear
Application.ScreenUpdating = True
End With
End Sub
经过几天的折腾,我重写了如下代码。我没有像以前那样收到任何错误,但它需要很长时间,完成后没有列出任何数据。
Option Explicit
Sub test123()
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
Dim AVS As Range
Application.ScreenUpdating = False
Range("A" & lastRow).ClearContents
For myLoop = 1 To lastRow
On Error Resume Next
AVS = MID(ws.Range("A1:A" & myloop).Value, 1, 3)
If IsError(AVS.Value) Then
If Err.Number <> 0 Then
Err.Clear
On Error GoTo 0
End If
Else
If AVS = "AVS" Then
'If MID(ws.Range("A1:A" & lastRow).Value, 1, 3) = "AVS" Then
newValue = MID(ws.Range("A" & myLoop).Value, 48, 4)
End If
End If
ws1.Range("A" & myLoop).Value = newValue
Next
Application.ScreenUpdating = True
End Sub
我还在下面列出了我试图从 "Data" sheet 上检索的数据示例。 Sample Data
感谢大家的帮助!
感谢@ScottHoltman 和@Gaffi,我设法让我的代码循环如下:
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
它确实提出了另一个问题,我将通过另一个 post 来解决。 谢谢。