ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 一个我不知道怎么形容的难题,所以也搜不到答案。请高手给看看。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-25 15:50 | 显示全部楼层 |阅读模式
本帖子刚刚发在了Excel函数与公式专区。朋友们说我这个问题应该到VB专区来问。于是我来请教一下。对了,本人不懂VB,听人说这个要求需要VB才能实现,所以我正在看置顶的帖子里关于VB的介绍。也请高手给的解答尽量详细一点好让我能操作。谢谢!


我的数据库结构如下表


现在我需要将表中的行拆分成下面的样式
[size=0.83em]2014-12-25 15:02 上传
下载附件 [size=0.83em](74.79 KB)





我希望大家看得懂。是简单的排列组合。
但是我不知道该如何实现。
顺便说一下,原始数据很大。每个表大概2万行。拆分之后大概20-40万行。手工几乎不可能实现。
如果没有好的一步到位的办法,中间经过几次手动干预也行。
这个是实际工作中遇到的难题,求各位给个办法。多谢啦!


说明:D到H的数据是零件的详细信息。
比如第二行中这个零件,在2009到2011年生产的汽车中,1.2/1.4/1.6三个排量,手动挡和自动挡都会用到它。
而第四行这个零件,就只在2007年,1.6排量,自动挡的车型中才会用到。
我现在的工作就是把每个零件的ABC三列变成单独的唯一信息。所以原数据的第二行就需要拆分成新数据的2到19行



附件在这里

测试.rar (9.11 KB, 下载次数: 30)

TA的精华主题

TA的得分主题

发表于 2014-12-25 16:30 | 显示全部楼层
关注学习中 ... ...

TA的精华主题

TA的得分主题

发表于 2014-12-25 16:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请测试
  1. Sub Test()
  2. Dim infoarr, arr1, arr2, arr3
  3. Dim r, a1, a2, a3, c
  4. Dim Rrow As Long
  5. Dim resultarr()
  6. Dim k As Long

  7. Sheet2.Cells(2, 1).Resize(Rows.Count - 1, 8).ClearContents

  8. infoarr = Sheet1.Range("a2:h" & Sheet1.Cells(Rows.Count, 1).End(3).Row)
  9. k = 1
  10. For r = 1 To UBound(infoarr, 1)
  11.    arr1 = Split(WorksheetFunction.Substitute(infoarr(r, 1), ",", ",") & ",", ",")
  12.    arr2 = Split(WorksheetFunction.Substitute(infoarr(r, 2), ",", ",") & ",", ",")
  13.    arr3 = Split(WorksheetFunction.Substitute(infoarr(r, 3), ",", ",") & ",", ",")
  14.     For a1 = 0 To UBound(arr1)
  15.         If arr1(a1) <> "" Then
  16.             For a2 = 0 To UBound(arr2)
  17.                 If arr2(a2) <> "" Then
  18.                     For a3 = 0 To UBound(arr3)
  19.                         If arr3(a3) <> "" Then
  20.                             ReDim Preserve resultarr(1 To 8, 1 To k)
  21.                                 resultarr(1, k) = arr1(a1)
  22.                                 resultarr(2, k) = arr2(a2)
  23.                                 resultarr(3, k) = arr3(a3)
  24.                                 For c = 4 To 8
  25.                                 resultarr(c, k) = infoarr(r, c)
  26.                                 Next
  27.                             k = k + 1
  28.                         End If
  29.                     Next
  30.                 End If
  31.             Next
  32.         End If
  33.     Next
  34. Next
  35. Sheet2.Cells(2, 1).Resize(UBound(resultarr, 2), 8) = WorksheetFunction.Transpose(resultarr)

  36. MsgBox "OK"

  37. Sheet2.Select

  38. End Sub

复制代码


TA的精华主题

TA的得分主题

