

'***************************************************'*作 者:liuxiangtao'*发布版本:Ver2.0'*发布日期:2019-07-15 初版作成'*更新日期:2019-07-17 默认起止日期由当前日期改为前一天'*更新日期:2019-07-19 自动去除重复数据'*更新日期:2019-08-01 险种类别为健康险的订单区分长短期'*更新日期:2019-09-10 解决第一行订单数据的处理遗漏问题'**************************************Dim duplicateDataSum As Integer '统计重复数据数量Dim DataSum As Long '统计总订单数Dim Startdate As String, Enddate As StringPublic Const removeReferer As String = "'218.244.x.241','115.29.x.203','112.124.x.48','120.27.x.221'" '排除内部IpFunction OrderMatomo()'异常处理句柄On Error GoTo Err_Handle'每次新查询订单数据,判断"订单统计"和"渠道统计"sheet是否存在的开关Dim flag1 As Boolean, flag2 As BooleanMsgBox ("温馨提示:8:30以后才能统计到前一天的全部数据")Startdate = Form_date.ComboBox1.Value & Form_date.ComboBox2.Value & Form_date.ComboBox3.ValueEnddate = Form_date.ComboBox6.Value & Form_date.ComboBox5.Value & Form_date.ComboBox4.Valueflag1 = Falseflag2 = False'日期有效性检验If Len(Startdate) <> 8 Or Len(Enddate) <> 8 ThenMsgBox ("请输入起止日期!")Exit FunctionEnd IfForm_date.HideMsgBox ("温馨提示:当日期较长,数据量较大时,速度会变慢甚至会卡死," & Chr(10) & "可缩短查询时长或者分批次查询来解决!" & Chr(10) & "如果你对此感到好奇,你可以试试到底多长时间的数据会导致体验极速下降!")'判断是否存在打开的工作簿,0表示不存在If Workbooks.Count = 0 Thenline:'新建一个工作簿,并添加表头Workbooks.AddActiveSheet.Name = "渠道订单详情"Range("A1:Q1").Value = Array("投保日期", "星期", "具体时间", "地点", "来源类型", "推广来源", "推广计划", "推广单元", "推广词", "推广创意", "流量来源", "关键词", "订单号", "收益", "产品编码", "产品名称", "险种类别")'当前存在打开的工作簿ElseFor i = 1 To ActiveWorkbook.Sheets.CountIf Sheets(i).Name = "渠道统计" Thenflag1 = TrueElseIf Sheets(i).Name = "产品统计" Thenflag2 = TrueElseIf Sheets(i).Name = "渠道订单详情" ThenSheets("渠道订单详情").ActivateEnd IfNext iSet thisActiveSheet = ActiveWorkbook.ActiveSheet'判断是否为待生成报表的格式If thisActiveSheet.Cells(1, 1).Value = "投保日期" And thisActiveSheet.Cells(1, 11).Value = "流量来源" And thisActiveSheet.Cells(1, 17).Value = "险种类别" Then'清空以前的内容ActiveWorkbook.Worksheets("渠道订单详情").Range(Cells(2, 1), Cells(50000, 17)).ClearContents'若不是Else'执行前面的代码创建GoTo lineEnd If'每次重新查询新的订单数据,需要把原来的渠道统计和产品统计结果删除If flag1 = True ThenSheets("渠道统计").DeleteEnd IfIf flag2 = True ThenSheets("产品统计").DeleteEnd IfEnd If'关闭屏幕刷新Application.ScreenUpdating = False'定义mysql数据源(需要先在本地安装驱动及创建好数据源)Dim oConn As New ADODB.Connection'连接mysql数据库oConn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=rm-bp179ar5909n2w4qjpx.mysql.rds.aliyuncs.com;PORT=3306;DB=matomo;UID=rept;PWD=Aa$$;OPTION=3;"oConn.Open'判断是否能够正常连接数据库If oConn.State <> 1 ThenSet oConn = NothingMsgBox "数据库联接失败!"Exit FunctionEnd If'定义sql语句变量Dim strSQL As String'初始化strSQL = ""'待执行sql语句 *20190801增加长短健康险区分sqlstrSQL = "SELECT DATE_FORMAT(DATE_ADD(a.server_time,INTERVAL 8 HOUR),'%Y-%m-%d') AS 投保日期,concat('星期',DATE_FORMAT(a.server_time,'%w')) as 星期,DATE_FORMAT(DATE_ADD(a.server_time,INTERVAL 8 HOUR),'%T') AS 具体时间,"strSQL = strSQL & "b.location_city as 城市,(case b.referer_type when '1' then '直入' when '2' then '搜索' when '3' then '网站' when '6' then '推广' else '其它' end) as '来源类型',"strSQL = strSQL & "b.campaign_source AS '推广来源',b.campaign_medium AS '推广计划',b.referer_name AS 推广单元,b.referer_keyword AS 推广词,b.campaign_content AS 推广创意,"strSQL = strSQL & " (case b.referer_type when '6' then '' else b.referer_name end) as 来源名称,(case b.referer_type when '6' then '' else b.referer_keyword end) as 关键词,"strSQL = strSQL & "a.idorder AS 订单号,b.revenue AS 收益,(SELECT NAME FROM ma_log_action WHERE idaction = a.idaction_sku) AS 产品编码,(SELECT NAME FROM ma_log_action WHERE idaction = a.idaction_name) AS 产品名称,"strSQL = strSQL & " case when(SELECT product_category FROM ma_log_action d,ma_product_info f WHERE d.idaction = a.idaction_sku and d.name = f.product_code ) IS null "strSQL = strSQL & " THEN (SELECT c.name FROM ma_log_action c WHERE c.idaction = a.idaction_category) else "strSQL = strSQL & " (SELECT product_category FROM ma_log_action d,ma_product_info f WHERE d.idaction = a.idaction_sku and d.name = f.product_code) end as '险种类别'"strSQL = strSQL & " FROM ma_log_conversion_item a,ma_log_conversion b WHERE a.idorder = b.idorder and "strSQL = strSQL & " DATE_FORMAT(DATE_ADD(a.server_time,INTERVAL 8 HOUR),'%Y%m%d') >='" & Startdate & "' AND DATE_FORMAT(DATE_ADD(a.server_time,INTERVAL 8 HOUR),'%Y%m%d') <='" & Enddate & "'"strSQL = strSQL & " and (b.referer_name is null or b.referer_name not in (" & removeReferer & " ))"strSQL = strSQL & " order by 投保日期,订单号,推广来源"'Cells(1, 10).Value = strSQL'定义数据源执行结果对象Dim rstMain As ADODB.RecordsetSet rstMain = New ADODB.Recordset'执行sql获取结果,adLockOptimistic表示执行过程中,数据可以正常操作rstMain.Open strSQL, oConn, 3, 3'Cells(1, 17).Value = strSQL'显示进度条Call ShowPercent'数据非空判断If rstMain.EOF ThenMsgBox "没有查询到任何数据!"Exit FunctionElse'将查询结果,从A2开始放置到当前的excel中(比一条条的处理效率大幅提升)Range("A2").CopyFromRecordset rstMain'列宽度自动调整Columns("A:E").SelectColumns("A:E").EntireColumn.AutoFitColumns("M:Q").SelectColumns("M:Q").EntireColumn.AutoFitEnd If'关闭数据库连接rstMain.Close: Set rstMain = NothingoConn.Close: Set oConn = Nothing'重复数据处理Call DeleteduplicateData'格式化Call sheetFormate(ActiveSheet, "A", "Q", 1, 50000)'打开屏幕刷新Application.ScreenUpdating = True'焦点定位到文件首Cells(1, 1).Select'完成提醒MsgBox ("好了," & "且已处理" & duplicateDataSum & "条重复数据,谢谢使用")Exit FunctionErr_Handle:MsgBox ("未知错误,请联系工具制作者")End Function'***************************************************************************'功能:去除重复数据行'参数:无'更新 20190802 健康险分长短期;来源网站明显是搜索的归集到搜索渠道'更新 20190802 矫正遗漏的搜索和微信来源订单'更新 20190809 流量分类精准化处理'更新 20190821 解决最后一条订单数据流量分类不处理的问题'更新 20190906 针对第一条数据流量划分不准确的问题处理'***************************************************************************Sub DeleteduplicateData()Dim i As Long, jkFlag As Boolean, SerarchE() As Variant, WeixinOther() As Variant, Zhihu() As VariantduplicateDataSum = 0i = 2jkFlag = False'搜索引擎SerarchE = Array("m.baidu.com", "www.baidu.com", "www.so.com", "m.so.com", "www.sogou.com", "m.sogou.com", "www.google.com", "m.google.com", "yz.m.sm.cn", "m.sm.cn")'微信特征WeixinOther = Array("wechat_session", "wechat_timeline", "wx", "微信")'知乎特征Zhihu = Array("zhhd", "hd", "zhwz", "wz", "zhpl", "pl")'关闭屏幕刷新Application.ScreenUpdating = FalseDo'搜索引擎来源矫正For Each se In SerarchEIf Cells(i, 11).Value = se ThenCells(i, 5) = "SEO"Cells(i, 6) = "网站"End IfNextIf Cells(i, 5).Value = "搜索" ThenCells(i, 5) = "SEO"Cells(i, 6) = "搜索"End If'微信自带特征——推广来源非空For Each wo In WeixinOtherIf Cells(i, 6).Value = wo ThenCells(i, 5) = "微信"End IfNext'微信自带特征——推广来源为微信或推广词末尾为wx或推广单元是wechat_sessionIf LCase(Right(Cells(i, 9).Value, 2)) = "wx" Or Cells(i, 8).Value = "wechat_session" ThenCells(i, 5).Value = "微信"End If'SEM特征——推广单元末尾为pc或ydIf Right(Cells(i, 8).Value, 2) = "pc" Or Right(Cells(i, 8).Value, 2) = "yd" ThenCells(i, 5).Value = "SEM"End If'品专特征——推广词末尾为kxb 或流量来源为sp0.baidu.comIf Right(Cells(i, 9).Value, 3) = "kxb" Or Cells(i, 11).Value = "sp0.baidu.com" Or Cells(i, 11).Value = "bzclk.baidu.com" ThenCells(i, 5).Value = "品专"End If'知乎特征——推广单元为"zhhd", "hd", "zhwz", "wz", "zhpl", "pl" 或流量来源是知乎For Each zh In ZhihuIf Cells(i, 8).Value = zh ThenCells(i, 5) = "知乎"End IfNextIf Cells(i, 11).Value = "知乎" Or Cells(i, 11).Value = "link.zhihu.com" ThenCells(i, 5) = "知乎"End If'新上健康险未入库产品甄选If Cells(i, 17).Value = "健康保险" ThenjkFlag = TrueEnd If'删除重复数据,只留最后一条If Cells(i + 1, 13).Value = Cells(i, 13).Value And Cells(i + 1, 14).Value = Cells(i, 14).Value And Cells(i + 1, 16).Value = Cells(i, 16).Value ThenduplicateDataSum = duplicateDataSum + 1Rows(i & ":" & i).SelectSelection.Delete Shift:=xlUpElsei = i + 1End IfLoop Until Cells(i + 1, 1).Value = ""If jkFlag = True ThenMsgBox ("存在新上的健康险但未入库,无法自动区分长期还是短期,请联系工具制作者!")End IfEnd Sub



文章转载自IT云水客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




