ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA提取特殊数据及重新排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-9-22 14:50 | 显示全部楼层 |阅读模式
VBA提取特殊数据及重新排序
*
Sheet1是源數据,
每一行是独立的数据,
行及列数不固定.
*
*
计算逻辑:
只提取每一行特殊的内容的单元格 (前缀数字 = ?.?) ,
重新排序后( 根据数值, 由小到大, 升序 ), 再赋值
*
*
N多数据, 请老师/大神帮帮忙

Rank.jpg

Rank.zip

9.83 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2020-9-22 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个估计得用正则表达式,要不好像比较麻烦.

TA的精华主题

TA的得分主题

发表于 2020-9-22 15:38 | 显示全部楼层
'按结果凑了一个,,

Option Explicit

Sub test()
  Dim arr, i, j, k, n, t
  arr = Sheets("sheet1").UsedRange.Value
  For i = 1 To UBound(arr, 1)
    n = 2
    For j = 3 To UBound(arr, 2)
      If InStr(arr(i, j), ".") Then n = n + 1: arr(i, n) = arr(i, j)
      If j > n Then arr(i, j) = vbNullString
    Next
    For j = 3 To n - 1
      For k = j + 1 To n
        If Val(arr(i, j)) > Val(arr(i, k)) Then
          t = arr(i, j): arr(i, j) = arr(i, k): arr(i, k) = t
        End If
      Next
    Next
  Next
  Sheets("Sheet1 (2)").[a1].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-9-22 15:52 | 显示全部楼层
Sub AwTest()
    Dim i%, j%, c%, n%, r%, arr, temp
    Sheet1.Select
    arr = ActiveSheet.UsedRange
    ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
    For i = 1 To UBound(arr)
        c = 0
        For j = 1 To UBound(arr, 2)
            If Val(arr(i, j)) > 0 Then
                c = c + 1
                brr(i, c) = arr(i, j)
            End If
            n = IIf(n > c, n, c)
        Next
    Next
    For i = 1 To UBound(brr)
        For j = 3 To n - 1
            For r = j + 1 To n
                If Len(brr(i, j)) > 0 And Len(brr(i, r)) > 0 Then
                    If Val(brr(i, j)) > Val(brr(i, r)) Then
                        temp = brr(i, j)
                        brr(i, j) = brr(i, r)
                        brr(i, r) = temp
                    End If
                End If
            Next
        Next
    Next
    [r1].Resize(UBound(brr), n) = brr
End Sub

凑一个!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-9-22 15:53 | 显示全部楼层
Rank.zip (17.37 KB, 下载次数: 11)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-22 16:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢老师,

请帮忙修改一下代码,
把计算结果输出到另一页, 比如Sheet2…

TA的精华主题

TA的得分主题

发表于 2020-9-22 16:16 | 显示全部楼层
On_fire 发表于 2020-9-22 16:10
谢谢老师,

请帮忙修改一下代码,

Sub AwTest()
    Dim i%, j%, c%, n%, r%, arr, temp
    Sheet1.Select
    arr = ActiveSheet.UsedRange
    ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
    For i = 1 To UBound(arr)
        c = 0
        For j = 1 To UBound(arr, 2)
            If Val(arr(i, j)) > 0 Then
                c = c + 1
                brr(i, c) = arr(i, j)
            End If
            n = IIf(n > c, n, c)
        Next
    Next
    For i = 1 To UBound(brr)
        For j = 3 To n - 1
            For r = j + 1 To n
                If Len(brr(i, j)) > 0 And Len(brr(i, r)) > 0 Then
                    If Val(brr(i, j)) > Val(brr(i, r)) Then
                        temp = brr(i, j)
                        brr(i, j) = brr(i, r)
                        brr(i, r) = temp
                    End If
                End If
            Next
        Next
    Next
    With Sheet2
        .Cells.Clear
        .[a1].Resize(UBound(brr), n) = brr
    End With
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-9-22 16:18 | 显示全部楼层
Rank.zip (17.71 KB, 下载次数: 6)

TA的精华主题

TA的得分主题

发表于 2020-9-22 16:36 | 显示全部楼层
  1. Sub 统计()
  2.     Dim m, i, j, arr, brr(), crr()
  3.     Range("R1:AE65536") = ""
  4.     arr = Range("A1:N" & [A65536].End(3).Row)
  5.     ReDim brr(1 To UBound(arr), 1 To 14)
  6.     For i = 1 To UBound(arr)
  7.         For j = 1 To 2
  8.             brr(i, j) = arr(i, j)
  9.         Next
  10.         m = 2
  11.         For j = 3 To UBound(arr, 2)
  12.             If Left(arr(i, j), 1) Like "[0-9]" Then
  13.                 m = m + 1
  14.                 brr(i, m) = arr(i, j)
  15.             End If
  16.         Next
  17.         ReDim crr(1 To 1, 1 To m - 2)
  18.         For j = 3 To m
  19.             crr(1, j - 2) = brr(i, j)
  20.         Next
  21.         Call dsort(crr)
  22.         For j = 3 To m
  23.             brr(i, j) = crr(1, j - 2)
  24.         Next
  25.         Erase crr
  26.     Next
  27.     [R1].Resize(UBound(brr), 14) = brr
  28. End Sub

  29. Function dsort(arr)
  30.     Dim i, j, a, b, t
  31.     For i = 1 To UBound(arr, 2) - 1
  32.         For j = i + 1 To UBound(arr, 2)
  33.             a = Val(Mid(arr(1, i), 1, Len(arr(1, i)) - 2))
  34.             b = Val(Mid(arr(1, j), 1, Len(arr(1, j)) - 2))
  35.             If a > b Then
  36.                 t = arr(1, i)
  37.                 arr(1, i) = arr(1, j)
  38.                 arr(1, j) = t
  39.             End If
  40.         Next
  41.     Next
  42. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-22 17:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

老师好,
改一下源数据, 发现计算结果不对,
少了2列, 排序也不对?

请您看一看?

Rank02.zip

19.99 KB, 下载次数: 6

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 19:47 , Processed in 0.048725 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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