ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助优化代码,如何根据样品编号重排试验数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-14 00:21 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如图,将左侧b3:d14重排到g3:j11,排列规则,原始表是同一个检验员的数据在一列,现在想把同一个样品编号的排在一列,刚学VBA不就,编的代码虽然能实现这个功能,但是太繁杂了,请求大家指点下怎么优化,谢谢!
1.png
代码如下:
  1. Sub 重排()
  2.     Dim arr, brr, m%
  3.     arr = [a3:d14]
  4.     ReDim brr(1 To UBound(arr) * UBound(arr, 2), 1 To 1)
  5.     For i = 1 To UBound(arr)
  6.         For j = 2 To UBound(arr, 2)
  7.             If arr(i, 1) = 1 Then
  8.                 m = m + 1
  9.                 brr(m, 1) = arr(i, j)
  10.             End If
  11.         Next
  12.     Next
  13.     [g3].Resize(m, 1) = brr
  14.     m = 0
  15.     For i = 1 To UBound(arr)
  16.         For j = 2 To UBound(arr, 2)
  17.             If arr(i, 1) = 2 Then
  18.                 m = m + 1
  19.                 brr(m, 1) = arr(i, j)
  20.             End If
  21.         Next
  22.     Next
  23.     [h3].Resize(m, 1) = brr
  24.     m = 0
  25.     For i = 1 To UBound(arr)
  26.         For j = 2 To UBound(arr, 2)
  27.             If arr(i, 1) = 3 Then
  28.                 m = m + 1
  29.                 brr(m, 1) = arr(i, j)
  30.             End If
  31.         Next
  32.     Next
  33.     [i3].Resize(m, 1) = brr
  34.     m = 0
  35.     For i = 1 To UBound(arr)
  36.         For j = 2 To UBound(arr, 2)
  37.             If arr(i, 1) = 4 Then
  38.                 m = m + 1
  39.                 brr(m, 1) = arr(i, j)
  40.             End If
  41.         Next
  42.     Next
  43.     [j3].Resize(m, 1) = brr
  44. End Sub
复制代码


求助.rar (13.05 KB, 下载次数: 10)

TA的精华主题

TA的得分主题

发表于 2019-12-14 08:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 重排()
    Dim nRow%, Arr(), Brr(), i%, i1%, i2%
    nRow = Range("a65536").End(xlUp).Row - 2 '数据行数
    Arr = Range("b3").Resize(nRow, 3).Value
    ReDim Brr(1 To 3 * nRow / 4, 1 To 4)
    For i = 1 To nRow Step 4 '每4行为一块划分
        i2 = (i - 1) * 3 / 4 'Brr中开始的行号
        For i1 = 1 To 4 '循环当前数据块的行
            For j = 1 To 3 '循环3列
                Brr(i2 + j, i1) = Arr(i + i1 - 1, j) '读写数据
            Next
        Next
    Next
    Range("g3").Resize(UBound(Brr), 4).Value = Brr '输出数据
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-14 09:13 | 显示全部楼层
山菊花 发表于 2019-12-14 08:48
Sub 重排()
    Dim nRow%, Arr(), Brr(), i%, i1%, i2%
    nRow = Range("a65536").End(xlUp).Row - 2  ...

这数组赋值,+ value 与不加的区别是啥?我看论坛好多都是不加,请总版主帮忙回答一下,谢谢

TA的精华主题

TA的得分主题

发表于 2019-12-14 09:15 | 显示全部楼层
  1. Sub test()
  2.     Dim arr, i%, j%
  3.     Sheet1.Range("g3:j11").ClearContents
  4.     For i = 3 To Sheet1.Range("A5000").End(xlUp).Row
  5.        If Sheet1.Cells(i, 1) = 1 Then
  6.            arr = Sheet1.Range("B" & i).Resize(4, 3)
  7.            For j = 3 To Sheet1.Range("f5000").End(xlUp).Row
  8.                If Sheet1.Cells(j, 6) = "甲" And Sheet1.Cells(j, 7) = "" Then
  9.                    Sheet1.Range("G" & j).Resize(UBound(arr, 2), UBound(arr)) = _
  10.                    Application.WorksheetFunction.Transpose(arr)
  11.                    Exit For
  12.                End If
  13.            Next
  14.        End If
  15.     Next
  16. End Sub

  17. 数据固定就用总版主那个吧,不固定可以尝试用这个试试
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-14 09:21 | 显示全部楼层
feiyang8878 发表于 2019-12-14 09:13
这数组赋值,+ value 与不加的区别是啥?我看论坛好多都是不加,请总版主帮忙回答一下,谢谢

陌生人见面,通常问:你叫什么?你叫什么名?
向别人介绍自己,也是,我叫山菊花,我的名叫山菊花。
这个“名”在这个场景中,是人的默认属性,可用,可省略。
老师公布学生成绩时,会说,张三的成绩100分,李四98分(这里就省略了“成绩”)。
Value也一样,它是单元格默认的属性,一般可省略。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-14 09:30 | 显示全部楼层
山菊花 发表于 2019-12-14 09:21
陌生人见面,通常问:你叫什么?你叫什么名?
向别人介绍自己,也是,我叫山菊花,我的名叫山菊花。
这 ...

谢谢总版主回答~明白了

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-14 09:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
山菊花 发表于 2019-12-14 08:48
Sub 重排()
    Dim nRow%, Arr(), Brr(), i%, i1%, i2%
    nRow = Range("a65536").End(xlUp).Row - 2  ...

谢谢总版主帮助,还有一个问题忘记在里面体现了,实际表格中,最后输入数据的区域不在连续的四列中,请问总如何指定样品1在某列,样品2在某列?比如样品1在g3、样品2在i3、样品3在k3、样品4在m3输出,烦请总版主指定迷津,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-14 09:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-14 09:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
753227299 发表于 2019-12-14 09:51
谢谢总版主帮助,还有一个问题忘记在里面体现了,实际表格中,最后输入数据的区域不在连续的四列中,请问 ...

请提供附件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-14 10:05 | 显示全部楼层

求助(输出数据区域不连续).rar (15.81 KB, 下载次数: 2)
请总版主查收,感谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-25 04:25 , Processed in 0.047111 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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