ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 42921783

[求助] 运费计算

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-5 21:06 | 显示全部楼层
zhaogang1960 发表于 2014-3-5 20:48
请测试附件

目的市唯一作用(有明确指向),在于惠州发惠州用顺丰,如1850行,订单重量6公斤,运费=首重收费8+(重量6-首重1)*续重1KG1+上门服务费0=8+5*1+0=13。

TA的精华主题

TA的得分主题

发表于 2014-3-5 21:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
42921783 发表于 2014-3-5 21:06
目的市唯一作用(有明确指向),在于惠州发惠州用顺丰,如1850行,订单重量6公斤,运费=首重收费8+(重量 ...

先请测试 KCFONG版主的代码,容我想想

TA的精华主题

TA的得分主题

发表于 2014-3-5 21:42 | 显示全部楼层
42921783 发表于 2014-3-5 21:06
目的市唯一作用(有明确指向),在于惠州发惠州用顺丰,如1850行,订单重量6公斤,运费=首重收费8+(重量 ...
  1. Sub Macro1()
  2.     Dim cnn, SQL$, a, arr, brr(), i&, j&, s$, d As Object, ds As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set ds = CreateObject("scripting.dictionary")
  5.     arr = [a1].CurrentRegion
  6.     ReDim brr(2 To UBound(arr), 1 To 1)
  7.     For i = 2 To UBound(arr)
  8.         s = arr(i, 8) & arr(i, 7) & arr(i, 5) & arr(i, 1)
  9.         d(s) = d(s) & "," & i
  10.         s = arr(i, 8) & arr(i, 7) & arr(i, 5) & arr(i, 1) & arr(i, 6)
  11.         ds(s) = ds(s) & "," & i
  12.     Next
  13.     Set cnn = CreateObject("adodb.connection")
  14.     cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ActiveWorkbook.FullName
  15.     SQL = "select a.订单重量,a.订单运费,a.订单编码,a.重量,a.目的省,a.目的市,a.快递公司,a.库房编码,b.首重收费,b.重量,b.首重,b.首重收费,b.续重1KG,b.上门服务费,b.目的市 from [订单$" _
  16.         & [a1].CurrentRegion.Address(0, 0) & "] a left join [运费标准$] b on a.库房编码=b.库房编码 and a.快递公司=b.快递公司  and  a.目的省=b.目的省"
  17.     arr = cnn.Execute(SQL).GetRows
  18.     For i = 0 To UBound(arr, 2)
  19.         If Not IsNull(arr(0, i)) Then
  20.             If Application.Evaluate(arr(0, i) & arr(9, i)) Then
  21.                 If arr(14, i) <> "省内所有" Then
  22.                     a = Split(ds(arr(7, i) & arr(6, i) & arr(4, i) & arr(0, i) & arr(14, i)), ",")
  23.                     For j = 1 To UBound(a)
  24.                         brr(Val(a(j)), 1) = arr(11, i) + (arr(0, i) - arr(10, i)) * arr(12, i) + arr(13, i)
  25.                     Next
  26.                 Else
  27.                     a = Split(d(arr(7, i) & arr(6, i) & arr(4, i) & arr(0, i)), ",")
  28.                     For j = 1 To UBound(a)
  29.                         If brr(Val(a(j)), 1) = "" Then brr(Val(a(j)), 1) = arr(11, i) + (arr(0, i) - arr(10, i)) * arr(12, i) + arr(13, i)
  30.                     Next
  31.                 End If
  32.             End If
  33.         End If
  34.     Next
  35.     [b2].Resize(UBound(brr) - 1) = brr
  36.     cnn.Close
  37.     Set cnn = Nothing
  38. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-3-5 21:43 | 显示全部楼层
请测试附件
运费计算3.rar (120.43 KB, 下载次数: 42)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-6 16:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 42921783 于 2014-3-6 16:31 编辑
zhaogang1960 发表于 2014-3-5 21:42


SQL = "select a.订单重量,a.订单运费,a.订单编码,a.重量,a.目的省,a.目的市,a.快递公司,a.库房编码,b.首重收费,b.重量,b.首重,b.首重收费,b.续重1KG,b.上门服务费,b.目的市 from [订单$" _
        & [a1].CurrentRegion.Address(0, 0) & "] a left join [运费标准$] b on a.库房编码=b.库房编码 and a.快递公司=b.快递公司  and  a.目的省=b.目的省"

A.这2个b.首重收费是否重复可以去掉一个。
B.整个语句未完全理解,可否加些注释以便理解。
C.库房编码、快递公司、目的省这3个条件可以匹配出准确结果,过程未能明白,求指导。

TA的精华主题

TA的得分主题

发表于 2014-3-6 16:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
42921783 发表于 2014-3-6 16:28
SQL = "select a.订单重量,a.订单运费,a.订单编码,a.重量,a.目的省,a.目的市,a.快递公司,a.库房编码,b. ...

写重复了,可以去掉

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-6 16:52 | 显示全部楼层
42921783 发表于 2014-3-6 16:28
SQL = "select a.订单重量,a.订单运费,a.订单编码,a.重量,a.目的省,a.目的市,a.快递公司,a.库房编码,b. ...

你可以去看一下这个帖子http://club.excelhome.net/thread-1061487-3-1.html,第22楼有你第3个问题的解答

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-6 17:48 | 显示全部楼层
zhouxiao 发表于 2014-3-6 16:52
你可以去看一下这个帖子http://club.excelhome.net/thread-1061487-3-1.html,第22楼有你第3个问题的解答

A.3个条件不能唯一确定标准啊,重量不同情况下,可能出现不止一种标准。
B.链接所提供的例子,是按姓名一个条件来匹配性别和部门,类似于VLOOKUP。针对本楼问题,如果用函数LOOKUP匹配,除了这3个条件,重量这个条件是要在公式中体现才能准确得出结果吧。链接例子和相应函数可以理解,现在未能理解的是,不完整的3个条件下,是如何能得出准确结果的呢。

点评

本题目远比想象的复杂,用函数或公式解决可能非常困难  发表于 2014-3-6 18:50

TA的精华主题

TA的得分主题

发表于 2014-3-6 18:40 | 显示全部楼层
本帖最后由 zhaogang1960 于 2014-3-6 18:54 编辑
42921783 发表于 2014-3-6 17:48
A.3个条件不能唯一确定标准啊,重量不同情况下,可能出现不止一种标准。
B.链接所提供的例子,是按姓名一 ...

本题目有5个条件:
目的省        目的市        快递公司        库房编码  订单重量

前4个用来定位行号,是一对多的关系,即相同的条件对应着订单表的多行,有两种情况
不考虑目的市,考虑目的市——通过对应的运费标准表中是否是省内所有来决定用哪一个,且考虑目的市优先
SQL语句先不考虑订单重量,而把所有可能的匹配罗列出来
在众多符合前4个条件的数据中,再用订单重量来判断是否符合条件——If Application.Evaluate(arr(0, i) & arr(9, i)) Then
优先考虑目的市,即有目的市时直接写数据,没有目的市时要先判断改行数据是否已经有数据了,如果有就不再覆盖了



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-6 18:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
去掉那个多余的字段——首重收费:
  1. Sub Macro1()
  2.     Dim cnn, SQL$, a, arr, brr(), i&, j&, s$, d As Object, ds As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set ds = CreateObject("scripting.dictionary")
  5.     arr = [a1].CurrentRegion
  6.     ReDim brr(2 To UBound(arr), 1 To 1)
  7.     For i = 2 To UBound(arr)
  8.         s = arr(i, 8) & arr(i, 7) & arr(i, 5) & arr(i, 1)
  9.         d(s) = d(s) & "," & i
  10.         s = arr(i, 8) & arr(i, 7) & arr(i, 5) & arr(i, 1) & arr(i, 6)
  11.         ds(s) = ds(s) & "," & i
  12.     Next
  13.     Set cnn = CreateObject("adodb.connection")
  14.     cnn.Open "Provider=Microsoft.ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ActiveWorkbook.FullName
  15.     SQL = "select a.订单重量,a.订单运费,a.订单编码,a.重量,a.目的省,a.目的市,a.快递公司,a.库房编码,b.重量,b.首重,b.首重收费,b.续重1KG,b.上门服务费,b.目的市 from [订单$" _
  16.         & [a1].CurrentRegion.Address(0, 0) & "] a left join [运费标准$] b on a.库房编码=b.库房编码 and a.快递公司=b.快递公司  and  a.目的省=b.目的省"
  17.     arr = cnn.Execute(SQL).GetRows
  18.     For i = 0 To UBound(arr, 2)
  19.         If Not IsNull(arr(0, i)) Then
  20.             If Application.Evaluate(arr(0, i) & arr(8, i)) Then
  21.                 If arr(13, i) <> "省内所有" Then
  22.                     a = Split(ds(arr(7, i) & arr(6, i) & arr(4, i) & arr(0, i) & arr(13, i)), ",")
  23.                     For j = 1 To UBound(a)
  24.                         brr(Val(a(j)), 1) = arr(10, i) + (arr(0, i) - arr(9, i)) * arr(11, i) + arr(12, i)
  25.                     Next
  26.                 Else
  27.                     a = Split(d(arr(7, i) & arr(6, i) & arr(4, i) & arr(0, i)), ",")
  28.                     For j = 1 To UBound(a)
  29.                         If brr(Val(a(j)), 1) = "" Then brr(Val(a(j)), 1) = arr(10, i) + (arr(0, i) - arr(9, i)) * arr(11, i) + arr(12, i)
  30.                     Next
  31.                 End If
  32.             End If
  33.         End If
  34.     Next
  35.     [b2].Resize(UBound(brr) - 1) = brr
  36.     cnn.Close
  37.     Set cnn = Nothing
  38. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-17 15:43 , Processed in 0.043083 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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