vba如何冒泡排序两个标准

时间:2017-03-13 10:06:21

标签: arrays vba sorting bubble-sort

我有一个这样的txt数组:

  • "独特文字| 05 || 001 |"
  • "独特文字| 04 || 001 |"
  • "独特文字| 05 || 002 |"
  • "独特文字| 04 || 002 |"
  • "独特文字| 05 || 003 |"
  • "独特文字| 08 || 003 |"
  • "独特文字| 04 || 003 |"
  • "独特文字| 05 || 004 |"

我已设法使用冒泡排序对此数组进行排序,选择第二组数字" 001,001,002,002,003 ...."但我也想用第一组数字排序。结果如下:

  • "独特文字| 04 || 001 |"
  • "独特文字| 05 || 001 |"
  • "独特文字| 04 || 002 |"
  • "独特文字| 05 || 002 |"
  • "独特文字| 04 || 003 |"
  • "独特文字| 05 || 003 |"
  • "独特文字| 08 || 003 |"
  • "独特文字| 05 || 004 |"

我知道如何构建冒泡排序吗? 我需要在我的常规冒泡排序中使用新的For循环吗?

当前代码(这将仅基于第二组数字排序)。 104 =最后一组数字的位置

    For i = 1 To UbndCellDataExcel - 1
      For j = i + 1 To UbndCellDataExcel
        If Mid(CellDataExcel(i), 104, 3) > Mid(CellDataExcel(j), 104, 3) Then   
            strTemp = CellDataExcel(i)
            CellDataExcel(i) = CellDataExcel(j)
            CellDataExcel(j) = strTemp
        End If
      Next j
    Next i

2 个答案:

答案 0 :(得分:0)

解决方案的关键是比较功能:

有两种主要方法可以做到这一点: 第一个也是最简单的是 - 创建一个新数字并按其排序

convert "Unique text |05||001|" to "00105"
convert "Unique text |04||002|" to "00204"
00204>00105 so "Unique text |04||002|" > "Unique text |05||001|"

更正确,更复杂的事情就是简单地进行2次比较:

Function compare (ByVal i As String,ByVal j As String)
    i1=getParam(1,i)
    i2=getParam(2,i)
    j1=getParam(1,j)
    j1=getParam(2,j)
    if (i1>j1) return 1
    if (i2<j2) return -1
    if (j1>j1) return 1
    if (j2<j2) return -1
    return 0

其中getParam是&#34;独特文本| 04 || 002 |&#34;并返回&#34; 04&#34;或&#34; 002&#34;。

答案 1 :(得分:0)

谢谢מתןל!这就是我现在根据您的转换想法实现的:

convert "Unique text |05||001|" to "00105"
convert "Unique text |04||002|" to "00204"

我的代码现在看起来像这样(100 =第一组数字的位置,104是第二组数字):

    For i = 1 To UbndCellDataExcel - 1
    For j = i + 1 To UbndCellDataExcel
        If Mid(CellDataExcel(i), 104, 3) & Mid(CellDataExcel(i), 100, 2) > Mid(CellDataExcel(j), 104, 3) & Mid(CellDataExcel(j), 100, 2) Then   'Sorter basert på OUnr
            strTemp = CellDataExcel(i)
            CellDataExcel(i) = CellDataExcel(j)
            CellDataExcel(j) = strTemp
        End If
    Next j
Next i


'Mid(CellDataExcel(i), 104, 3) & Mid(CellDataExcel(i), 100, 2) returns Format: "00105"