ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-7-28 22:34 | 显示全部楼层 |阅读模式
本帖最后由 2163kjh 于 2020-7-29 10:16 编辑

image.jpg

排序,匹配

排序,匹配
image.png

案例.zip

24.38 KB, 下载次数: 8

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-28 23:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
'练练眼力,,,

Option Explicit

Sub test()
  Dim arr(3), mark, i, j, k, t
  arr(0) = Range("b3:g" & Cells(Rows.Count, "b").End(xlUp).Row).Value
  mark = [b2].Resize(, UBound(arr(0), 2)).Value
  ReDim temp(1 To 2, 1 To UBound(arr(0), 2)), brr(1 To UBound(arr(0), 1), 1 To 2 * UBound(arr(0), 2))
  For i = 1 To UBound(arr)
    arr(i) = arr(0)
  Next
  For i = 1 To UBound(arr(0), 1)
    For j = 1 To UBound(arr(0), 2)
      temp(1, j) = arr(0)(i, j)
      temp(2, j) = mark(1, j)
      If temp(1, j) = 0 Then temp(1, j) = 10 ^ 8
    Next
    For j = 1 To UBound(temp, 2) - 1
      For k = j + 1 To UBound(temp, 2)
        If temp(1, j) > temp(1, k) Then
          t = temp(1, j): temp(1, j) = temp(1, k): temp(1, k) = t
          t = temp(2, j): temp(2, j) = temp(2, k): temp(2, k) = t
        End If
      Next
    Next
    For j = 1 To UBound(temp, 2)
      If temp(1, j) < 10 ^ 8 Then
        arr(1)(i, j) = temp(1, j)
        arr(2)(i, j) = temp(2, j)
        arr(3)(i, j) = temp(1, j) & "-" & temp(2, j)
        brr(i, 2 * j - 1) = temp(1, j)
        brr(i, 2 * j) = temp(2, j)
      Else
        For k = 1 To 3
          arr(k)(i, j) = vbNullString
        Next
      End If
    Next
  Next
  mark = Split("?,l,u,ae", ",")
  For i = 1 To 3
    Range(mark(i) & 3).Resize(UBound(arr(i), 1), UBound(arr(i), 2)) = arr(i)
  Next
  [ap3].Resize(UBound(brr, 1), UBound(brr, 2)) = brr
End Sub

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-28 23:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Option Explicit
'不用你前面的4步转换,VBA 方式结果输出在BB列,供参考。
Sub test()
Dim arr, ar, br, res, i&, j&, k&, erow&
Dim list As Object: Set list = CreateObject("system.collections.arraylist")
Dim d As Object: Set d = CreateObject("scripting.dictionary")
With Sheets("sheet1")
    erow = .[a65533].End(3).Row
    br = .[b2:g2]
    arr = .Range("b3:g" & erow)
    ReDim res(1 To UBound(arr), UBound(arr, 2) * 2)
    For i = 1 To UBound(arr)
        For j = 1 To UBound(arr, 2)
            If arr(i, j) <> 0 Then
                list.Add (arr(i, j))
                d(arr(i, j)) = j
            End If
        Next
        list.Sort: ar = list.toarray
        For k = 0 To UBound(ar)
            res(i, k * 2) = ar(k)
            res(i, k * 2 + 1) = br(1, d(ar(k)))
        Next
        list.Clear
    Next
    .Range("bb3:bi1000").ClearContents
    .Range("BB3").Resize(UBound(res), UBound(res, 2)) = res
End With
End Sub

案例.rar

33.43 KB, 下载次数: 13

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-29 06:45 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-29 07:45 | 显示全部楼层
本帖最后由 2163kjh 于 2020-7-29 07:48 编辑

=IFERROR(IF(MOD(COLUMN(A1),2),INDEX($B$2:$G$2,MATCH(SMALL($B3:$G3,(COLUMN(A1)+1)/2+COUNTIF($B3:$G3,"0")),$B3:$G3,0)),SMALL($B3:$G3,COLUMN(A1)/2+COUNTIF($B3:$G3,"0"))),"") 直接输入这个公式可以左右上下拖拽直接生成,一键OK,详见附件!
还有啥更好的方法,集思广益~!


