分享

【习题】一维表转二维表

 L罗乐 2016-09-09

 今天来看看梁总出的练习题哈


转换成下面的二维表效果图(要求:必须要跟效果表一致)


 

==我是分隔线,www.vbafans.com==

方法1:

小子大神Python:

import xlrd
import xlwt
s = set()
d = {}
a = 0
rs = 0
cs =0
f = xlwt.Workbook()
st = f.add_sheet(r'newcity',cell_overwrite_ok=True)
wb = xlrd.open_workbook(r'E:\excel\city.xlsm')
sh = wb.sheets()[0]
for i in range(1,sh.nrows):
    d[sh.cell_value(i,1) sh.cell_value(i,0)]=sh.cell_value(i,2)
    d[sh.cell_value(i,0) sh.cell_value(i,1)]=sh.cell_value(i,2)
    s.add(sh.cell_value(i,1))
    s.add(sh.cell_value(i,0))   
for r in s:
    rs = 1
    cs =0
    for c in s:
        cs =1

        if r c in d:
            st.write(cs,rs,d[r c])
        else:
            st.write(cs,rs,0)
    st.write(rs,0,r)
    st.write(0,rs,r)
print(d)
print(s)

f.save(r'E:\\excel\\citys.xls')


 

==我是分隔线,www.vbafans.com==

方法2:

诗人:

Sub cdsr()
    Dim arr, brr(), d As Object, d1 As Object, i&, s, j&
    arr = Sheet6.[a1].CurrentRegion
    Set d = CreateObject('scripting.dictionary')
    Set d1 = CreateObject('scripting.dictionary')
    For i = 2 To UBound(arr)
        d(arr(i, 1)) = ''
        d(arr(i, 2)) = ''
        d1(arr(i, 1) & arr(i, 2)) = arr(i, 3)
    Next
    s = d.keys
    ReDim brr(1 To d.Count 1, 1 To d.Count 1)
    For i = 2 To UBound(brr)
        brr(i, 1) = s(i - 2)
        brr(1, i) = s(i - 2)
    Next
    For i = 2 To UBound(brr)
        For j = 2 To UBound(brr, 2)
            brr(i, j) = d1(brr(i, 1) & brr(1, j))
            If brr(i, j) = '' Then
                brr(i, j) = d1(brr(1, j) & brr(i, 1))
            End If
        Next
    Next
    Sheet7.Cells.ClearContents
    Sheet7.[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub


 

==我是分隔线,www.vbafans.com==

方法3:

李长老:

Sub lzl()
Dim d, d1, arr, i, a, n%
Set d = CreateObject('scripting.dictionary')
Set d1 = CreateObject('scripting.dictionary')
arr = Range('a2:c' & Cells(Rows.Count, 1).End(3).Row)
For i = 1 To UBound(arr)
    d(arr(i, 1)) = ''
    d1(arr(i, 1) & '-' & arr(i, 2)) = arr(i, 3)
    d1(arr(i, 2) & '-' & arr(i, 1)) = arr(i, 3)
Next
For i = 1 To UBound(arr)
    d(arr(i, 2)) = ''
Next
Dim brr(1 To 100, 1 To 100)
n = 1
For Each a In d.keys
    n = n 1
    brr(n, 1) = a
    brr(1, n) = a
Next
For i = 2 To d.Count 1
    For n = 2 To d.Count 1
        If i = n Then
            brr(i, n) = 0
        ElseIf d1.Exists(brr(i, 1) & '-' & brr(1, n)) Then
            brr(i, n) = d1(brr(i, 1) & '-' & brr(1, n))
        ElseIf d1.Exists(brr(1, n) & '-' & brr(i, 1)) Then
            brr(i, n) = d1(brr(1, n) & '-' & brr(i, 1))
        Else
            brr(i, n) = ''
        End If
    Next
Next
Sheets('Matrix').Range('a1').Resize(d.Count 1, d.Count 1) = brr
End Sub


 

==我是分隔线,www.vbafans.com==

方法4:

bajifeng:

Sub b()    'bajifeng
Set d = CreateObject('Scripting.Dictionary')
ar = [a2].Resize([a65536].End(3).Row - 1, 3)
For i = 1 To UBound(ar)
    d(ar(i, 1)) = ''
Next
For i = 1 To UBound(ar)
    d(ar(i, 2)) = ''
Next
n = d.Count
ReDim br(1 To n 1, 1 To n 1)
For i = 1 To n
    br(i 1, 1) = d.keys()(i - 1)
    br(1, i 1) = d.keys()(i - 1)
Next
For i = 1 To UBound(ar)
    For ib = 1 To n 1
        For jb = 1 To n 1
            If ar(i, 1) & ar(i, 2) = br(ib, 1) & br(1, jb) Then br(ib, jb) = ar(i, 3): GoTo 100
        Next
    Next
100:
Next
Sheets(3).Cells.Clear
Sheets(3).[a1].Resize(n 1, n 1) = br
End Sub


 

==我是分隔线,www.vbafans.com==

方法5:

龙神:

Sub transform()
    Dim conn As Object
    Dim rst As Object
    Dim sql As String, i As Long
    Set conn = CreateObject('adodb.connection')
    Set rst = CreateObject('adodb.recordset')
    conn.Open 'dsn=excel files;dbq=' & ThisWorkbook.FullName
   
    Dim sort_array
    sort_array = Array('上海', '乌鲁木齐', '兰州', '北京', '南京', '南宁', '南昌', '台北', '合肥', '呼和浩特', '哈尔滨', '天津', '太原', '广州', '成都', '拉萨', '昆明', '杭州', '武汉', '沈阳', '济南', '澳门', '石家庄', '福州', '西宁', '西安', '贵阳', '郑州', '重庆', '银川', '长春', '长沙', '香港')
   
    sql = 'transform sum([Dist (km)]) select [City 2] as ['] from '
    sql = sql & ' (select * from [City Distance$] union select [City 2],[City 1],[Dist (km)] from [City Distance$] union all select a,a,0 from (select [City 1] as a from [City Distance$] union select [City 2] from [City Distance$])) u_city '
    sql = sql & 'group by [City 2],instr('' & Join(sort_array, ',') & '',[City 2]) '
    sql = sql & ' order by instr('' & Join(sort_array, ',') & '',[City 2])'
    sql = sql & ' pivot [City 1] in (' & Join(sort_array, ',') & ')'
   
    rst.Open sql, conn, 3, 3
    With Sheets('Matrix')
        .Cells.Clear
        For i = 0 To rst.Fields.Count - 1
            .Range('A1').Offset(0, i) = rst.Fields(i).Name
        Next
        .Range('A2').CopyFromRecordset rst
    End With
   
    rst.Close
    Set rst = Nothing
    conn.Close
    Set conn = Nothing
