Excel 数据格式为9.9.9的排序标题行
我编写了一个VBA代码,将我办公室相关资料的特定数字插入另一张Excel表格,将它们放在一起,并计算与成本相关的资料 现在我想把我的“办公室号码”从左到右排列成一行,看起来像“1.2.30”、“1.1.1130”或“1.3.150”。要排序,我必须更改它们,问题是如何做到这一点 此外,在列中还有其他我想与标题行中的“办公室号码”切换的号码 范例 对此进行排序:Excel 数据格式为9.9.9的排序标题行,excel,vba,Excel,Vba,我编写了一个VBA代码,将我办公室相关资料的特定数字插入另一张Excel表格,将它们放在一起,并计算与成本相关的资料 现在我想把我的“办公室号码”从左到右排列成一行,看起来像“1.2.30”、“1.1.1130”或“1.3.150”。要排序,我必须更改它们,问题是如何做到这一点 此外,在列中还有其他我想与标题行中的“办公室号码”切换的号码 范例 对此进行排序: 1.2.30 1.1.1130 1.3.150 1 4 7 2 5
1.2.30 1.1.1130 1.3.150
1 4 7
2 5 8
3 6 9
为此:
1.1.1130 1.2.30 1.3.150
4 1 7
5 2 8
6 3 9
Excel会这样排序:1.2.30、1.3.150、1.1.1130
我必须找到一种方法将这些数字转换为普通数字(我已经排除了那些“.”),并在最后一点后将它们保存为字符串,添加尽可能多的“0”,这样我就可以用5个数字来标准化数字了
所以我所有的办公室号码在最后一点之后都是这样的:1.2.30=(1.2.)00030,1.3.150=(1.3.)150=00150和1.1.1130=(1.1.)01130
到目前为止我尝试过的排序代码:
Sub Table1Sort()
Range("B39:Q39").Select
Selection.ClearContents
Range("B44:Q44").Select
Selection.ClearContents
Range("B9:Q28").Select
ActiveWorkbook.Worksheets("Table1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Table1").Sort.SortFields.Add2 Key:=Range( _
"B10:Q10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Table1").Sort
.SetRange Range("B9:Q28")
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
Dim rng As Range
For Each rng In Range("B9:Q9")
rng = rng
Next
End Sub
是否将数字保存为字符串并添加零?或者我的逻辑全错了?下面是建议的解决方案
Sub Table1Sort()
Dim i As Long
Dim rg As Range, cl As Range
Dim parts As Variant
Dim fmt As String, id As String
fmt = String(4, "0") 'in this case 4 seems to be the max lenght of number parts, adjust as needed
Set rg = Range("A1:C5") 'your range to get sorted - adjust to the correct address
For Each cl In rg.Rows(1).Cells 'Transform numbers into a sort string, unless blank
If cl <> "" Then
id = ""
parts = Split(cl.Text, ".") 'Split into parts by numbers, pad with leading zeroes and concatenate with a separator
For i = 0 To UBound(parts)
id = id & "-" & Format(CInt(parts(i)), fmt)
Next i
id = Mid(id, 2) 'Remove leading separator
cl.Value = id 'Put into cell
End If
Next cl
ActiveWorkbook.Worksheets("Table1").Sort.SortFields.Clear 'Do the sorting
ActiveWorkbook.Worksheets("Table1").Sort.SortFields.Add2 Key:=rg.Rows(1) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Table1").Sort
.SetRange rg
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
For Each cl In rg.Rows(1).Cells 'Transform sort strings back to original
If cl <> "" Then
id = ""
parts = Split(cl.Text, "-")
For i = 0 To UBound(parts)
id = id & "." & CInt(parts(i))
Next i
id = Mid(id, 2)
cl.Value = id
End If
Next cl
End Sub
子表1排序()
我想我会坚持多久
变暗rg As范围,cl As范围
变暗零件作为变型
Dim fmt作为字符串,id作为字符串
fmt=字符串(4,“0”)’在这种情况下,4似乎是零件数量的最大长度,根据需要进行调整
设置rg=Range(“A1:C5”)“您要排序的范围-调整到正确的地址
对于rg.行(1)中的每个cl,单元格将数字转换为排序字符串,除非为空
如果cl“”那么
id=“”
parts=拆分(cl.Text,“.”按数字拆分为多个部分,用前导零填充,并用分隔符连接
对于i=0至UBound(零件)
id=id&“-”和格式(CInt(第(i)部分),fmt)
接下来我
id=Mid(id,2)'拆下前导分离器
cl.值=放入单元格的id
如果结束
下一个cl
ActiveWorkbook.Worksheets(“表1”).Sort.SortFields.Clear'执行排序
ActiveWorkbook.Worksheets(“表1”).Sort.SortFields.Add2键:=rg.Rows(1)_
,SortOn:=xlSortOnValues,顺序:=xlAscending,数据选项:=xlSortNormal
使用ActiveWorkbook.Worksheets(“表1”).Sort
.SetRange rg
.Header=xlGuess
.MatchCase=False
.Orientation=xlLeftToRight
.SortMethod=xl拼音
.申请
以
对于rg.Rows(1)中的每个cl,单元格的转换将字符串排序回原始值
如果cl“”那么
id=“”
部分=拆分(第1条文本“-”)
对于i=0至UBound(零件)
id=id&“&”和CInt(第(i)部分)
接下来我
id=Mid(id,2)
cl.值=id
如果结束
下一个cl
端接头
您也可以考虑将目标范围作为参数。
< P>这里我提出的是:Option Explicit
Sub Table1Sort()
Dim i As Integer
Dim iRows As Integer
Dim iLen As Integer
Dim Arr() As Variant
ActiveSheet.Range("d3:e5").Select 'I randomly entered the values to be sorted in a column here.
iRows = Selection.Rows.Count 'Figure out how many items I'm dealing with.
Arr = Range("d3:e5").Value2 'Write them to an array. I include the column next to the data as a placeholder.
For i = 1 To iRows 'Strip periods and fill/overwrite 2nd column of array
Arr(i, 2) = Replace(Arr(i, 1), ".", "")
If Len(Arr(i, 2)) > iLen Then iLen = Len(Arr(i, 2))
Next i
For i = 1 To iRows 'Pad with trailing zeros
Do While Len(Arr(i, 2)) < iLen
Arr(i, 2) = Arr(i, 2) & "0"
Loop
Next i
QuickSortArray Arr, , , 2 'Call the sort found here: https://stackoverflow.com/a/5104206/12000364
For i = 1 To iRows 'Write the results out across columns. I randomly start at column F.
Cells(1, 5 + i) = Arr(i, 1)
Next i
End Sub
选项显式
分表1排序()
作为整数的Dim i
Dim iRows作为整数
作为整数的Dim-iLen
Dim Arr()作为变量
ActiveSheet.Range(“d3:e5”)。选择“我在此处的列中随机输入要排序的值”。
iRows=Selection.Rows.Count'计算出我处理的项目数。
Arr=范围(“d3:e5”)。值2'将它们写入数组。我将数据旁边的列作为占位符。
对于i=1到iRows的剥离周期,填充/覆盖数组的第二列
Arr(i,2)=替换(Arr(i,1),“,”)
如果Len(Arr(i,2))>iLen,则iLen=Len(Arr(i,2))
接下来我
对于i=1至带尾随零的iRows焊盘
当Len(Arr(i,2))
正如我在代码注释中提到的,我使用了这里找到的多维数组排序,并在第二维上排序。这是我在@Dschuli和@Miles Fett的帮助下完成的代码 现在它可以正常工作了:)
子表1排序()
我想我会坚持多久
变暗rg As范围,cl As范围
变暗零件作为变型
Dim fmt作为字符串,id作为字符串
fmt=字符串(5,“0”)
设置rg=Tabelle1.范围(“B9:Q28”)
对于rg.行(1)单元格中的每个cl
如果cl“”那么
id=“”
部分=拆分(第1条文本“.”)
对于i=0至UBound(零件)
id=id&“-”和格式(CInt(第(i)部分),fmt)
接下来我
id=Mid(id,2)
cl.值=id
如果结束
下一个cl
表1.Sort.SortFields.Clear
Tabelle1.Sort.SortFields.Add Key:=rg.Rows(1)_
,SortOn:=xlSortOnValues,顺序:=xlAscending,数据选项:=xlSortNormal
带Tabelle1.排序
.SetRange rg
.Header=xlGuess
.MatchCase=False
.Orientation=xlLeftToRight
.SortMethod=xl拼音
.申请
以
表1.范围(“B39:Q39”).ClearContents
表1.范围(“B44:Q44”).ClearContents
对于rg.行(1)单元格中的每个cl
如果cl“”那么
id=“”
部分=拆分(第1条文本“-”)
对于i=0至UBound(零件)
id=id&“&”和CInt(第(i)部分)
接下来我
id=Mid(id,2)
cl.价值=
Sub Table1Sort()
Dim i As Long
Dim rg As Range, cl As Range
Dim parts As Variant
Dim fmt As String, id As String
fmt = String(5, "0")
Set rg = Tabelle1.Range("B9:Q28")
For Each cl In rg.Rows(1).Cells
If cl <> "" Then
id = ""
parts = Split(cl.Text, ".")
For i = 0 To UBound(parts)
id = id & "-" & Format(CInt(parts(i)), fmt)
Next i
id = Mid(id, 2)
cl.Value = id
End If
Next cl
Tabelle1.Sort.SortFields.Clear
Tabelle1.Sort.SortFields.Add Key:=rg.Rows(1) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With Tabelle1.Sort
.SetRange rg
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
Tabelle1.Range("B39:Q39").ClearContents
Tabelle1.Range("B44:Q44").ClearContents
For Each cl In rg.Rows(1).Cells
If cl <> "" Then
id = ""
parts = Split(cl.Text, "-")
For i = 0 To UBound(parts)
id = id & "." & CInt(parts(i))
Next i
id = Mid(id, 2)
cl.Value = id
End If
Next cl
End Sub