Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2748|回复: 9

[已解决]引用另一工作表的数据如何分列?

[复制链接]
发表于 2013-3-6 13:07 | 显示全部楼层 |阅读模式
新手求助,希望帮忙解答,万分感谢!
要求:
1、表111中B列数据引用自表222的A列,如何用公式或VBA拆分表111中B列数据(表111中B列显示公式,数据分列功能不能用)。
2、表111中B列数要拆分为如上所示的固定格式,“.”相连的数据最多5个,不足5个拆分时留空(因此它需要占据固定5个位置,不足五个留空),“-”相连的800之类的数据必须放置在客户编码此列,“+”相连的900的数据必须放置在物流编码此列!

最佳答案
2013-3-6 14:09
引用数据固定分列_20130306.rar (19.79 KB, 下载次数: 14)

引用数据固定分列_20130306.rar

21.86 KB, 下载次数: 18

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2013-3-6 13:19 | 显示全部楼层
回复

使用道具 举报

发表于 2013-3-6 13:34 | 显示全部楼层
等CBG2008,zdjh来回贴,
还有那么的帅。
回复

使用道具 举报

发表于 2013-3-6 13:52 | 显示全部楼层
本帖最后由 hwc2ycy 于 2013-3-6 13:54 编辑
  1. Sub 拆分()
  2.     Dim arr, arrTemp, key As String
  3.     Dim i As Long
  4.    
  5.     arr = Range("b3:b" & Cells(Rows.Count, 2).End(xlUp).Row)
  6.     Dim arrResult()
  7.     ReDim arrResult(1 To UBound(arr), 1 To 7)
  8.     For i = LBound(arr) To UBound(arr)
  9.         key = Replace(arr(i, 1), ".", "-")
  10.         key = Replace(key, "+", "-")
  11.         arrTemp = Split(key, "-")

  12.         arrResult(i, 1) = arrTemp(0)

  13.         Select Case UBound(arrTemp)
  14.         Case 1
  15.             arrResult(i, 6) = arrTemp(1)
  16.         Case 2
  17.             arrResult(i, 6) = arrTemp(1)
  18.             arrResult(i, 7) = arrTemp(2)
  19.         Case 3
  20.             arrResult(i, 2) = arrTemp(1)
  21.             arrResult(i, 6) = arrTemp(2)
  22.             arrResult(i, 7) = arrTemp(3)

  23.         Case 4
  24.             arrResult(i, 2) = arrTemp(1)
  25.             arrResult(i, 3) = arrTemp(2)
  26.             arrResult(i, 6) = arrTemp(3)
  27.             arrResult(i, 7) = arrTemp(4)
  28.         Case 5
  29.             arrResult(i, 2) = arrTemp(1)
  30.             arrResult(i, 3) = arrTemp(2)
  31.             arrResult(i, 4) = arrTemp(3)
  32.             arrResult(i, 6) = arrTemp(4)
  33.             arrResult(i, 7) = arrTemp(5)

  34.         Case 6
  35.             arrResult(i, 2) = arrTemp(1)
  36.             arrResult(i, 3) = arrTemp(2)
  37.             arrResult(i, 4) = arrTemp(3)
  38.             arrResult(i, 5) = arrTemp(4)
  39.             arrResult(i, 6) = arrTemp(5)
  40.             arrResult(i, 7) = arrTemp(6)
  41.         End Select
  42.     Next
  43.     Range("c3").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
  44. End Sub
复制代码
回复

使用道具 举报

