分享

【习题】拆分单元格的行&众神各显神通

 L罗乐 2016-09-08

具体见附件了。有兴趣的可以练下。


 

支持一下龙神


 -----------------我是分隔线---------

方法1:

Sub test() '随心
Dim brr()
arr = Range('a2:c' & Cells(Rows.Count, 1).End(xlUp).Row)
For i = 1 To UBound(arr)
    For j = 1 To arr(i, 3)
        n = n 1
        ReDim Preserve brr(1 To 3, 1 To n)
        brr(1, n) = arr(i, 1)
        brr(2, n) = arr(i, 2)
        brr(3, n) = 1
    Next
Next
Sheets('sheet2').[a1].Resize(UBound(brr, 2), UBound(brr)) = Application.Transpose(brr)
End Sub


 -----------------我是分隔线---------

方法2:

长老:

Sub lzl()
Dim arr, t1, t2, i, j
Dim brr()
arr = Sheets('sheet1').Range('a2:c' & Sheets('sheet1').Cells(Rows.Count, 1).End(3).Row)
For i = 1 To UBound(arr)
    t1 = t2 1
    t2 = t1 arr(i, 3) - 1
    ReDim Preserve brr(1 To 3, 1 To t2)
    For j = t1 To t2
        brr(1, j) = arr(i, 1)
        brr(2, j) = arr(i, 2)
        brr(3, j) = 1
    Next
Next
Sheets('sheet2').Range('a1:c1') = Array('产品编号', '名称', '数量')
Sheets('sheet2').Range('a2').Resize(t2, 3) = Application.Transpose(brr)
End Sub


-----------------我是分隔线---------

方法3:

 

小子大神的python:

import xlrd
import xlwt
rw = 0
wb = xlrd.open_workbook(r'E:\cfsz.xlsx')
sh = wb.sheet_by_name('Sheet1')
f = xlwt.Workbook()
st = f.add_sheet(r'sheet1',cell_overwrite_ok=True)
st.write(0,0,sh.cell(0,0).value)
st.write(0,1,sh.cell(0,1).value)
st.write(0,2,sh.cell(0,2).value)
for i in range(1,sh.nrows):
    x = int(sh.cell(i,2).value)
    for t in range(0,x):
        rw = 1
        st.write(rw,0,sh.cell(i,0).value)
        st.write(rw,1,sh.cell(i,1).value)
        st.write(rw,2,1)
f.save(r'E:\sjcfl.xls')


 -----------------我是分隔线---------

方法4:

春心的洪荒之力:

Sub Greenhand()
    Dim arr, brr(1 To 100000, 1 To 3), i&, k&
    With Sheet2
        .Cells.Clear
        .Columns('a:b').NumberFormat = '@'
        .Range('a1:c1') = Array('产品编号', '名称', '数量')
    End With
    arr = Sheet1.Range('a2', Sheet1.Cells(2, 3).End(4))
    For i = 1 To UBound(arr)
        For j = 1 To arr(i, 3)
            k = k 1
            brr(k, 1) = arr(i, 1)
            brr(k, 2) = arr(i, 2)
            brr(k, 3) = 1
        Next
    Next
    Sheet2.[a2].Resize(k, 3) = brr
End Sub


 

-----------------我是分隔线---------

方法5:

龙神自己的:

Sub split_num()
    Dim raw, i As Long, j As Long, cnt As Long
    With Sheets('Sheet1')
        '将数据源存入raw数组
        raw = .Range('A1').CurrentRegion.Value
        '定义结果数组大小。根据拆分特点,数组第一维ubound为第三列求和 1(列标题)
        ReDim result(1 To Application.Sum(.Columns(3)) 1, 1 To UBound(raw, 2))
    End With
    For i = 1 To UBound(raw)
        If i > 1 Then
            '根据raw(i,3)拆分各行
            For j = 1 To raw(i, 3)
                cnt = cnt 1
                result(cnt, 1) = raw(i, 1)
                result(cnt, 2) = raw(i, 2)
                result(cnt, 3) = 1
            Next
        Else
            '列标题写入
            For j = 1 To UBound(raw, 2)
                cnt = 1
                result(cnt, j) = raw(i, j)
            Next
        End If
    Next
    '写入单元格
    Application.ScreenUpdating = False
    With Sheets('Sheet2')
        .Cells.Clear
        .Range('A1').Resize(UBound(result), UBound(result, 2)) = result
