ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] excel 隔列排序填充公式!

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-29 17:46 | 显示全部楼层
wodewan 发表于 2020-7-29 16:17
40,43,46行有重复会有问题

嗯,果然如此,是当出现数值相同的时候匹配会出错!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-29 22:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
后面复杂的,老师们没有兴趣研究了马

TA的精华主题

TA的得分主题

发表于 2020-7-30 10:29 | 显示全部楼层
'纯粹是数格子哪来的研究,10楼附件,,,

Option Explicit

Sub test()
  Dim arr, brr, mark, i, j, k, kk, m, t
  With Sheets("sheet1")
    arr = .Range("b3:k" & .[d3].End(xlDown).Row)
    brr = .[l3].Resize(UBound(arr, 1), 4 * 6).Value
    mark = .[l2].Resize(, UBound(brr, 2)).Value
  End With
  ReDim crr(1 To UBound(arr, 1) * 4, 1 To 6 + 2 * 6)
  For i = 1 To UBound(arr, 1)
    For j = 7 To 10
      If arr(i, j) > 0 Then
        m = m + 1: crr(m, 1) = m - 1: crr(m, 2) = arr(i, 3): crr(m, 3) = arr(i, j)
        For k = 4 To 6
          crr(m, k) = arr(i, k)
        Next
        For k = (j - 7) * 6 + 1 To (j - 7) * 6 + 6
          crr(m, 2 * (k - ((j - 7) * 6 + 1)) + 7) = mark(1, k)
          crr(m, 2 * (k - ((j - 7) * 6 + 1)) + 8) = IIf(brr(i, k) > 0, brr(i, k), 10 ^ 8)
        Next
        For k = 7 To UBound(crr, 2) - 3 Step 2
          For kk = 7 To UBound(crr, 2) + 4 - k Step 2
            If crr(m, kk + 1) > crr(m, kk + 3) Then
              t = crr(m, kk): crr(m, kk) = crr(m, kk + 2): crr(m, kk + 2) = t
              t = crr(m, kk + 1): crr(m, kk + 1) = crr(m, kk + 3): crr(m, kk + 3) = t
            End If
          Next
        Next
        For k = 8 To UBound(crr, 2) Step 2
          If crr(m, k) = 10 ^ 8 Then crr(m, k) = vbNullString: crr(m, k - 1) = crr(m, k)
        Next
      End If
    Next
  Next
  Sheets("预览").[a2].Resize(m, UBound(crr, 2)) = crr
End Sub

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-30 14:38 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-30 19:04 | 显示全部楼层
小刀老师,如果改成右侧左1-左18 右1-右18,上1-上18,下1-下18 就是框下字段后面,改成18-18-18-18列,后面的循环怎么改?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-30 23:38 | 显示全部楼层
Option Explicit


