Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 兰色幻想

工作表按名称排序(VBA80集第25讲课后练习题)上交专贴

  [复制链接]
发表于 2022-6-1 11:25 | 显示全部楼层
学习
回复

使用道具 举报

发表于 2022-7-16 14:01 | 显示全部楼层
回复

使用道具 举报

发表于 2022-7-18 21:55 | 显示全部楼层
回复

使用道具 举报

发表于 2022-12-1 15:44 | 显示全部楼层
来向各位高手们学习一下
回复

使用道具 举报

发表于 2023-1-15 14:37 | 显示全部楼层
学习again
回复

使用道具 举报

发表于 2023-8-1 18:41 | 显示全部楼层
下载的附件打不开。
回复

使用道具 举报

发表于 2023-8-2 16:35 | 显示全部楼层
本帖最后由 leoxxx 于 2023-8-2 17:43 编辑
  1. Sub 工作表排序之希尔排序()
  2.     Dim arr, temp, x, y, t As Integer, g As Integer, n As String
  3.     ReDim arr(1 To Sheets.Count) '重新分配数组的存储空间
  4.     For x = 1 To UBound(arr)
  5.         arr(x) = Sheets(x).Name
  6.     Next x
  7.     t = UBound(arr) '总长度
  8.     g = 1 '间隔初始化
  9.     If t > 13 Then
  10.         Do While g < t
  11.             g = g * 3 + 1
  12.         Loop
  13.         g = g \ 9
  14.     End If
  15.     Do While g
  16.         For x = 1 + g To UBound(arr)
  17.             temp = arr(x) '储存当前元素
  18.             For y = x - g To 1 Step -g '上一个元素到第一个元素,步进减g。
  19.                 If temp >= arr(y) Then Exit For '当前元素大于等于arr(y)则跳出本层For。
  20.                 arr(y + g) = arr(y) '不满足条件则将arr(y + g)赋值为arr(y)。
  21.             Next y
  22.             arr(y + g) = temp '跳出For后执行。将arr(y + g)赋值为当前元素。
  23.         Next x
  24.         g = g \ 3
  25.     Loop
  26.     n = ActiveSheet.Name '获取当前表名
  27.     For x = 1 To UBound(arr) - 1
  28.         Sheets(arr(x)).Move before:=Sheets(arr(UBound(arr))) '移到数组上标之前
  29.     Next x
  30.     Sheets(n).Select
  31. End Sub
复制代码


回复

使用道具 举报

发表于 2023-8-2 16:44 | 显示全部楼层
本帖最后由 leoxxx 于 2023-8-17 17:48 编辑
  1. Sub 工作表排序之冒泡法()
  2.     Dim arr, temp, x, y, n As String
  3.     ReDim arr(1 To Sheets.Count) '重新分配数组的存储空间
  4.     For x = 1 To UBound(arr)
  5.         arr(x) = Sheets(x).Name
  6.     Next x
  7.     For x = 1 To UBound(arr) - 1
  8.         For y = x + 1 To UBound(arr)
  9.             If arr(x) > arr(y) Then
  10.                 temp = arr(x)
  11.                 arr(x) = arr(y)
  12.                 arr(y) = temp
  13.                 '如果x大于y则互换位置。
  14.             End If
  15.         Next y
  16.     Next x
  17.     n = ActiveSheet.Name '获取当前表名
  18.     For x = 1 To UBound(arr) - 1
  19.         Sheets(arr(x)).Move before:=Sheets(arr(UBound(arr))) '移到数组上标之前
  20.     Next x
  21.     Sheets(n).Select
  22. End Sub

  23. Sub 工作表排序之选择法()
  24.     Dim arr, temp, x, y, m As Integer, n As String
  25.     ReDim arr(1 To Sheets.Count) '重新分配数组的存储空间
  26.     For x = 1 To UBound(arr)
  27.         arr(x) = Sheets(x).Name
  28.     Next x
  29.     For x = 1 To UBound(arr) - 1
  30.         m = x '索引初始化
  31.         For y = x + 1 To UBound(arr)
  32.             If arr(m) > arr(y) Then m = y '查找最小索引。同行不用End If。
  33.         Next y
  34.         temp = arr(x)
  35.         arr(x) = arr(m)
  36.         arr(m) = temp
  37.         '当前值与索引与互换位置
  38.     Next x
  39.     n = ActiveSheet.Name '获取当前表名
  40.     For x = 1 To UBound(arr) - 1
  41.         Sheets(arr(x)).Move before:=Sheets(arr(UBound(arr))) '移到数组上标之前
  42.     Next x
  43.     Sheets(n).Select
  44. End Sub

  45. Sub 工作表排序之插入法()
  46.     Dim arr, temp, x, y, n As String
  47.     ReDim arr(1 To Sheets.Count) '重新分配数组的存储空间
  48.     For x = 1 To UBound(arr)
  49.         arr(x) = Sheets(x).Name
  50.     Next x
  51.     For x = 2 To UBound(arr)
  52.         temp = arr(x) '储存当前元素
  53.         For y = x - 1 To 1 Step -1 '上一个元素到第一个元素,步进减1。
  54.             If temp >= arr(y) Then Exit For '当前元素大于等于arr(y)则跳出本层For。
  55.             arr(y + 1) = arr(y) '不满足条件则将arr(y + 1)赋值为arr(y)。
  56.         Next y
  57.         arr(y + 1) = temp '跳出For后执行。将arr(y + 1)赋值为当前元素。
  58.     Next x
  59.     n = ActiveSheet.Name '获取当前表名
  60.     For x = 1 To UBound(arr) - 1
  61.         Sheets(arr(x)).Move before:=Sheets(arr(UBound(arr))) '移到数组上标之前
  62.     Next x
  63.     Sheets(n).Select
  64. End Sub

  65. Sub 打乱顺序()
  66.     Dim arr, arr1, i, r As Integer, k As Integer, n As String
  67.     ReDim arr(1 To Sheets.Count), arr1(1 To Sheets.Count) '重新分配数组的存储空间
  68.     For i = 1 To UBound(arr1)
  69.         arr1(i) = Sheets(i).Name
  70.     Next i
  71.     k = UBound(arr)
  72.     Randomize 'https://learn.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/randomize-statement
  73.     For i = LBound(arr) To UBound(arr)
  74.         r = Int((k - LBound(arr) + 1) * Rnd + LBound(arr)) 'https://learn.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/rnd-function
  75.         arr(i) = arr1(r) '将arr1的随机值存储到arr
  76.         arr1(r) = arr1(k)
  77.         arr1(k) = arr(i) '与数组末位交换位置
  78.         k = k - 1 '数组末位-1以避免重复取值
  79.     Next i
  80.     n = ActiveSheet.Name '获取当前表名
  81.     For i = 1 To UBound(arr) - 1
  82.         Sheets(arr(i)).Move before:=Sheets(arr(UBound(arr))) '移到数组上标之前
  83.     Next i
  84.     Sheets(n).Select
  85. End Sub
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-29 11:43 , Processed in 0.263199 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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