案例-一键公式.zip

27.66 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2020-7-29 11:04 | 显示全部楼层
2163kjh 发表于 2020-7-29 07:45
=IFERROR(IF(MOD(COLUMN(A1),2),INDEX($B$2:$G$2,MATCH(SMALL($B3:$G3,(COLUMN(A1)+1)/2+COUNTIF($B3:$G3," ...

'你这最终示例结果中有3处是错误的,,,

Option Explicit

Sub test()
  Dim arr, i, j, k, t, mark
  arr = Range("b3:g" & [b3].End(xlDown).Row).Value
  mark = [b2].Resize(, UBound(arr, 2)).Value
  ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2) * 2)
  For i = 1 To UBound(arr, 1)
    For j = 1 To UBound(arr, 2)
      brr(i, 2 * j - 1) = IIf(arr(i, j) > 0, arr(i, j), 10 ^ 8)
      brr(i, 2 * j) = mark(1, j)
    Next
    For j = 1 To UBound(brr, 2) - 3 Step 2
      For k = 1 To UBound(brr, 2) - 2 - j Step 2
        If brr(i, k) > brr(i, k + 2) Then
          t = brr(i, k): brr(i, k) = brr(i, k + 2): brr(i, k + 2) = t
          t = brr(i, k + 1): brr(i, k + 1) = brr(i, k + 3): brr(i, k + 3) = t
        End If
      Next
    Next
    For j = 1 To UBound(brr, 2)
      If brr(i, j) = 10 ^ 8 Then brr(i, j) = vbNullString: brr(i, j + 1) = brr(i, j)
    Next
  Next
  [bm3].Resize(UBound(brr, 1), UBound(brr, 2)) = brr
End Sub

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-29 15:27 | 显示全部楼层
6楼哪个地方有错误?能给指正下吗,一会我再把案例更改下让他在复杂点,在这基础上在研究下,表格局部排序!

TA的精华主题

TA的得分主题

发表于 2020-7-29 16:15 | 显示全部楼层
哈哈,果然如小刀老师所说,考眼力,40,43,46 行工序有重复,会有点问题,更新下
Sub test()
Dim arr, ar, s, res, i&, j&, k&, erow&
Dim list As Object: Set list = CreateObject("system.collections.arraylist")
With Sheets("sheet1")
    erow = .[a65533].End(3).Row
    arr = .Range("b2:g" & erow)
    ReDim res(1 To UBound(arr), UBound(arr, 2) * 2)
    For i = 2 To UBound(arr)
        For j = 1 To UBound(arr, 2)
            If arr(i, j) <> 0 Then
                s = Format(arr(i, j), "0000")
                list.Add (s & "-" & arr(1, j))
            End If
        Next
        list.Sort: ar = list.toarray
        For k = 0 To UBound(ar)
            res(i, k * 2) = Val(Split(ar(k), "-")(0))
            res(i, k * 2 + 1) = Split(ar(k), "-")(1)
        Next
        list.Clear
    Next
    .Range("bb3:bi1000").ClearContents
    .Range("BB2").Resize(UBound(res), UBound(res, 2)) = res
End With
End Sub

案例.rar

34.91 KB, 下载次数: 9

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-7-29 16:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wodewan 于 2020-7-29 16:46 编辑
2163kjh 发表于 2020-7-29 15:27
6楼哪个地方有错误?能给指正下吗,一会我再把案例更改下让他在复杂点,在这基础上在研究下,表格局部排序 ...

40,43,46行有重复会有问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-7-29 17:21 | 显示全部楼层
又加了些内容,谁愿意再研究下,谢谢,鲜花送上!

案例-进阶.zip

32.69 KB, 下载次数: 13

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

本版积分规则

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

GMT+8, 2024-6-10 12:28 , Processed in 0.043949 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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