发表于 2013-3-6 14:06 | 显示全部楼层
  1. Sub 拆分()
  2.     Dim arr, arrTemp, key As String
  3.     Dim i As Long, j As Byte, k As Byte

  4.     If Cells(Rows.Count, 2).End(xlUp).Row < 4 Then Exit Sub

  5.     arr = Range("b3:b" & Cells(Rows.Count, 2).End(xlUp).Row)
  6.     Dim arrResult()
  7.     ReDim arrResult(1 To UBound(arr), 1 To 7)
  8.     Dim arrPos1, arrPos2
  9.     arrPos1 = Array(Array(1, 6), Array(1, 6, 7), Array(1, 2, 6, 7), Array(1, 2, 3, 6, 7), Array(1, 2, 3, 4, 6, 7), Array(1, 2, 3, 4, 5, 6, 7))
  10.     arrPos2 = Array(Array(0, 1), Array(0, 1, 2), Array(0, 1, 2, 3), Array(0, 1, 2, 3, 4), Array(0, 1, 2, 3, 4, 5), Array(0, 1, 2, 3, 4, 5, 6))
  11.    
  12.     For i = LBound(arr) To UBound(arr)
  13.         key = Replace(arr(i, 1), ".", "-")
  14.         key = Replace(key, "+", "-")
  15.         arrTemp = Split(key, "-")
  16.         
  17.         j = UBound(arrTemp) - 1
  18.         For k = LBound(arrPos1(j)) To UBound(arrPos1(j))
  19.             arrResult(i, arrPos1(j)(k)) = arrTemp(arrPos2(j)(k))
  20.         Next
  21.     Next
  22.     Range("c3").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2013-3-6 14:09 | 显示全部楼层    本楼为最佳答案   
引用数据固定分列_20130306.rar (19.79 KB, 下载次数: 14)
回复

使用道具 举报

发表于 2013-3-6 14:12 | 显示全部楼层
  1. Sub 拆分()
  2. '---------------------------------------------------------------------------------------
  3. ' Procedure : 拆分
  4. ' Author    : hwc2ycy
  5. ' Date      : 2013/3/6
  6. ' Purpose   : 数组嵌套+坐标对应
  7. '---------------------------------------------------------------------------------------
  8. '
  9.     Dim arr, arrTemp, key As String
  10.     Dim i As Long, j As Byte, k As Byte

  11.     '防止没有任何数据行
  12.     If Cells(Rows.Count, 2).End(xlUp).Row < 4 Then Exit Sub

  13.     '取源数据
  14.     arr = Range("b3:c" & Cells(Rows.Count, 2).End(xlUp).Row)
  15.    
  16.     '结果数组
  17.     Dim arrResult()
  18.     ReDim arrResult(1 To UBound(arr), 1 To 7)
  19.    
  20.     '对应的坐标位置
  21.     'arrPos1是结果的列坐标
  22.     'arrPos2是源数组的列坐标
  23.     Dim arrPos1, arrPos2
  24.     arrPos1 = Array(Array(1, 6), Array(1, 6, 7), Array(1, 2, 6, 7), Array(1, 2, 3, 6, 7), Array(1, 2, 3, 4, 6, 7), Array(1, 2, 3, 4, 5, 6, 7))
  25.     arrPos2 = Array(Array(0, 1), Array(0, 1, 2), Array(0, 1, 2, 3), Array(0, 1, 2, 3, 4), Array(0, 1, 2, 3, 4, 5), Array(0, 1, 2, 3, 4, 5, 6))
  26.    
  27.     '遍历数组
  28.     For i = LBound(arr) To UBound(arr)
  29.         '替换,+
  30.         key = Replace(arr(i, 1), ".", "-")
  31.         key = Replace(key, "+", "-")
  32.         '防止没有合乎要求的数据
  33.         If arrTemp Like "*-*" Then
  34.             arrTemp = Split(key, "-")
  35.             j = UBound(arrTemp) - 1
  36.             '按坐标对应关系写入数组,用了数组嵌套
  37.             For k = LBound(arrPos1(j)) To UBound(arrPos1(j))
  38.                 arrResult(i, arrPos1(j)(k)) = arrTemp(arrPos2(j)(k))
  39.             Next
  40.         End If
  41.         
  42.     Next
  43.     '结果写回单元格
  44.     Range("c3").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
  45.     MsgBox "整理完成"
  46. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-3-6 15:24 | 显示全部楼层
cbg2008 发表于 2013-3-6 14:09

非常感谢,公式很好用。数据拆分后位置定位很好,-800数据没有的话+900类的数据依然在固定位置出现。感谢...
回复

使用道具 举报

发表于 2013-3-6 21:04 | 显示全部楼层
替楼主评了。
希望楼主下次自己学习评最佳
回复

使用道具 举报

 楼主| 发表于 2013-3-12 17:01 | 显示全部楼层
看到如何选评最佳了
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-21 09:30 , Processed in 0.295164 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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