关于exel表格数据筛选再重新排列的问题!!高分求答案(100)

404page 2005-05-30 10:01:50
数据如下 要求按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的代码,谢谢!
...全文
1884 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
404page 2005-06-07
  • 打赏
  • 举报
回复
It run successfully, this time.
Thank you for your help !!!
DawnPine 2005-06-06
  • 打赏
  • 举报
回复
sheet的首行应该有内容
这一点我在注释里说过了,可能你没注意
我把代码优化了一下:
Option Explicit

Sub 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 Sub

Sub 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行
404page 2005-06-03
  • 打赏
  • 举报
回复
你的程序写的确实没有问题
我的运行结果如下,不知何原因?
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,而以上这些数字是在一行里面,而且重复出现
请赐教
DawnPine 2005-06-01
  • 打赏
  • 举报
回复
我昨天写给你的程序就已经搞定了,不知楼主有没试一试
如果要对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
404page 2005-05-31
  • 打赏
  • 举报
回复
不用管Fnod或者Tnod,只要求标志相同就可以了
再举例:比如标志1 --对应的Id值--〉23,333
比如标志2 --对应的Id值--〉23,45,111,852
比如标志3 --对应的Id值--〉48,111,511,257
比如标志4 --对应的Id值--〉2212,689
......
......
......
比如标志n --对应的Id值--〉

以此类推!
404page 2005-05-31
  • 打赏
  • 举报
回复
回复人: DawnPine(拂晓的松) ( ) 信誉:100

----------
首先非常谢谢你的关注

可能你还不是很明白,下面我再重新讲一下,

1. 好像excel做多支持256列吧?
2. 我的意思是:就如我给出的表中所示,如果标志相同(即,Fnod和Tnod的标志位)则在同一行列出
Id的值,当然不会超过256列。
你仔细看看就明白了,如上面的示例,比如标志位2,则含有标志2的Id值是 23,45,852
3. 然后再在新表中按顺序输出标志位和Id值

就是这样子,明白了吗?
kahou 2005-05-31
  • 打赏
  • 举报
回复
xlSheet.Range("a2:k500").sort Key1:=Range("d2"), Order1:=xlDescending
类似这样 ,自己查查msdn



kahou 2005-05-31
  • 打赏
  • 举报
回复
sort
DawnPine 2005-05-31
  • 打赏
  • 举报
回复
这个不难:
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 Sub

Sub 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行非空
404page 2005-05-31
  • 打赏
  • 举报
回复

回复人: 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
DooDu 2005-05-31
  • 打赏
  • 举报
回复
没听明白。。
DawnPine 2005-05-31
  • 打赏
  • 举报
回复
回楼主
你拿我的程序跑跑看
已经基本满足你的要求了,虽然只处理了Fnod字段
稍加修改就能完成满足你的要求了

再有一个:同一个nod号对应的ID相同时,最终结果如何处理?
如:
F T ID
1 2 9
2 3 8
2 4 9

结果为
1 9
2 9 8
3 8
4 9

2这一行上我理解不应出现 2 9 8 9
这样的东东

不知道是不是这样?上午的程序没有消除同行重复的ID,这个改起来也不难

上午给的这程序不涉及什么算法,就是遍历查找,然后写结果
楼主自己试一试
有什么问题再问好了
404page 2005-05-30
  • 打赏
  • 举报
回复
up
404page 2005-05-30
  • 打赏
  • 举报
回复
up

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