David
发布于 2018-07-15 / 35 阅读 / 0 评论 / 0 点赞

Microsoft Excel 列转行方法

好久没更新博客,发现这篇文章仅仅只是起了标题,内容啥都没有 尝试在OneNote里找笔记,结果也没有,现在完全忘记当时是怎么做到的,只记得 用数据透视 30秒就能完成 心疼,果然还是“好记性不如烂笔头”,唉~ 那么,现在我是用VBA实现的,下面举个栗子 有时候用户会提出需求说帮我把这些数据导入到系统,但是格式跟数据库结构完全不一样 由于 【体积】【公里】两个都是动态可变的,那么数据库表结构肯定不是 以【0-5】去建立的嘛 改天用户要加一个体积范围,你又得改表结构,程序统统要改,要是改漏了,这锅是背定的 那么为了适应这种需求,数据库是这么设计的 比如,快递小哥跑了6公里,给你送一个4立方米的东西,那么对钱的快递费就是 10块钱 跑6公里,送20立方米,快递费30块 这样用户说要改体积区间或公里区间,只要修改数据,程序仅仅是按实际数据去这里匹配即可 你说分细一点,11-50立方米 要改成 11-20 、21-50 两个区间,不然快递小哥都不愿意接超过 12 立方米的单,毕竟重活能拿30快, 轻活也能拿30块,谁都会选 背景介绍完了,用户给的数据是肯定要转换的,也不能可能一个个手工转换,虽然我是个码农,但是时间也是很宝贵的 按下Alt+F11,弹出VBA编辑界面,双击左边的 “XXXX Excel 对象”下的工作薄 下面是代码,复制粘贴大法
Sub convert()

 Dim source As String
 Dim target As String
 
 source = "Sheet1" ' 这个是数据源的
 
 target = "Sheet2" ' 这个是用来放转换后的
 
  For i = 2 To Worksheets(source).Range("A" & Rows.Count).End(xlUp).Row ' 循环来源表的总行数,第一行包含标题,所以从第2行开始
  
    For k = 2 To 6 '循环列,这里需要 手工改下有多少列就填多少,或者自己百度修改成类似上面的,
    
    
   Dim km, cbm, amount
   
    km = Worksheets(source).Cells(i, 1).Value  '公里范围
 
    cbm = Worksheets(source).Cells(1, k).Value '体积范围
    
    amount = Worksheets(source).Cells(i, k).Value '钱


    Dim nr As Integer
    
    nr = Worksheets(target).Range("A" & Rows.Count).End(xlUp).Row
    If (nr = 0) Then
        nr = 1
    Else
        nr = nr + 1
    End If
    
    Worksheets(target).Rows(nr).Insert '向Sheet2怼入一行 并赋值
    Worksheets(target).Cells(nr, 1).Value = km
    Worksheets(target).Cells(nr, 2).Value = cbm
    Worksheets(target).Cells(nr, 3).Value = amount
     
    Next
 
 Next
End Sub
F5走起,结果就是这样子 再使用Excel 自带的“分列”功能,处理下,当然这步也是可以在VBA里一起做,我就懒得写,有界面点点不好吗? 最后,得到与数据库结构一样的东西,剩下的导入数据库,就不说了,也是界面 点点 感觉这东西好像不叫“列转行”,我也不知道叫什么好 就这样