ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: hyjianjian

[求助] CSV数据按要求“筛选”“分类”与“统计”

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-5 00:57 | 显示全部楼层
蓝桥玄霜 发表于 2015-8-4 09:22
仅实现第一个问题。
请见附件。本附件需要放在实例文件夹里面。

能否根据此VBA帮我修改下

Sub cnn_db()
    Dim arr, brr, crr, drr, err, frr, MyPath$, MyName1$, Sql$, m%, n%, i%, k%, r%
    Dim cnn As Object
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    MyPath = ActiveWorkbook.Path & "\"
    MyName1 = "TxSEIK.CSV"
    MyName2 = "TxSEIK(7月度内示比较).XLS"
    Workbooks.Open Filename:=MyPath & MyName2
    r2 = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
    drr = Range("B2:B" & r2)
    err = Range("H2:J" & r2)
    Set d = CreateObject("scripting.dictionary")    '创建字典
    For j = 1 To r2 - 1
        d.Item(drr(j, 1)) = err(j, 1) & "_" & err(j, 2) & "_" & err(j, 3)    '修改关键字所对应的条目,如果不存在此关键字则自动添加此条目对
    Next
    ActiveWindow.Close True
    Workbooks.Open Filename:=MyPath & MyName1
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & ActiveWorkbook.FullName
    Sql = " select * from [TxSEIK$] where [区分]=""生计"" and [制造担当] like 'S%' and [制造担当] <>""S125"" and [制造担当] <>""S160"" and [制造担当] <>""S172"" order by [制造担当]"
    Workbooks.Add
    Workbooks(MyName1).Worksheets(1).[a1:fi1].Copy ActiveWorkbook.Worksheets(1).[a1]
    ActiveWorkbook.Worksheets(1).[a2].CopyFromRecordset cnn.Execute(Sql)
    ActiveWorkbook.SaveAs Filename:=MyPath & Split(MyName1, ".")(0) & "调整.csv", FileFormat:=xlCSV
    cnn.Close
    Set cnn = Nothing
    Workbooks(MyName1).Close True
   
    '------------第二步的处理过程----------------
    Columns("H:P").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("M:N").NumberFormatLocal = "0.00%"
    Columns("O:P").NumberFormatLocal = "0.0_ "
    arr = Array("收容数", Month(Date) & "月", Month(DateAdd("m", 1, Date)) & "月", _
                "(" & Month(DateAdd("m", -1, Date)) & "月发行)" & Month(Date) & "月", _
                "(" & Month(DateAdd("m", -1, Date)) & "月发行)" & Month(DateAdd("m", 1, Date)) & "月", _
                Month(Date) & "月差异率", Month(DateAdd("m", 1, Date)) & "月差异率", _
                Month(Date) & "月差异箱数", Month(DateAdd("m", 1, Date)) & "月差异箱数")
    Range("H1:P1") = arr
    r = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
    brr = Range("Q1:EH" & r)
    frr = Range("B2:B" & r)
    m = 0
    n = 0
    ReDim crr(2 To r, 1 To 9)
    For k = 1 To UBound(brr, 2)
        If Month(Application.Text(brr(1, k), "0000-00-00")) = Month(Date) Then
            If m = 0 Then
                min1 = k
                m = 1
            Else
                max1 = k
            End If
        ElseIf Month(Application.Text(brr(1, k), "0000-00-00")) = Month(DateAdd("m", 1, Date)) Then
            If n = 0 Then
                min2 = k
                n = 1
            Else
                max2 = k
            End If
        End If
    Next
    For i = 2 To r
        crr(i, 1) = crr(i, 2) = crr(i, 3) = crr(i, 4) = crr(i, 5) = 0
        crr(i, 1) = Split(d(frr(i - 1, 1)), "_")(0)    '2.指定H列第一行名字为:收容数    根据对应的项目编码(B列)去“TxSEIK(7月度内示比较)”套取相应的数据
        crr(i, 4) = Split(d(frr(i - 1, 1)), "_")(1)   '5.指定K列第一行名字为:上月发行(当月的月份) 去TxSEIK(7月度内示比较)  根据项目编码(B列)套取数据{固定I列}
        crr(i, 5) = Split(d(frr(i - 1, 1)), "_")(2)     '6.指定L列第一行名字为:上月发行(下月的月份) 去TxSEIK(7月度内示比较)  根据项目编码(B列)套取数据{固定J列}
        For k = min1 To max1
            crr(i, 2) = crr(i, 2) + brr(i, k)    '3.指定I列第一行名字为:当月的月份(变量)套取本身工作表Q~EH列对应月份的  总量
        Next
        For k = min2 To max2
            crr(i, 3) = crr(i, 3) + brr(i, k)     '4.指定J列第一行名字为:当月的月份+1月      套取本身工作表Q~EH列对应月份的  总量
        Next
        crr(i, 6) = (crr(i, 2) - crr(i, 4)) / crr(i, 4)    '7.指定M列第一行名字为:当月份差异率   =(I8-K8)/K8
        crr(i, 7) = (crr(i, 3) - crr(i, 5)) / crr(i, 5)    '8.指定N列第一行名字为:当月份+1月差异率  =(J8-L8)/L8
        crr(i, 8) = (crr(i, 2) - crr(i, 4)) / crr(i, 1)    '9.指定O列第一行名字为:当月份差异箱数 =(I8-K8)/H8
        crr(i, 9) = (crr(i, 3) - crr(i, 5)) / crr(i, 1)    '10. 指定P列第一行名字为:当月份+1差异箱数 =(J8-L8)/H8
    Next
    Range("H2:P" & r) = crr
    '---------------------------------------------
    ActiveWorkbook.SaveAs Filename:=MyPath & Split(MyName1, ".")(0) & "(" & Month(Date) & "月度内示比较).xls", FileFormat:=xlExcel8
    ActiveWindow.Close True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

