VBA - 使用 .Find 方法进行故障排除
VBA - troubleshooting with .Find method
我正在使用 .Find 方法查找包含部分值 "TL" 和 "CT" 的行中的单元格。代码当前所做的是查看 C 列的每一行,修剪 "TL-" 的任何变化(即 "TL- "、"TL - "、"TL -"),然后限制其后的数字只有6个数字。例子:如果有5个数,就在"TL-"后面加一个0,如果有4个数,就在"TL-"后面加2个0,以此类推
我在单元格中有其他值,所以它现在所做的是更改所有值以执行上述方法(如下所示)
Start: Output:
TL-000872 -> TL-000872
TL-0786 -> TL-000786
CT-74 -> TL-000074
GS8; 278K -> TL-008278
我需要它做什么 是有效的代码,但仅适用于包含一些 "TL" 值的单元格,执行相同的代码但只有 4 个数字在包含一些 "CT" 值的单元格上,跳过(保持原样)任何其他内容。
Start: Output:
TL-000872 -> TL-000872
TL-0786 -> TL-000786
CT-74 -> CT-0074
GS8; 278K -> GS8; 278K
我的 .Find 方法肯定不起作用。我认为这是主要问题;它没有正确找到带有 "TL" 和 "CT" 的单元格。有什么建议吗?
注意:StartSht 是包含代码的工作簿,其中存在所有要更改的值。
Dim str As String, ret As String, tmp As String, j As Integer, k As Integer
If Not StartSht.Range("C2").End(xlDown).Find(What:="TL", LookAt:=xlPart, LookIn:=xlValues) Is Nothing Then
For k = 2 To StartSht.Range("C2").End(xlDown).Row
ret = ""
str = StartSht.Range("C" & k).Value
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 6
ret = "0" & ret
Next
ret = "TL-" & ret
StartSht.Range("C" & k).Value = ret
Next k
ElseIf Not StartSht.Range("C2").End(xlDown).Find(What:="CT", LookAt:=xlPart, LookIn:=xlValues) Is Nothing Then
For k = 2 To StartSht.Range("C2").End(xlDown).Row
ret = ""
str = StartSht.Range("C" & k).Value
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 4
ret = "0" & ret
Next
ret = "CT-" & ret
StartSht.Range("C" & k).Value = ret
Next k
Else
End If
编辑:
当前代码采用 "TL-" 后少于 6 个数字的 TL,并在 "TL-" 后立即添加一个 0,直到长度为 6。 (即TL-0098 -> TL-000098,加了两个0)。如果 TL 的数字超过 6 个,我还需要它来捕捉并删除紧跟在 "TL-" 之后的零,直到长度为 6
更简单的代码可能是简单地删除“-”后面的任何数字,直到长度为六。
示例:
TL-0009999 -> delete one 0 -> TL-009999
TL-0948398 -> delete one 0 -> TL-948398
TL-00000008 -> delete two 0s -> TL-000008
用下面的代码替换上面的代码。
更新代码:
Dim str As String, ret As String, tmp As String, j As Integer, k As Integer
For k = 2 To Sheets("Test").Range("C2").End(xlDown).Row
ret = ""
str = Sheets("Test").Range("C" & k).Value
If InStr(str, "TL") > 0 Then
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then
ret = ret + tmp
ElseIf j > 5 And tmp = "T" Then
Exit For
End If
Next j
For j = Len(ret) + 1 To 6
ret = "0" & ret
Next j
If Len(ret) > 6 Then
Debug.Print Len(ret)
For j = Len(ret) To 7 Step -1
If Mid(ret, 1, 1) = "0" Then
ret = Right(ret, j - 1)
End If
Next j
End If
ret = "TL-" & ret
Sheets("Test").Range("C" & k).Value = ret
ElseIf InStr(str, "CT") Then
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 4
ret = "0" & ret
Next
ret = "CT-" & ret
Sheets("Test").Range("C" & k).Value = ret
End If
Next k
我正在使用 .Find 方法查找包含部分值 "TL" 和 "CT" 的行中的单元格。代码当前所做的是查看 C 列的每一行,修剪 "TL-" 的任何变化(即 "TL- "、"TL - "、"TL -"),然后限制其后的数字只有6个数字。例子:如果有5个数,就在"TL-"后面加一个0,如果有4个数,就在"TL-"后面加2个0,以此类推
我在单元格中有其他值,所以它现在所做的是更改所有值以执行上述方法(如下所示)
Start: Output:
TL-000872 -> TL-000872
TL-0786 -> TL-000786
CT-74 -> TL-000074
GS8; 278K -> TL-008278
我需要它做什么 是有效的代码,但仅适用于包含一些 "TL" 值的单元格,执行相同的代码但只有 4 个数字在包含一些 "CT" 值的单元格上,跳过(保持原样)任何其他内容。
Start: Output:
TL-000872 -> TL-000872
TL-0786 -> TL-000786
CT-74 -> CT-0074
GS8; 278K -> GS8; 278K
我的 .Find 方法肯定不起作用。我认为这是主要问题;它没有正确找到带有 "TL" 和 "CT" 的单元格。有什么建议吗?
注意:StartSht 是包含代码的工作簿,其中存在所有要更改的值。
Dim str As String, ret As String, tmp As String, j As Integer, k As Integer
If Not StartSht.Range("C2").End(xlDown).Find(What:="TL", LookAt:=xlPart, LookIn:=xlValues) Is Nothing Then
For k = 2 To StartSht.Range("C2").End(xlDown).Row
ret = ""
str = StartSht.Range("C" & k).Value
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 6
ret = "0" & ret
Next
ret = "TL-" & ret
StartSht.Range("C" & k).Value = ret
Next k
ElseIf Not StartSht.Range("C2").End(xlDown).Find(What:="CT", LookAt:=xlPart, LookIn:=xlValues) Is Nothing Then
For k = 2 To StartSht.Range("C2").End(xlDown).Row
ret = ""
str = StartSht.Range("C" & k).Value
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 4
ret = "0" & ret
Next
ret = "CT-" & ret
StartSht.Range("C" & k).Value = ret
Next k
Else
End If
编辑:
当前代码采用 "TL-" 后少于 6 个数字的 TL,并在 "TL-" 后立即添加一个 0,直到长度为 6。 (即TL-0098 -> TL-000098,加了两个0)。如果 TL 的数字超过 6 个,我还需要它来捕捉并删除紧跟在 "TL-" 之后的零,直到长度为 6 更简单的代码可能是简单地删除“-”后面的任何数字,直到长度为六。
示例:
TL-0009999 -> delete one 0 -> TL-009999
TL-0948398 -> delete one 0 -> TL-948398
TL-00000008 -> delete two 0s -> TL-000008
用下面的代码替换上面的代码。
更新代码:
Dim str As String, ret As String, tmp As String, j As Integer, k As Integer
For k = 2 To Sheets("Test").Range("C2").End(xlDown).Row
ret = ""
str = Sheets("Test").Range("C" & k).Value
If InStr(str, "TL") > 0 Then
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then
ret = ret + tmp
ElseIf j > 5 And tmp = "T" Then
Exit For
End If
Next j
For j = Len(ret) + 1 To 6
ret = "0" & ret
Next j
If Len(ret) > 6 Then
Debug.Print Len(ret)
For j = Len(ret) To 7 Step -1
If Mid(ret, 1, 1) = "0" Then
ret = Right(ret, j - 1)
End If
Next j
End If
ret = "TL-" & ret
Sheets("Test").Range("C" & k).Value = ret
ElseIf InStr(str, "CT") Then
For j = 1 To Len(str)
tmp = Mid(str, j, 1)
If IsNumeric(tmp) Then ret = ret + tmp
Next j
For j = Len(ret) + 1 To 4
ret = "0" & ret
Next
ret = "CT-" & ret
Sheets("Test").Range("C" & k).Value = ret
End If
Next k