发表于 2014-12-25 16:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub a()
Dim arr, brr(1 To 1048575, 1 To 8), i, m As Long, tmp1, tmp2, tmp3, j, k, t As Byte
Cells.Replace ",", ","
arr = [a1].CurrentRegion
For i = 2 To UBound(arr)
    If Right(arr(i, 1), 1) = "," Then arr(i, 1) = Left(arr(i, 1), Len(arr(i, 1)) - 1)
    If Right(arr(i, 2), 1) = "," Then arr(i, 2) = Left(arr(i, 2), Len(arr(i, 2)) - 1)
    If Right(arr(i, 3), 1) = "," Then arr(i, 3) = Left(arr(i, 3), Len(arr(i, 3)) - 1)
    For j = 0 To UBound(Split(arr(i, 1), ","))
        For k = 0 To UBound(Split(arr(i, 2), ","))
            For t = 0 To UBound(Split(arr(i, 3), ","))
                m = m + 1
                tmp1 = Split(arr(i, 1), ",")
                tmp2 = Split(arr(i, 2), ",")
                tmp3 = Split(arr(i, 3), ",")
                brr(m, 1) = tmp1(j)
                brr(m, 2) = tmp2(k)
                brr(m, 3) = tmp3(t)
                brr(m, 4) = arr(i, 4)
                brr(m, 5) = arr(i, 5)
                brr(m, 6) = arr(i, 6)
                brr(m, 7) = arr(i, 7)
                brr(m, 8) = arr(i, 8)
            Next
        Next
    Next
Next
Sheet2.Cells.Clear
Sheet2.[a2].Resize(m, 8) = brr
End Sub

TA的精华主题

TA的得分主题

发表于 2014-12-25 16:35 | 显示全部楼层
测试.zip (17.69 KB, 下载次数: 10) 忘了附件

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-25 21:01 | 显示全部楼层
呃……看起来……嗯……好吧我没看懂。我回去好好研究下,谢谢斑竹大人!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-25 21:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
魂断蓝桥 发表于 2014-12-25 16:34
Sub a()
Dim arr, brr(1 To 1048575, 1 To 8), i, m As Long, tmp1, tmp2, tmp3, j, k, t As Byte
Cells. ...

哦,也谢谢你!我回去仔细看看这些代码是什么意思。非常感谢!有不懂的再来请教

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-26 00:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 peiyun1982 于 2014-12-26 00:32 编辑


实在有点难哦,很多公式百度不到

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-26 00:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
魂断蓝桥 发表于 2014-12-25 16:34
Sub a()
Dim arr, brr(1 To 1048575, 1 To 8), i, m As Long, tmp1, tmp2, tmp3, j, k, t As Byte
Cells. ...

你好,首先再次感谢你的回复。我在测试的过程中发现了几个问题,希望您能帮我解答一下。
1.A列或B列如果缺少数据,则整行就不会在结果中显示。
2.C列如果缺少数据,会提示错误,不能继续运行。
而我希望在任何一列缺少数据的情况下,仍然可以用剩余的列进行排列组合显示结果。
如果这3列都没有数据,那么就直接在结果里显示D到H的信息。


3.现在这个表数据不能太多。我经过测试,最多支持到7000多行。再多的话就会报错。请帮忙看下是什么原因呗。
3.JPG
4.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-26 00:45 | 显示全部楼层
魂断蓝桥 发表于 2014-12-25 16:34
Sub a()
Dim arr, brr(1 To 1048575, 1 To 8), i, m As Long, tmp1, tmp2, tmp3, j, k, t As Byte
Cells. ...

哦对了还有个问题。因为每个表的格式不都一样。所以我举一反三了一下。
如果我的表格有20列,我需要用3,4,5列进行排列组合,我就给改成这样了,测试了一下居然能用。
但是VBA的很多命令在百度里搜索不到,所以我也不知道是什么意思。可不可以帮我解答一下呢?我也好知其所以然。不胜感激
5.JPG

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

本版积分规则

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

GMT+8, 2024-11-17 20:23 , Processed in 0.047361 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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