数据如下                       要求按Fnod排列成如下顺序格式
Fnod  Tnod  Id                          Fnod
1      2    23                            1      23     333
2      3    45                            2      23     45           852
2      17   98                            3      45     111          511 
3      2    111                           4      2212   689    
3      16   511                           5      89     257          2212  
4      5    2212                          6      689    852  
5      7    89            
5      3    257                            .
6      4    689                            .
6      2    852                            .
.      1    333
.      .    .
.      .    .
-----------------------
问:如何将数据按Fnod的顺序序号进行排列?即,如果出现与Fnod中的标志位 1 相同的值则将数据排列在 标志位 1 的同一行中,以此类推...
请给出vba的代码,谢谢!

解决方案 »

  1.   

    这个不难:
    Sub Main()
        Dim shtSour As Worksheet
        Dim nRows As Long
        Dim i As Long
        Dim nFnod As Long
        Dim nID As Long
        Set shtSour = Worksheets("sheet1")
        With shtSour
            nRows = .UsedRange.Rows.Count
            For i = 2 To nRows '假定第一行为标题
                nFnod = .Cells(i, 1)
                nID = .Cells(i, 3)
                MySave nFnod, nID
            Next
        End With
        Set shtSour = Nothing
    End SubSub MySave(nFnod, nID)
        Dim shtDest As Worksheet '首行非空, 为标题行
        Dim nRows As Long
        Dim i As Long
        Dim j As Long
        Set shtDest = Worksheets("sheet2")
        With shtDest
            nRows = .UsedRange.Rows.Count
            For i = 1 To nRows '查找写在哪一行
                If .Cells(i, 1) = nFnod Then Exit For
            Next
            If .Cells(i, 1) <> nFnod Then .Cells(i, 1) = nFnod
            For j = 2 To 999 '查找写在哪一列, 并假定最多999列
                If Trim(.Cells(i, j)) = "" Then Exit For
            Next
            .Cells(i, j) = nID
        End With
        Set shtDest = Nothing
    End Sub已经调试通过
    假定数据源在 sheet1 中
    结果写在 sheet2 中
    且sheet2的第1行非空
      

  2.   

    xlSheet.Range("a2:k500").sort Key1:=Range("d2"), Order1:=xlDescending
    类似这样 ,自己查查msdn
      

  3.   

    回复人: DawnPine(拂晓的松) ( ) 信誉:100 ----------
    首先非常谢谢你的关注可能你还不是很明白,下面我再重新讲一下,1. 好像excel做多支持256列吧?
    2. 我的意思是:就如我给出的表中所示,如果标志相同(即,Fnod和Tnod的标志位)则在同一行列出
       Id的值,当然不会超过256列。
       你仔细看看就明白了,如上面的示例,比如标志位2,则含有标志2的Id值是 23,45,852
    3. 然后再在新表中按顺序输出标志位和Id值就是这样子,明白了吗?
      

  4.   

    不用管Fnod或者Tnod,只要求标志相同就可以了
    再举例:比如标志1 --对应的Id值--〉23,333
            比如标志2 --对应的Id值--〉23,45,111,852
            比如标志3 --对应的Id值--〉48,111,511,257
            比如标志4 --对应的Id值--〉2212,689
            ......
            ......
            ......
            比如标志n --对应的Id值--〉
            
            以此类推!
      

  5.   

    回楼主
    你拿我的程序跑跑看
    已经基本满足你的要求了,虽然只处理了Fnod字段
    稍加修改就能完成满足你的要求了再有一个:同一个nod号对应的ID相同时,最终结果如何处理?
    如:
    F T ID
    1 2 9
    2 3 8
    2 4 9结果为
    1 9
    2 9 8
    3 8
    4 92这一行上我理解不应出现 2 9 8 9
    这样的东东不知道是不是这样?上午的程序没有消除同行重复的ID,这个改起来也不难上午给的这程序不涉及什么算法,就是遍历查找,然后写结果
    楼主自己试一试
    有什么问题再问好了
      

  6.   


    回复人: DawnPine(拂晓的松) ( ) 信 再有一个:同一个nod号对应的ID相同时,最终结果如何处理?
    如:
    F T ID
    1 2 9
    2 3 8
    2 4 9结果为
    1 9
    2 9 8
    3 8
    4 9
    ----------------------------我知道,你已经理解我的意思了
    我的目的就是要求结果为
    1   9
    2   9 8 8 9
    3   8
    4   9
      

  7.   

    我昨天写给你的程序就已经搞定了,不知楼主有没试一试
    如果要对Tnod做处理,只需在main()里的MySave那行之后再加2行:
                nTnod = .Cells(i, 2)
                MySave nTnod, nID
    就行了,当然,nTnod最好先用Dim定义一下
    我在增加了这两行之后,用你给的数据跑了一次,结果如下:nod
    1 23
    2 23 45 98 111 852
    3 45 111 511 257
    17 98
    16 511
    4 2212 689
    5 2212 89 257
    7 89
    6 689 852
      

  8.   

    你的程序写的确实没有问题
    我的运行结果如下,不知何原因?
    1 23 23 45 45 98 98 111 111 511 511 2212 2212 89 89 68 68 365 365 235 235 963 963
    请看,nod只有标志1,而以上这些数字是在一行里面,而且重复出现
    请赐教
      

  9.   

    sheet的首行应该有内容
    这一点我在注释里说过了,可能你没注意
    我把代码优化了一下:
    Option ExplicitSub Main()
        Dim nRows As Long
        Dim i As Long
        Dim nNod As Long
        Dim nID As Long
        Worksheets("sheet2").Rows.Delete
        With Worksheets("sheet1")
            nRows = .UsedRange.Rows.Count
            For i = 2 To nRows '假定第一行为标题
                nNod = .Cells(i, 1)
                nID = .Cells(i, 3)
                MySave nNod, nID
                nNod = .Cells(i, 2)
                MySave nNod, nID
            Next
        End With
    End SubSub MySave(nNod As Long, nID As Long)
        Dim nRows As Long
        Dim i As Long
        Dim j As Long
        With Worksheets("sheet2")
            If Trim(.Cells(1, 1)) = "" Then .Cells(1, 1) = "Nod"
            nRows = .UsedRange.Rows.Count
            For i = 2 To nRows  '查找写在哪一行
                If .Cells(i, 1) = nNod Then Exit For
            Next
            If .Cells(i, 1) <> nNod Then .Cells(i, 1) = nNod
            For j = 2 To 256    '查找写在哪一列
                If Trim(.Cells(i, j)) = "" Then Exit For
            Next
            .Cells(i, j) = nID
            .Rows(i).Sort Key1:=.Cells(i, 1), Header:=xlYes, Orientation:=xlSortRows '按行排序
            .UsedRange.Sort Key1:=.Cells(2, 1), Header:=xlYes, Orientation:=xlSortColumns
        End With
    End Sub最后加了排序功能, 一个是按行排序,另一个是同一行内的数据排序
    如果你不需要可以不要这2行
      

  10.   

    It run successfully, this time.
    Thank you for your help !!!