Vba 按字符计数排序,替换字符串
我有一张清单 科拉Vba 按字符计数排序,替换字符串,vba,excel,Vba,Excel,我有一张清单 科拉 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更改了前导值。这似乎通过跳过前两个字符来跳过字母。