http://club.excelhome.net/thread-1221650-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-5 00:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
蓝桥玄霜 发表于 2015-8-4 09:22
仅实现第一个问题。
请见附件。本附件需要放在实例文件夹里面。
  1. Sub cnn_db()
  2.     Dim arr, brr, crr, drr, err, frr, MyPath$, MyName1$, Sql$, m%, n%, i%, k%, r%
  3.     Dim cnn As Object
  4.     On Error Resume Next
  5.     Application.ScreenUpdating = False
  6.     Application.DisplayAlerts = False
  7.     MyPath = ActiveWorkbook.Path & ""
  8.     MyName1 = "TxSEIK.CSV"
  9.     MyName2 = "TxSEIK(7月度内示比较).XLS"
  10.     Workbooks.Open Filename:=MyPath & MyName2
  11.     r2 = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
  12.     drr = Range("B2:B" & r2)
  13.     err = Range("H2:J" & r2)
  14.     Set d = CreateObject("scripting.dictionary")    '创建字典
  15.     For j = 1 To r2 - 1
  16.         d.Item(drr(j, 1)) = err(j, 1) & "_" & err(j, 2) & "_" & err(j, 3)    '修改关键字所对应的条目,如果不存在此关键字则自动添加此条目对
  17.     Next
  18.     ActiveWindow.Close True
  19.     Workbooks.Open Filename:=MyPath & MyName1
  20.     Set cnn = CreateObject("ADODB.Connection")
  21.     cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & ActiveWorkbook.FullName
  22.     Sql = " select * from [TxSEIK$] where [区分]=""生计"" and [制造担当] like 'S%' and [制造担当] <>""S125"" and [制造担当] <>""S160"" and [制造担当] <>""S172"" order by [制造担当]"
  23.     Workbooks.Add
  24.     Workbooks(MyName1).Worksheets(1).[a1:fi1].Copy ActiveWorkbook.Worksheets(1).[a1]
  25.     ActiveWorkbook.Worksheets(1).[a2].CopyFromRecordset cnn.Execute(Sql)
  26.     ActiveWorkbook.SaveAs Filename:=MyPath & Split(MyName1, ".")(0) & "调整.csv", FileFormat:=xlCSV
  27.     cnn.Close
  28.     Set cnn = Nothing
  29.     Workbooks(MyName1).Close True
  30.    
  31.     '------------第二步的处理过程----------------
  32.     Columns("H:P").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
  33.     Columns("M:N").NumberFormatLocal = "0.00%"
  34.     Columns("O:P").NumberFormatLocal = "0.0_ "
  35.     arr = Array("收容数", Month(Date) & "月", Month(DateAdd("m", 1, Date)) & "月", _
  36.                 "(" & Month(DateAdd("m", -1, Date)) & "月发行)" & Month(Date) & "月", _
  37.                 "(" & Month(DateAdd("m", -1, Date)) & "月发行)" & Month(DateAdd("m", 1, Date)) & "月", _
  38.                 Month(Date) & "月差异率", Month(DateAdd("m", 1, Date)) & "月差异率", _
  39.                 Month(Date) & "月差异箱数", Month(DateAdd("m", 1, Date)) & "月差异箱数")
  40.     Range("H1:P1") = arr
  41.     r = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
  42.     brr = Range("Q1:EH" & r)
  43.     frr = Range("B2:B" & r)
  44.     m = 0
  45.     n = 0
  46.     ReDim crr(2 To r, 1 To 9)
  47.     For k = 1 To UBound(brr, 2)
  48.         If Month(Application.Text(brr(1, k), "0000-00-00")) = Month(Date) Then
  49.             If m = 0 Then
  50.                 min1 = k
  51.                 m = 1
  52.             Else
  53.                 max1 = k
  54.             End If
  55.         ElseIf Month(Application.Text(brr(1, k), "0000-00-00")) = Month(DateAdd("m", 1, Date)) Then
  56.             If n = 0 Then
  57.                 min2 = k
  58.                 n = 1
  59.             Else
  60.                 max2 = k
  61.             End If
  62.         End If
  63.     Next
  64.     For i = 2 To r
  65.         crr(i, 1) = crr(i, 2) = crr(i, 3) = crr(i, 4) = crr(i, 5) = 0
  66.         crr(i, 1) = Split(d(frr(i - 1, 1)), "_")(0)    '2.指定H列第一行名字为:收容数    根据对应的项目编码(B列)去“TxSEIK(7月度内示比较)”套取相应的数据
  67.         crr(i, 4) = Split(d(frr(i - 1, 1)), "_")(1)   '5.指定K列第一行名字为:上月发行(当月的月份) 去TxSEIK(7月度内示比较)  根据项目编码(B列)套取数据{固定I列}
  68.         crr(i, 5) = Split(d(frr(i - 1, 1)), "_")(2)     '6.指定L列第一行名字为:上月发行(下月的月份) 去TxSEIK(7月度内示比较)  根据项目编码(B列)套取数据{固定J列}
  69.         For k = min1 To max1
  70.             crr(i, 2) = crr(i, 2) + brr(i, k)    '3.指定I列第一行名字为:当月的月份(变量)套取本身工作表Q~EH列对应月份的  总量
  71.         Next
  72.         For k = min2 To max2
  73.             crr(i, 3) = crr(i, 3) + brr(i, k)     '4.指定J列第一行名字为:当月的月份+1月      套取本身工作表Q~EH列对应月份的  总量
  74.         Next
  75.         crr(i, 6) = (crr(i, 2) - crr(i, 4)) / crr(i, 4)    '7.指定M列第一行名字为:当月份差异率   =(I8-K8)/K8
  76.         crr(i, 7) = (crr(i, 3) - crr(i, 5)) / crr(i, 5)    '8.指定N列第一行名字为:当月份+1月差异率  =(J8-L8)/L8
  77.         crr(i, 8) = (crr(i, 2) - crr(i, 4)) / crr(i, 1)    '9.指定O列第一行名字为:当月份差异箱数 =(I8-K8)/H8
  78.         crr(i, 9) = (crr(i, 3) - crr(i, 5)) / crr(i, 1)    '10. 指定P列第一行名字为:当月份+1差异箱数 =(J8-L8)/H8
  79.     Next
  80.     Range("H2:P" & r) = crr
  81.     '---------------------------------------------
  82.     ActiveWorkbook.SaveAs Filename:=MyPath & Split(MyName1, ".")(0) & "(" & Month(Date) & "月度内示比较).xls", FileFormat:=xlExcel8
  83.     ActiveWindow.Close True
  84.     Application.DisplayAlerts = True
  85.     Application.ScreenUpdating = True
  86. End Sub
复制代码
能否根据此代码帮我修改下   地址http://club.excelhome.net/thread-1221650-1-1.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-23 19:40 , Processed in 0.023999 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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