Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 数据格式为9.9.9的排序标题行_Excel_Vba - Fatal编程技术网

Excel 数据格式为9.9.9的排序标题行

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

我编写了一个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         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