将部分数据从一个列移动到另一个Excel中的列

时间:2016-03-07 01:16:42

标签: excel excel-vba excel-formula vba

在程序启动时,列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  

我如何做到这一点?

4 个答案:

答案 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的有用信息:

  1. Stackoverflow
  2. 的相关问题
  3. Microsoft关于Regular Expression Language
  4. 的文章

    要使用它们,首先需要在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)

    <强>结论

    因此,这种方法可以用于许多不同的目的。无需制作特殊任务宏,或发明庞大的公式。正则表达式可以处理许多不同的情况。