首页 > 编程知识 正文

Excel数据分析及VBA应用,VBA数据处理

时间:2023-05-06 14:24:04 阅读:205449 作者:4145

每个月初公司都会总结上个月的销售明细。店铺传过来的数据都会以下表的形式从销售系统中的报表导出Excel表。如果有缺失数据的,再由店铺传过来,由人工填补到表一里。数据补全后,需要以表二的数据整理一下再导回到销售系统里。通过手工复制粘贴做了好长一段时间,觉得太麻烦了。通长都会有上百家店铺的数据需要补全,这个工作量也不小了。后来想了想通过VBA来完成这个简单却又枯燥废时的工作。

思路是这样的:首先,在所有列之前插入一列用于填充店铺编码;其次,按照店铺的数据列数把日期块复制出相应的数量依次粘贴到下面的行里;再次,将数据依次复制到下面的行里;然后,把店铺编码依次填充到第一列里;最后,删除第三列往后的列和前三行以及无数据的行,最终达到表二的形式。

具体代码在表二之后。

表一:

店铺编码2001200220032004店铺名称ABCD回传次数151515152008-9-1abcd2008-9-2abcd2008-9-3abcd2008-9-4abcd2008-9-5abcd2008-9-6abcd2008-9-7abcd2008-9-8abcd2008-9-9abcd2008-9-10abcd2008-9-11abcd2008-9-12abcd2008-9-13abcd2008-9-14abcd2008-9-15abcd

表二:

20012008-9-1a20012008-9-2a20012008-9-3a………20022008-9-1b20022008-9-2b20022008-9-3b………20032008-9-1c20032008-9-2c20032008-9-3c………20042008-9-1d20042008-9-2d20042008-9-3d………

    VBA代码:

    Sub CopyData()
    Dim DateNum As Integer
    Dim ColNum As Integer
    Dim DateRange As Range
    Dim StartRow As Integer
    Dim EndRow As Integer
    Dim PasteCell As Range
   
    Application.ScreenUpdating = False
   
    '在A列前插入一列用于输入店铺编码
    Columns("A:A").Select
    Selection.Insert Shift:=xlToRight
   
    DateNum = InputBox("请输入销售日期天数")    '获得销售日期天数,即需要复制日期的行数
    ColNum = InputBox("请输入数据列数量")       '获得数据列数量,即需要将日期复制的次数
    StartRow = 4                                '定义开始行数
    EndRow = DateNum + StartRow - 1             '计算结束行数
  
    '按数据列数量,复制日期列
    Dim i As Integer
    For i = 1 To ColNum - 1
        Range(Cells(4, 2), Cells(EndRow, 2)).Select
        Selection.Copy
        Cells(StartRow + DateNum * i, 2).Select
        ActiveSheet.Paste
        Range("B4").Select
    Next i
   
    Range("D4").Select
   
    '复制数据列
    Dim k As Integer
    For k = 1 To ColNum - 1
        Range(Cells(4, 3 + k), Cells(EndRow, 3 + k)).Select
        Selection.Copy
        Cells(StartRow + DateNum * k, 3).Select
        ActiveSheet.Paste
        Range("C4").Select
    Next k
   
    '复制店铺编码
    Dim j As Integer
    Dim ShopNum As String
   
    For j = 1 To ColNum
        ShopNum = Cells(1, j + 2)
        Range(Cells(StartRow + DateNum * (j - 1), 1), Cells(StartRow + DateNum * j - 1, 1)) = ShopNum
        Range("B4").Select
    Next j
   
    '删除旧表头(前三行)
    Rows("1:3").Select
    Selection.Delete Shift:=xlUp
   
    '删除残留数据列
    Range("A1").Select
    Columns("D:IV").Select
    Selection.Delete Shift:=xlToLeft
   
    '删除无数据行
    Dim m As Integer
    Dim n As Integer
     Dim MaxRow As Integer

     MaxRow = DateNum * ColNum
    n = 1

    For m = 1 To MaxRow
        If Cells(n, 3) = "" Then
            Rows(n).Delete
            n = n - 1
            MaxRow = MaxRow - 1
        End If
        n = n + 1
    Next m
    '由于导入数据需要复制到特定的Excel(Menu)表里,所以这里多了一些语句是处理这一操作的
    '复制数据块
    Range(Cells(1, 1), Cells(MaxRow, 3)).Select
    Selection.Copy
   
    '切换到Menu工作簿,店铺销售工作表
    Application.Workbooks("Menu.xls").Activate
    Worksheets("店铺销售").Select
   
    '将销售数据选择性粘贴到工作表里,并保存Menu工作簿
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    '格式化日期列,因为选择性粘贴后,日期列变成了数字
    Columns("B:B").Select
    Selection.NumberFormatLocal = "yyyy-m-d"
   
    ActiveWorkbook.Save
   
    Application.ScreenUpdating = True
End Sub

以上代码各个部分相对来说比较独立,涉及的都是Excel表里比较简单的操作,如:复制,粘贴,删除行列,bldbb格式化和选定bldbb、行、列以及工作表、工作薄,理解起来比较容易。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。