End Sub

==我是分隔线,www.vbafans.com==

方法6:

春心:

Sub Greenhand()
    Dim arr, i&, j&, k%
    Set d = CreateObject('scripting.dictionary')
    arr = Range(Sheets('City Distance').Cells(2, 1), Sheets('City Distance').Cells(2, 3).End(4))
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = ''
        d(arr(i, 2)) = ''
    Next
    Sheets('Matrix').[A2].Resize(d.Count, 1) = Application.Transpose(d.keys)
    Sheets('Matrix').[B1].Resize(1, d.Count) = Application.Transpose(Application.Transpose(d.keys))
    For i = 1 To UBound(arr)
        For k = 2 To d.Count 1
            For j = 2 To d.Count 1
                If arr(i, 1) = Sheets('Matrix').Cells(k, 1) And arr(i, 2) = Sheets('Matrix').Cells(1, j) _
                    Or arr(i, 1) = Sheets('Matrix').Cells(1, j) And arr(i, 2) = Sheets('Matrix').Cells(k, 1) Then
                    Sheets('Matrix').Cells(k, j) = arr(i, 3)
                End If
           Next
        Next
    Next
End Sub


 

==我是分隔线,www.vbafans.com==

方法7:

随心:

Sub test() '随心
Dim brr()
Sheets('效果表1').UsedRange.ClearContents
Set d = CreateObject('scripting.dictionary')
arr = Range('a1').CurrentRegion
For j = 1 To 2
    For i = 2 To UBound(arr)
            d(arr(i, j)) = ''
    Next
Next
n = 1: m = 1
d_1 = d.keys
For i1 = 0 To UBound(d_1)
    n = n 1
    ReDim Preserve brr(1 To UBound(d_1) 2, 1 To n)
    brr(1, n) = d_1(i1)
    For i2 = 0 To UBound(d_1)
        m = m 1
        brr(m, 1) = d_1(i2)
        For i3 = 1 To UBound(arr)
            If arr(i3, 1) = d_1(i1) And arr(i3, 2) = d_1(i2) Then
                brr(m, n) = arr(i3, 3)
                Exit For
            ElseIf arr(i3, 1) = d_1(i2) And arr(i3, 2) = d_1(i1) Then
                brr(m, n) = arr(i3, 3)
                Exit For
            Else
                brr(m, n) = 0
            End If
        Next
    Next
    m = 1
Next
Sheets('效果表1').[a1].Resize(UBound(brr, 2), UBound(brr)) = brr
End Sub

==我是分隔线,www.vbafans.com==

方法8:

随心Python:

import pandas as pd
import collections
import xlwt
newdata=xlwt.Workbook()
sheet2=newdata.add_sheet('sheet1',cell_overwrite_ok=True)
dic_1=collections.OrderedDict()
data=pd.read_excel('E:\\test\\一维.xlsx')
#data1=data[['City 1','City 2','Dist (km)']]
for line in data.index:
    dic_1[data.loc[line,'City 1']]=''
    dic_1[data.loc[line,'City 2']]=''
dkey=dic_1.keys()
list_1=[]
list_2=[]
list_3=[]
n=0
m=0
for line1 in dkey:
    n =1
    sheet2.write(n,0,line1)
    for line2 in dkey:
        m =1
        sheet2.write(0,m,line2)
        for line in data.index:
            if line1==data.loc[line,'City 1'] and line2==data.loc[line,'City 2']:
                sheet2.write(n,m,str(data.loc[line,'Dist (km)']))
                break
            elif line1==data.loc[line,'City 2'] and  line2==data.loc[line,'City 1']:
                sheet2.write(n, m, str(data.loc[line, 'Dist (km)']))
                break
            else:
                sheet2.write(n,m,0)
    m=0
newdata.save('E:\\test\\结果.xls')


 

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

    0条评论

    发表

    请遵守用户 评论公约