我有一个包含其中包含参数的行的列。例如
W2 = [PROD] [FO] [2.0] [客户]
W3 = [PROD] [GD] [1.0] [P3]
W4 =客户生产中的问题
我有一个将其他列复制到另一个工作表的函数,但对于此列,我需要执行以下操作
有谁知道我怎么做到这一点?或者,可能更容易复制列,然后删除不符合上述条件的所有内容。
答案 0 :(得分:1)
我在这里编辑使用正则表达式而不是循环。这可能是实现目标的最有效方法。请参阅下文,如果适合您,请告知我们:
Function MatchWithRegex(sInput As String) As String
Dim oReg As Object
Dim sOutput As String
Set oReg = CreateObject("VBScript.RegExp")
With oReg
.Pattern = "[[](P[1-5])[]]"
End With
If oReg.test(sInput) Then
sOutput = oReg.Execute(sInput)(0).Submatches(0)
Else
sOutput = ""
End If
MatchWithRegex = sOutput
End Function
Sub test2()
Dim a As String
a = MatchWithRegex(Range("A1").Value)
If a = vbNullString Then
MsgBox "None"
Else
MsgBox MatchWithRegex(Range("A1").Value)
End If
End Sub
我的解决方案如下。我写了一个函数,首先测试字符串中是否存在Pattern,然后如果它存在,我会根据括号拆分它,并选择与模式匹配的括号。如果这对您有用,请告诉我。
Function ExtractPNumber(sInput As String) As String
Dim aValues
Dim sOutput As String
sOutput = ""
If sInput Like "*[[]P[1-5][]]*" Then
aValues = Split(sInput, "[")
For Each aVal In aValues
If aVal Like "P[1-5][]]*" Then
sOutput = aVal
End If
Next aVal
End If
ExtractPNumber = Left(sOutput, 2)
End Function
Sub TestFunction()
Dim sPValue As String
sPValue = ExtractPNumber(Range("A2").Value)
If sPValue = vbNullString Then
'Do nothing or input whatever business logic you want
Else
Sheet2.Range("A1").Value = sPValue
End If
End Sub
在VBA中,您可以使用带图案的Like
运算符表示打开括号,字母P,1-5中的任意数字,然后使用以下语法使用封闭式括号:
Range("A1").Value LIke "*[[]P[1-5][]]*"
答案 1 :(得分:-1)
编辑:修复了错误的解决方案
如果您对空白没问题并且不在乎*> 5,我会这样做并复制第4列:
=IF(ISNUMBER(SEARCH("[P?]",FirstSheet!$W2)), FirstSheet!$W2, "")
需要注意的重要事项:
然后,您可以突出显示该列并根据需要删除空白。或者,您可以使用占位符字符串替换空白。
如果*必须为1-5,请分别使用两列E和D:
=MID(FirstSheet!$W2,SEARCH("[P",FirstSheet!$W2)+2,1)
=IF(AND(ISNUMBER($E2),$E2>0,$E2<=5,MID($W2,SEARCH("[P",FirstSheet!$W2)+3,1))), FirstSheet!$W2, "")
其中FirstSheet是初始工作表的名称。