ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6547|回复: 13

如果进行文本数字排名与排序,我的宏错在哪?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-12-22 11:19 | 显示全部楼层 |阅读模式
因工作需要,对A列很长的一段数字进行排序,并把排序的结果显示在B列中,我编了一个宏进行排序,并把排序的结果放在C列,但得到的结果是“数值”型,不符合要求,请各位朋友指出错在哪里,好吗? 在Long_III哥哥的帮助下,已经解决了文本数字的排序问题了,但是,还有一个问题,想编写一个函数,遍历所选的区域(在该附件中也就是A2:A19)进行文本比较,然后找出与该单元格对应的值(也即是文本)所处的名次(有大到小排序),返回到B列的单元格中(即在B2:B19)。那位高手能帮忙解决? 下面的附件是已经更新过的附件: tdIm0TVs.rar (7.75 KB, 下载次数: 24)
[此贴子已经被作者于2005-12-22 12:47:06编辑过]

1RCm4lL3.rar

7.47 KB, 下载次数: 27

如果进行文本数字排名与排序,我的宏错在哪?

TA的精华主题

TA的得分主题

发表于 2005-12-22 11:22 | 显示全部楼层

Sheet1.Cells(I + 1, 3) = "'" & B(I)

或者是先设置单元格格式为文本。

你的基础很好啊,比我刚开始好多了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 11:24 | 显示全部楼层
以下是引用[I]Long_III[/I]在2005-12-22 11:22:03的发言:[BR]

Sheet1.Cells(I + 1, 3) = "'" & B(I)

或者是先设置单元格格式为文本。

你的基础很好啊,比我刚开始好多了!

谢谢龙兄!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 11:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以下是引用[I]Long_III[/I]在2005-12-22 11:22:03的发言:[BR]

Sheet1.Cells(I + 1, 3) = "'" & B(I)

或者是先设置单元格格式为文本。

你的基础很好啊,比我刚开始好多了!

我改完后运行,最后两个的排序不对,不知是哪里出错?

TA的精华主题

TA的得分主题

发表于 2005-12-22 11:32 | 显示全部楼层

没仔细看,原来你写的不大对,帮你改了

Sub RankSt()
Dim i As Integer, j As Integer
Dim B(1 To 18) As String
Dim TEMP As String

For i = 1 To 18
B(i) = Sheet1.Cells(i + 1, 1)
Next
For i = 1 To 17
For j = i + 1 To 18
If B(i) < B(j) Then
TEMP = B(j)
B(j) = B(i)
B(i) = TEMP
End If
Next j
Next i
For i = 1 To 18
Sheet1.Cells(i + 1, 3) = "'" & B(i)
Next i
End Sub

其实还可以提速的

TA的精华主题

TA的得分主题

发表于 2005-12-22 11:35 | 显示全部楼层

Sub RankSt()
Dim i As Integer, j As Integer
Dim B(1 To 18) As String
Dim TEMP As String

Application.ScreenUpdating = False '关闭屏幕更新,加快代码运行
For i = 1 To 18
B(i) = Sheet1.Cells(i + 1, 1)
Next
For i = 1 To 17
For j = i + 1 To 18
If B(i) < B(j) Then
TEMP = B(j)
B(j) = B(i)
B(i) = TEMP
End If
Next j
Next i
'For i = 1 To 18
' Sheet1.Cells(i + 1, 3) = "'" & B(i)
'Next i
Sheet1.Range("c2:c19").NumberFormatLocal = "@" '设置单元格为文本格式
Sheet1.Range("c2:c19") = Application.WorksheetFunction.Transpose(B) '把行数组转换成列数组,一次赋值
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 12:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以下是引用[I]Long_III[/I]在2005-12-22 11:35:11的发言:[BR]

Sub RankSt()
Dim i As Integer, j As Integer
Dim B(1 To 18) As String
Dim TEMP As String

Application.ScreenUpdating = False '关闭屏幕更新,加快代码运行
For i = 1 To 18
B(i) = Sheet1.Cells(i + 1, 1)
Next
For i = 1 To 17
For j = i + 1 To 18
If B(i) < B(j) Then
TEMP = B(j)
B(j) = B(i)
B(i) = TEMP
End If
Next j
Next i
'For i = 1 To 18
' Sheet1.Cells(i + 1, 3) = "'" & B(i)
'Next i
Sheet1.Range("c2:c19").NumberFormatLocal = "@" '设置单元格为文本格式
Sheet1.Range("c2:c19") = Application.WorksheetFunction.Transpose(B) '把行数组转换成列数组,一次赋值
End Sub

非常感谢龙兄

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 12:31 | 显示全部楼层

哦,我明白了,我的代码中有一个笔误,本意是想

For J=1+I to 18,但是写成了

for J=1+1 to 18

因此错误。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 14:15 | 显示全部楼层
'经过排序之后,数组A()已经按照降序排序,
'至此,只要利用一个函数(或别的功能)找到参数Fnd在数组A()中的位置即可
'但是试用了 Find, Match 等工作表函数都不成功,因为查找的值是“文本”
'当然使用 Application.WorksheetFunction.Match 进行引用工作表函数
'请朋友们帮忙完善下面的查找位置,好吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-12-22 14:19 | 显示全部楼层
以下是引用[I]Long_III[/I]在2005-12-22 11:35:11的发言:[BR]

Sub RankSt()
Dim i As Integer, j As Integer
Dim B(1 To 18) As String
Dim TEMP As String

Application.ScreenUpdating = False '关闭屏幕更新,加快代码运行
For i = 1 To 18
B(i) = Sheet1.Cells(i + 1, 1)
Next
For i = 1 To 17
For j = i + 1 To 18
If B(i) < B(j) Then
TEMP = B(j)
B(j) = B(i)
B(i) = TEMP
End If
Next j
Next i
'For i = 1 To 18
' Sheet1.Cells(i + 1, 3) = "'" & B(i)
'Next i
Sheet1.Range("c2:c19").NumberFormatLocal = "@" '设置单元格为文本格式
Sheet1.Range("c2:c19") = Application.WorksheetFunction.Transpose(B) '把行数组转换成列数组,一次赋值
End Sub

Function PaiMing(Fnd As Range, FndRange As Range) As Integer Dim I As Integer, J As Integer Dim C, R '定义行号、列号的数字 C = FndRange.Count '获得单元格区域的数量,即有多少行 MsgBox C R = FndRange.Row '获得单元格区域的起始行号 MsgBox R Dim TEMP As String Dim A() For I = 0 To C A(I) = Cells(R + I, FndRange.Column) '把单元格区域FndRange的所有值赋给数组A() Next For I = 1 To C - 1 For J = I + 1 To C If B(I) < A(J) Then TEMP = A(J) A(J) = A(I) A(I) = TEMP End If Next J Next I '经过排序之后,数组A()已经按照降序排序, '至此,只要利用一个函数(或别的功能)找到参数Fnd在数组A()中的位置即可 '但是试用了 Find, Match 等工作表函数都不成功,因为查找的值是“文本” '当然使用 Application.WorksheetFunction.Match 进行引用工作表函数 '请朋友们帮忙完善下面的查找位置,好吗? End Function 请看附件 c3ZC4ubH.rar (7.81 KB, 下载次数: 15)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 16:45 , Processed in 0.044176 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表