Vba 按字符计数排序,替换字符串

Vba 按字符计数排序,替换字符串,vba,excel,Vba,Excel,我有一张清单 科拉 FU01040235000 FU0366090000 FU002375000 FU010587090000 FU0368420000 FU010671340000 每天它都需要排序,实际字符串值的字符数是14个字符,因此14个字符是正确的,但12个字符的字符串需要编辑才能成为“真实” 问题是,它需要在开始时有00,在FU之后 我的思路是 如果小于12个字符,则在FU后添加00,否则如果为14个字符,则忽略单元格 如何设置宏以按字符计数过滤,如果不小于12,则替换值? 这是我的

我有一张清单

科拉
  • FU01040235000
  • FU0366090000
  • FU002375000
  • FU010587090000
  • FU0368420000
  • FU010671340000
  • 每天它都需要排序,实际字符串值的字符数是14个字符,因此14个字符是正确的,但12个字符的字符串需要编辑才能成为“真实”

    问题是,它需要在开始时有00,在FU之后

    我的思路是

    如果小于12个字符,则在FU后添加00,否则如果为14个字符,则忽略单元格

    如何设置宏以按字符计数过滤,如果不小于12,则替换值? 这是我的开始

    子字符countfilter()

    “获取数据列A的最后一行的行数
    lastrow=范围(“a65536”)。结束(xlUp)。行
    '选中第1行至最后一行#,A列
    对于i=1到最后一行
    “如果少于12个字符
    如果Len(单元格(i,1))小于12,则
    ' ...
    接下来我
    
    End Sub

    Sub FU0014字符()
    
    Sub FU0014character()
    '
    ' selectbinsertcolumn Macro
    '
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    
    ' Get rownumber of lastrow of data Col A
    lastrow = Range("a65536").End(xlUp).Row
    
    ' Check row 1 to last row #, Col A
    For i = 1 To lastrow
        ' If less than 14 chars
        If Len(Cells(i, 1)) < 14 Then
            ' Take data and apply it to right column
            Cells(i, 1) = Range(Cells(i, 1), Cells(i, 2)).FillRight
    
        End If
        ' Not less than 14 - get next row
    Next i
    
    
    Columns("B").Replace What:="FU", _
                            Replacement:="FU00", _
                            LookAt:=xlPart, _
                            SearchOrder:=xlByRows, _
                            MatchCase:=False, _
                            SearchFormat:=False, _
                            ReplaceFormat:=False
    
    For i = 1 To lastrow
        ' If longer than 12 chars
        If Len(Cells(i, 1)) > 12 Then
            ' move to right
            Cells(i, 1) = Range(Cells(i, 1), Cells(i, 2)).FillRight
    
        End If
        ' Not less than 12 - get next row
    Next i
    
    
    Columns("A:A").Select
    Selection.Delete Shift:=xlToLeft
    
    End Sub
    
    ' 'selectbinsertcolumn宏 ' 列(“B:B”)。选择 选择。插入Shift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAbove '获取数据列A的最后一行的行数 lastrow=范围(“a65536”)。结束(xlUp)。行 '选中第1行至最后一行#,A列 对于i=1到最后一行 “如果少于14个字符 如果Len(单元格(i,1))小于14,则 '获取数据并将其应用于右列 单元格(i,1)=范围(单元格(i,1),单元格(i,2))。填充右侧 如果结束 “不少于14-进入下一排 接下来我 列(“B”)。替换为:=“FU”_ 替换:=“FU00”_ 看:=xlPart_ 搜索顺序:=xlByRows_ MatchCase:=假_ SearchFormat:=False_ ReplaceFormat:=False 对于i=1到最后一行 “如果超过12个字符 如果Len(单元格(i,1))>12,则 “向右移动 单元格(i,1)=范围(单元格(i,1),单元格(i,2))。填充右侧 如果结束 “不少于12个-到达下一排 接下来我 列(“A:A”)。选择 选择。删除移位:=xlToLeft 端接头
    基本上,它是这样做的,创建一个新列(新列b),然后检查列a值字符数是否为14个字符,如果小于14,它将在新列b中向右移动

    然后用FU00替换B列FU中的每一个(12个字符)

    它再次运行列A检查,这一次查看它是否大于12,如果大于12(显然,因为它们在第一次检查时会被移动),它将在列B中将其向右移动

    然后删除空白列A.< /P> <代码>子FU1414字符() ' 'selectbinsertcolumn宏 ' 列(“B:B”)。选择 选择。插入Shift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAbove '获取数据列A的最后一行的行数 lastrow=范围(“a65536”)。结束(xlUp)。行 '选中第1行至最后一行#,A列 对于i=1到最后一行 “如果少于14个字符 如果Len(单元格(i,1))小于14,则 '获取数据并将其应用于右列 单元格(i,1)=范围(单元格(i,1),单元格(i,2))。填充右侧 如果结束 “不少于14-进入下一排 接下来我 列(“B”)。替换为:=“FU”_ 替换:=“FU00”_ 看:=xlPart_ 搜索顺序:=xlByRows_ MatchCase:=假_ SearchFormat:=False_ ReplaceFormat:=False 对于i=1到最后一行 “如果超过12个字符 如果Len(单元格(i,1))>12,则 “向右移动 单元格(i,1)=范围(单元格(i,1),单元格(i,2))。填充右侧 如果结束 “不少于12个-到达下一排 接下来我 列(“A:A”)。选择 选择。删除移位:=xlToLeft 端接头 基本上,它是这样做的,创建一个新列(新列b),然后检查列a值字符数是否为14个字符,如果小于14,它将在新列b中向右移动

    然后用FU00替换B列FU中的每一个(12个字符)

    它再次运行列A检查,这一次查看它是否大于12,如果大于12(显然,因为它们在第一次检查时会被移动),它将在列B中将其向右移动


    它删除空白列A.< /P> < P>这将更快,因为它与一个变体数组一起工作,并且只访问工作表两次:

    Sub FU0014character()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet12") 'Change to your sheet or ActiveSheet
    
    Dim rng As Range
    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(ws.Rows.Count, 1).End(xlUp))
    
    Dim arr As Variant
    arr = rng.Value
    
    Dim i As Long
    For i = 1 To UBound(arr, 1)
        arr(i, 1) = Left$(arr(i, 1), 2) & Format(Val(Mid$(arr(i, 1), 3)), "000000000000")
    Next i
    
    rng.Value = arr
    End Sub
    

    这将更快,因为它使用变量数组,并且只访问工作表两次:

    Sub FU0014character()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet12") 'Change to your sheet or ActiveSheet
    
    Dim rng As Range
    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(ws.Rows.Count, 1).End(xlUp))
    
    Dim arr As Variant
    arr = rng.Value
    
    Dim i As Long
    For i = 1 To UBound(arr, 1)
        arr(i, 1) = Left$(arr(i, 1), 2) & Format(Val(Mid$(arr(i, 1), 3)), "000000000000")
    Next i
    
    rng.Value = arr
    End Sub
    

    =Left(A1,2)和TEXT(-MID(A1,3,12),“000000000000”)
    我收到一个#值!尝试此操作时出错。您提供的值是否与您提供的值不同。目前,所有数字都位于前2个字符之后。在前两个字母后面还有字母字符吗?你下面的评论说明了我做错了什么。谢谢Scott。
    =左(A1,2)和文本(--MID(A1,3,12),“000000000000”)
    我收到一个#值!尝试此操作时出错。您提供的值是否与您提供的值不同。目前,所有数字都位于前2个字符之后。在前两个字母后面还有字母字符吗?你下面的评论说明了我做错了什么。谢谢你,斯科特。快多了,谢谢你帮我解决这个问题!在我尝试执行此操作的搜索过程中,我看到正在使用此方法,但我遇到了问题,因为它使用0更改了前导值。这似乎通过跳过前两个字符来跳过字母。速度更快,感谢您帮助我解决问题!在我尝试执行此操作的搜索过程中,我看到正在使用此方法,但我遇到了问题,因为它使用0更改了前导值。这似乎通过跳过前两个字符来跳过字母。