在程序启动时,列A:A
包含:
123456789123456-BC123456
321654987654321-AD741258
369852147258961-FG369852
AS426953-153953751153369
DF714258-957456351456321
VB153965-233654963147456
我想将KK000000
- 类型数据移至列B:B
。移动后,列A:A
将包含:
123456789123456
321654987654321
369852147258961
153953751153369
957456351456321
233654963147456
列B:B
将包含:
BC123456
AD741258
FG369852
AS426953
DF714258
VB153965
我如何做到这一点?
答案 0 :(得分:1)
如果您的数据与帖子中的内容完全相同,则可以使用此子目录。
Sub Extracts()
Dim tmpVal, leftPart, rightPart As String
For Each cel In Range("A1:A6")
tmpVal = Application.WorksheetFunction.Substitute(cel, "-", "")
leftPart = Left(tmpVal, 15)
rightPart = Right(tmpVal, 8)
cel.NumberFormat = "@"
cel.Value2 = leftPart
cel.Offset(0, 1).NumberFormat = "@"
cel.Offset(0, 1).Value2 = rightPart
Next
End Sub
如果数据的长度不同,则需要编辑数据代码。
答案 1 :(得分:0)
对于公式解决方案:
B1: =IF(ISNUMBER(--LEFT(A1,FIND("-",A1)-1)),LEFT(A1,FIND("-",A1)-1),MID(A1,FIND("-",A1)+1,99))
C1: =IF(ISNUMBER(--LEFT(A1,FIND("-",A1)-1)),MID(A1,FIND("-",A1)+1,99),LEFT(A1,FIND("-",A1)-1))
对于VBA解决方案,对于大量数据可能会更快(请阅读代码中的注释以获取重要信息:
Option Explicit
Sub SplitAndOrder()
'Declare variables
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
Dim vSrc As Variant, vRes() As Variant
Dim I As Long
Dim V As Variant
'Set worksheets and ranges for data Source and Results
'To overwrite original, set wsRes and rRes appropriately
Set wsSrc = Worksheets("Sheet1")
Set wsRes = Worksheets("Sheet1")
Set rRes = Cells(1, 3)
'Get source data into variant array for speed of processing
With wsSrc
vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
'Dimension results array
ReDim vRes(1 To UBound(vSrc, 1), 1 To 2)
'Process the array
For I = 1 To UBound(vSrc, 1)
V = Split(vSrc(I, 1), "-")
If IsNumeric(V(0)) Then
vRes(I, 1) = (V(0))
vRes(I, 2) = V(1)
Else
vRes(I, 1) = V(1)
vRes(I, 2) = V(0)
End If
Next I
'Write results
Set rRes = rRes.Resize(UBound(vRes, 1), UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.NumberFormat = "@"
.Value = vRes
.EntireColumn.AutoFit
End With
End Sub
答案 2 :(得分:0)
B1=CHOOSE(FIND("-",A1),,,,,,,,,RIGHT(A1,15),,,,,,,LEFT(A1,15))
C1=CHOOSE(FIND("-",A1),,,,,,,,,LEFT(A1,8),,,,,,,RIGHT(A1,8))
如果A列中的数据与问题不同,则B1和C1变为0
。
答案 3 :(得分:0)
我在正则表达式(RegEx)的帮助下看到了很好的解决方案。我找到了两个很好的资源,在那里你可以找到一些关于RegEx的有用信息:
要使用它们,首先需要在Microsoft VBScript Regular Expressions 5.5
上安装引用。转到VBE (Alt + F11) > Tools > References...
并从列表中选择。
然后添加新模块并粘贴此代码:
Function RegexExtract(text As String, Pattern As String) As String
RegexExtract = "Not Found"
Dim regEx As New RegExp
Dim t As String
regEx.Pattern = Pattern
If regEx.test(text) Then
t = regEx.Replace(text, "")
RegexExtract = Replace(text, t, "")
End If
End Function
那就是它!现在,您可以直接在Excel工作表中使用自定义公式RegexExtract
。只需将此公式粘贴到单元格中:
=RegexExtract("123456789123456-BC123456", "\d{15}")
这意味着从字符串中提取任何15位数字。当然,您也可以将单元格引用粘贴到公式中:=RegexExtract(F1;$I$1)
。
<强>结论强>
因此,这种方法可以用于许多不同的目的。无需制作特殊任务宏,或发明庞大的公式。正则表达式可以处理许多不同的情况。