'        With .Range('A1').CurrentRegion
'            .Font.Name = '微软雅黑'
'            .Font.Size = 9
'            .Borders.LineStyle = 1
'        End With
    End With
    Application.ScreenUpdating = True
End Sub


 

-----------------我是分隔线---------

方法6:

七七的PQ:

let
    S1 = Excel.CurrentWorkbook(){[Name='Data']}[Content],
    S2 = Table.AddColumn(S1, 'List', each List.Transform({1..[数量]},(_)=>_/_)),
    S3 = Table.ExpandListColumn(S2, 'List'),
    S4 = Table.RemoveColumns(S3,{'数量'}),
    S5 = Table.RenameColumns(S4,{{'List', '数量'}})
in
    S5



 -----------------我是分隔线---------

方法7:

诗人的:

Sub cdsr()
    Dim arr, i&, k&, m&, brr(1 To 100000, 1 To 3)
    arr = Sheet1.[a1].CurrentRegion
    brr(1, 1) = '产品编号': brr(1, 2) = '名称': brr(1, 3) = '数量'
    k = 1
    For i = 2 To UBound(arr)
        For m = 1 To arr(i, 3)
            k = k 1
            brr(k, 1) = Str(arr(i, 1))
            brr(k, 2) = arr(i, 2)
            brr(k, 3) = 1
        Next
    Next
    Sheet2.Cells.ClearContents
    Sheet2.[a1].Resize(k, 3) = brr
End Sub

 -----------------我是分隔线---------

方法8:

bajifeng的:

Sub b() 'bajifeng
Dim br(), ar, i&, j%, u&
ar = [a1].CurrentRegion
For i = 2 To UBound(ar)
    If i = 2 Then u = 0 Else u = UBound(br)
    ReDim Preserve br(1 To 3, 1 To u ar(i, 3))
    For j = 1 To ar(i, 3)
        br(1, u j) = ''' & ar(i, 1)
        br(2, u j) = ar(i, 2)
        br(3, u j) = 1
    Next
Next
Sheets(2).[a2].Resize([a65536].End(3).Row, 3).Clear
Sheets(2).[a2].Resize(UBound(br, 2), 3) = Application.Transpose(br)
End Sub


 -----------------我是分隔线---------

方法9:

随心的python:

import pandas as pd
import csv
data=pd.read_excel('e:\\test\\拆分数字.xlsx')
data1=data[['产品编号','名称','数量']]
tuple_1=()
list_1=[]
for line in data1.index:
    time=data1.loc[line,'数量']
    for i in range(1,int(time) 1):
        tuple_1=(data1.loc[line,'产品编号'],data1.loc[line,'名称'],1)
        list_1.append(tuple_1)
with open('E:\\test\\拆分数字.csv','w', newline='') as datacsv:
    csvwriter = csv.writer(datacsv,dialect=('excel'))
    csvwriter.writerow(['产品编号','名称','数量'])
    csvwriter.writerows(list_1)


 -----------------我是分隔线---------

方法10:

梁总的:

Sub text()
Dim arr, brr, item As Long, crr(), i As Long, j As Long, k As Long
Dim tim1 As Date, tim2 As Date: tim1 = Timer
Application.ScreenUpdating = False

  With Worksheets('Sheet1')
    arr = .Range('a2:c' & .Cells(.Rows.Count, 3).End(xlUp).Row)
    brr = .Range('c2:c' & .Cells(.Rows.Count, 3).End(xlUp).Row)
  End With
 
  item = WorksheetFunction.Sum(brr)
 
If item > Rows.Count Then Exit Sub

ReDim crr(1 To item, 1 To 3)

For i = 1 To UBound(brr)
    For j = 1 To brr(i, 1)
        k = k 1
        crr(k, 1) = arr(i, 1)
        crr(k, 2) = arr(i, 2)
        crr(k, 3) = 1
    Next
Next

 With Worksheets('Sheet3')
     .Range('A1:C1') = Array('产品编号', '名称', '数量')
     .Range('A2').Resize(item, 3) = crr
 
 End With
Application.ScreenUpdating = True

 
  tim2 = Timer
  MsgBox Format(tim2 - tim1, '程序执行时间为:0.00秒'), 64, '时间统计'
End Sub


 

原贴链接:http://www./bbs/forum.php?mod=viewthread&tid=444

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多