ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 这个格式可以用VBA代码来整理吗?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-13 13:12 | 显示全部楼层
拜托大家帮忙看看~

TA的精华主题

TA的得分主题

发表于 2018-6-13 14:18 | 显示全部楼层
'使用20楼的附件,中间数据在brr数组中可以在最后输出
'不一定正确,供参考

Option Explicit

Sub test()
  Dim i, j, k, pos, n, t, arr, sht, ii, mark, m
  pos = Split("3-2 4-3 5-4 6-5 7-6 8-7 10-8 11-9 12-10 14-11 15-12 16-13")
  sht = Split("pc端店铺来源 无线端店铺来源")
  mark = Split("PC端 无线端")
  ReDim brr(1 To Rows.Count, 1 To 17)
  For ii = 0 To UBound(sht)
    With Sheets(sht(ii))
      arr = .Range("a2:m" & .Cells(Rows.Count, "a").End(xlUp).Row + 1)
    End With
    For i = 1 To UBound(arr, 1) - 1
      If Trim(arr(i, 2)) = "来源名称" Then
        For j = i + 1 To UBound(arr, 1) - 1
          n = n + 1: brr(n, 17) = mark(ii)
          brr(n, 1) = Split(Split(arr(j, 1), "竞店入店来源对比-")(1), "_")(0)
          brr(n, 2) = arr(i - 4, 3): brr(n, 9) = arr(i - 3, 3): brr(n, 13) = arr(i - 2, 3)
          For k = 0 To UBound(pos)
            t = Split(pos(k), "-"): brr(n, Val(t(0))) = arr(j, Val(t(1)))
          Next
          If Len(Trim(arr(j + 1, 2))) = 0 Then i = j: Exit For
        Next
      End If
  Next i, ii
  ReDim arr(1 To 3 * n, 1 To 9)
  pos = Array(1, 2, 17, 3, 4, 5, 6, 7, 8, 1, 9, 17, 3, 0, 10, 11, 12, 0, 1, 13, 17, 3, 0, 14, 15, 16, 0)
  For i = 1 To UBound(arr, 1) Step 3
    n = (i - 1) / 3 + 1: m = 0
    For j = i To i + 2
      For k = 1 To UBound(arr, 2)
        If pos(m) > 0 Then arr(j, k) = brr(n, pos(m))
        m = m + 1
  Next k, j, i
  With Sheets("格式整理").[k2] '作比较用,店铺名称未作排序,自己排一下
    .Resize(Rows.Count - 11, UBound(arr, 2)).ClearContents
    .Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  End With
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-13 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-6-13 14:18
'使用20楼的附件,中间数据在brr数组中可以在最后输出
'不一定正确,供参考

谢谢大神~ 这个怎么学啊 好难啊感觉 你们为什么可以这么容易就写出来

TA的精华主题

TA的得分主题

发表于 2018-6-13 14:38 | 显示全部楼层
小葵1124 发表于 2018-6-13 14:30
谢谢大神~ 这个怎么学啊 好难啊感觉 你们为什么可以这么容易就写出来

先找点资料闭门造车一段时间,然后冒充胖子在这论坛上帮人做做题目,时间长了就会了。

资料网上到处都是,自己去下点就可以了。

你这需要数格子来写代码,定位起来有点晕。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-13 14:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-6-13 14:38
先找点资料闭门造车一段时间,然后冒充胖子在这论坛上帮人做做题目,时间长了就会了。

资料网上到处都 ...

厉害厉害 我还在消化你的代码,真是太厉害了,我找点资料练习练习看看 感觉这个不动手去做 很难掌握

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-13 14:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-6-13 14:38
先找点资料闭门造车一段时间,然后冒充胖子在这论坛上帮人做做题目,时间长了就会了。

资料网上到处都 ...

大神 这是哪张表的格子 pos = Array(1, 2, 17, 3, 4, 5, 6, 7, 8, 1, 9, 17, 3, 0, 10, 11, 12, 0, 1, 13, 17, 3, 0, 14, 15, 16, 0)

TA的精华主题

TA的得分主题

发表于 2018-6-13 15:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小葵1124 发表于 2018-6-13 14:59
大神 这是哪张表的格子 pos = Array(1, 2, 17, 3, 4, 5, 6, 7, 8, 1, 9, 17, 3, 0, 10, 11, 12, 0, 1, 13 ...

brr数组 1-17  中间数组,可以看做是原数据
arr数组 1-9

根据要求做了一个对照表,你可以把brr数组输出到一张新的工作表上,比如在这个工作薄中插入一个新的工作表"sheet1",然后在最后插入以下代码:
  With Sheets("sheet1").[a2]
    .Resize(Rows.Count - 1, UBound(brr, 2)).ClearContents
    .Resize(UBound(arr, 1) / 3, UBound(brr, 2)) = brr
  End With

比较“格式整理” 与"sheet1"对应的数据列之间的关系就能理解了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-14 11:29 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-13 15:09
brr数组 1-17  中间数组,可以看做是原数据
arr数组 1-9

大神 能把你写的代码标注一下解释吗,小白看不懂,特别是定义的变量一多

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-14 11:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-6-13 15:09
brr数组 1-17  中间数组,可以看做是原数据
arr数组 1-9

1-17中间数组没明白 源数据不是13列吗,哪里来的17呢?

TA的精华主题

TA的得分主题

发表于 2018-6-14 21:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小葵1124 发表于 2018-6-14 11:41
1-17中间数组没明白 源数据不是13列吗,哪里来的17呢?

跟中间数组brr比较的,没看27楼吗?

如果没有第一个问题也不会有这个中间数组了,可以在真正的源数据上直接输出结果,当然写起来会稍微复杂一点的。

其实你这并不叫汇总,而应该叫单行有条件转换成3行。最终输出的列为9列,如果单纯有规律转换那中间数组要有27列,但它实际只有17列。其中有些重复、有些为空,规律并不明显所以给你再用了一个pos数组进行重定位。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:55 , Processed in 0.040762 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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