Sub 测试()
    Dim arr, brr, mark, i, j, k, kk, m, t
    Dim ds, dw, dz, dy, dx, mk, xh, wz, wy, hh, zh, sl, dh, zm, eow As Integer
    Dim sn, x
    Sheets("预览").Rows("2:5000").Clear '清除预览工作表第二行往下所有的数据
    With Sheets("数据表")
        dw = .Range("下长").Column
        dz = .Range("定左").Column
        dy = .Range("定右").Column
        ds = .Range("定上").Column
        dx = .Range("定下").Column
        mk = .Range("门宽").Column
        wz = .Range("左开").Column
        wy = .Range("右开").Column
        hh = .Range("行号").Column
        zh = .Range("组号").Column
        sl = .Range("数量").Column
        dh = .Range("单号").Column
        zm = .Range("字母").Column
        sn = .Range("顺逆").Column
        eow = .Cells(1, sn).End(xlDown).row
        arr = .Cells(3, sn).Resize(eow - 2, dw - sn + 1).Value '表1-10列数据
        x = 18
        brr = .Cells(3, dw + 1).Resize(UBound(arr, 1), 4 * x).Value '表10列往后的数据
        mark = .Cells(1, dw + 1).Resize(, UBound(brr, 2)).Value '模具keys
    End With
    ReDim crr(1 To UBound(arr, 1) * 4, 1 To 6 + 2 * x)
    '建立动态数组crr为全部数值=6可以替换为数据前面总列数,意思是前面6列逐列赋值,后面x列
    '由于是一对一对的所以是两个两个的赋值即2x
    '4=后面有几组数据,本例中有四组数据,故=4
    For i = 1 To UBound(arr, 1) '行循环
        For j = 7 To 10 '列循环
            If arr(i, j) > 0 Then
                m = m + 1: crr(m, 1) = m - 1: crr(m, 2) = arr(i, 3): crr(m, 3) = arr(i, j) '将crr1-3列赋值:序号+组好+总长,m为crr的行坐标
                For k = 4 To 6 'crr 第i行第4列-第6列,数量,樘号,子母列=值循环方式放入crr
                    crr(m, k) = arr(i, k) '4-6列赋值给crr
                Next
                For k = (j - 7) * x + 1 To (j - 7) * x + x 'crr数据列7-18列循环赋值
                    crr(m, 2 * (k - ((j - 7) * x + 1)) + 7) = mark(1, k) 'crr 模具 7’9‘11’13‘15’17列赋值
                    crr(m, 2 * (k - ((j - 7) * x + 1)) + 8) = IIf(brr(i, k) > 0, brr(i, k), 10 ^ 8) 'crr 位置 8,10,12,14,16,18列赋值且将0值替换为100000
                Next
                '====以上将当前行全部赋值完成,以下为排序去空行
                'MsgBox UBound(crr, 2)
                For k = 7 To UBound(crr, 2) - 3 Step 2
                    For kk = 7 To UBound(crr, 2) + 4 - k Step 2
                        If crr(m, kk + 1) > crr(m, kk + 3) Then
                            t = crr(m, kk): crr(m, kk) = crr(m, kk + 2): crr(m, kk + 2) = t
                            t = crr(m, kk + 1): crr(m, kk + 1) = crr(m, kk + 3): crr(m, kk + 3) = t
                        End If
                    Next
                Next
                For k = 8 To UBound(crr, 2) Step 2
                    If crr(m, k) = 10 ^ 8 Then crr(m, k) = vbNullString: crr(m, k - 1) = crr(m, k)
                Next
            End If
        Next
    Next
    Sheets("预览").[a2].Resize(m, UBound(crr, 2)) = crr
End Sub
小刀老师,根据您给的代码,我拿来主义,直接copy啦,终于挪到我的表格上了,再三感谢!!!
还有做了些注解,花了好些功夫才理解了一半,下面没有注解的您能给解释下吗,实在看不懂了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-30 23:41 | 显示全部楼层
一把小刀闯天下 发表于 2020-7-30 10:29
'纯粹是数格子哪来的研究,10楼附件,,,

Option Explicit

雾里看花,水中望月!此谓“水中月”,小刀老师,小弟受教了,感谢!

TA的精华主题

TA的得分主题

发表于 2020-7-31 07:31 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wodewan 发表于 2020-7-29 16:15
哈哈,果然如小刀老师所说,考眼力,40,43,46 行工序有重复,会有点问题,更新下
Sub test()
Dim arr,  ...

老师这个是关键字排序吗?list.Sort: ar = list.toarray这句两个我都没看懂

TA的精华主题

TA的得分主题

发表于 2020-7-31 07:45 来自手机 | 显示全部楼层
2163kjh 发表于 2020-7-30 23:38
Option Explicit



你没注释的for Step 2,是循环的步长,比如1,3,5

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-31 07:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个应该是list.sort,降序排序字典-----------然后将排好序的自动转换为数组ar,我是自己琢磨的,不知道对不对
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 16:34 , Processed in 0.043932 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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