1. 'ClassPlan
  2.  
  3. Public Org As String
  4. Public Des As String
  5. Public FlyNo As String
  6. Public StartDate As Variant
  7. Public TextStartTime As Variant
  8. Public TextEndTime As Variant
  9. Public StartTime As Variant
  10. Public EndTime As Variant
  11. Public EndDate As Variant
  12. Public BackDate As Variant
  13.  
  14. 'mod_GetPlan
  15. Public Sub GetPlan()
  16. If Now() > #6/5/2018# Then Exit Sub
  17. Dim sht As Worksheet
  18. Dim osht As Worksheet
  19. Set osht = ThisWorkbook.Worksheets("TOTAL")
  20. Set sht = ThisWorkbook.Worksheets("Collocation-0")
  21. Dim Origin, Connecting, Destination, TripDate, Stay
  22. With sht
  23. Origin = .Range("D3").Text
  24. Connecting = .Range("F3").Text
  25. Destination = .Range("H3").Text
  26. TripDate = CDate(.Range("J3").Value)
  27. Stay = CLng(.Range("K3").Value)
  28.  
  29. .UsedRange.Offset(15).ClearContents
  30. End With
  31.  
  32. Dim dPlan As Object
  33. Dim dUsed As Object
  34. Dim dBackDate As Object
  35.  
  36. Set dPlan = CreateObject("Scripting.Dictionary")
  37. Set dUsed = CreateObject("Scripting.Dictionary")
  38.  
  39. '记录所有航班信息
  40. Dim Plan As ClassPlan
  41. With osht
  42. EndRow = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
  43. EndCol = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
  44. PlanCount = 0
  45. Set Rng = .Range(.Cells(1, 1), .Cells(EndRow, EndCol))
  46. Arr = Rng.Value
  47. DateIndex = 0
  48. For j = LBound(Arr, 2) + 8 To UBound(Arr, 2)
  49. '获取初始日期
  50. If Arr(2, j) <> "" Then
  51. StartDate = DateAdd("d", DateIndex, CDate(Format(Arr(2, j), "yyyy/mm/dd")))
  52. End If
  53. '获取航班日期
  54. FlyDate = DateAdd("d", DateIndex, StartDate)
  55. DateIndex = DateIndex + 1
  56.  
  57. '逐行检查
  58. For i = LBound(Arr) + 5 To UBound(Arr)
  59. If Arr(i, j) = "Y" Then
  60. PlanCount = PlanCount + 1
  61. Set Plan = New ClassPlan
  62. With Plan
  63. .FlyNo = Arr(i, 3)
  64. .Org = Arr(i, 5)
  65. .Des = Arr(i, 6)
  66. .StartDate = FlyDate
  67. .TextStartTime = Replace(Arr(i, 7), " ", "")
  68. .StartTime = CDate(FlyDate + Arr(i, 7))
  69. If InStr(1, Arr(i, 8), "+1") > 0 Then
  70. et = CDate(Replace(Arr(i, 8), "+1", ""))
  71. .EndTime = CDate(DateAdd("d", 1, FlyDate) + et)
  72. .TextEndTime = Replace(Arr(i, 8), "+1", "")
  73. ElseIf InStr(1, Arr(i, 8), "-1") > 0 Then
  74. et = CDate(Replace(Arr(i, 8), "-1", ""))
  75. .EndTime = CDate(DateAdd("d", -1, FlyDate) + et)
  76. .TextEndTime = Replace(Arr(i, 8), "-1", "")
  77. Else
  78. .EndTime = CDate(FlyDate + CDate(Arr(i, 8)))
  79. .TextEndTime = Arr(i, 8)
  80. End If
  81.  
  82. .EndDate = CDate(Format(.EndTime, "yyyy/mm/dd"))
  83. .BackDate = Format(DateAdd("D", 0, .EndDate), "yyyy/mm/dd")
  84.  
  85. 'If .FlyNo = "S73211" Then Debug.Print "结束时间:"; .EndTime; "返回日期 :"; .BackDate
  86. 'Debug.Print .StartTime; " 抵达日期和时间 "; .EndTime
  87. End With
  88. Set dPlan(CStr(PlanCount)) = Plan
  89. End If
  90. Next i
  91. Next j
  92. End With
  93.  
  94. ' 开始寻找符合条件的航班
  95. '第一层循环 检查出发日期、出发地、中转地是否符合条件
  96. Dim OneGo, GoBefore
  97. Dim OneCnn, GoAfter
  98. Dim OneBack, BackBefore
  99. Dim OneAfter, BackAfter
  100. Dim Index As Long
  101. Dim HeadRow As Long
  102. HeadRow = 15
  103. For Each OneGo In dPlan.keys
  104. If dUsed.exists(OneGo) = False Then
  105. Set GoBefore = dPlan(OneGo)
  106. '若出发日期符合条件
  107. If Abs(DateDiff("d", GoBefore.StartDate, TripDate)) <= 3 Then
  108. '若出发地和中转地符合条件
  109. If GoBefore.Org = Origin And GoBefore.Des = Connecting Then
  110. 'Debug.Print GoBefore.FlyNo
  111. dUsed(OneGo) = ""
  112. '第二层循环 中转地、目的地、检查出发时间是否符合条件
  113. For Each OneCnn In dPlan.keys
  114. If dUsed.exists(OneCnn) = False Then
  115. Set GoAfter = dPlan(OneCnn)
  116. '若中转地和目的地符合条件
  117. If GoAfter.Org = Connecting And GoAfter.Des = Destination Then
  118. '若中转起飞时间符合条件
  119. If DateDiff("h", GoBefore.EndTime, GoAfter.StartTime) > 2 And DateDiff("h", GoBefore.EndTime, GoAfter.StartTime) < 48 Then
  120. dUsed(OneCnn) = ""
  121. 'Debug.Print GoBefore.FlyNo; " "; GoBefore.StartDate; ">>>>"; GoAfter.FlyNo; " "; GoAfter.BackDate
  122.  
  123. Set dBackDate = CreateObject("Scripting.Dictionary")
  124. '保留符合返程条件的出发日期
  125. For off = -3 To 3
  126. bd = Format(DateAdd("d", Stay + off, CDate(GoAfter.BackDate)), "yyyy/mm/dd")
  127. 'Debug.Print "回程日期 "; bd
  128. dBackDate(bd) = ""
  129. Next off
  130.  
  131. '第三层循环返程
  132. For Each OneBack In dPlan.keys
  133. If dUsed.exists(OneBack) = False Then
  134. Set BackBefore = dPlan(OneBack)
  135. '回程日期
  136. bd = Format(BackBefore.StartDate, "yyyy/mm/dd")
  137. '若回程日期符合预设范围
  138. If dBackDate.exists(bd) Then
  139. '如果出发地与中转地相符,记下航班信息
  140. If BackBefore.Org = Destination And BackBefore.Des = Connecting Then
  141. 'Debug.Print "回程航班:"; BackBefore.FlyNo; " "; BackBefore.StartDate
  142. dUsed(OneBack) = ""
  143. '第四层循环 返程中转
  144. For Each OneAfter In dPlan.keys
  145. Set BackAfter = dPlan(OneAfter)
  146. If dUsed.exists(OneAfter) = False Then
  147. '若回程中转出发地和目的地符合条件
  148. If BackAfter.Org = Connecting And BackAfter.Des = Origin Then
  149. '若中转时间符合要求
  150. If DateDiff("h", BackBefore.EndTime, BackAfter.StartTime) > 2 And DateDiff("h", BackBefore.EndTime, BackAfter.StartTime) < 48 Then
  151.  
  152. dUsed(OneAfter) = ""
  153. Index = Index + 1
  154. With sht
  155. Debug.Print "往返完全符合条件的线路" & Index
  156. .Cells(Index + HeadRow, "C").Value = Index
  157. 'GO
  158. .Cells(Index + HeadRow, "D").Value = GoBefore.FlyNo
  159. .Cells(Index + HeadRow, "E").Value = GoBefore.StartDate
  160. .Cells(Index + HeadRow, "F").Value = GoBefore.TextStartTime
  161. .Cells(Index + HeadRow, "G").Value = GoBefore.TextEndTime
  162.  
  163. .Cells(Index + HeadRow, "H").Value = GoAfter.FlyNo
  164. .Cells(Index + HeadRow, "I").Value = GoAfter.StartDate
  165. .Cells(Index + HeadRow, "J").Value = GoAfter.TextStartTime
  166. .Cells(Index + HeadRow, "K").Value = GoAfter.TextEndTime
  167. 'Back
  168. .Cells(Index + HeadRow, "L").Value = BackBefore.FlyNo
  169. .Cells(Index + HeadRow, "M").Value = BackBefore.StartDate
  170. .Cells(Index + HeadRow, "N").Value = BackBefore.TextStartTime
  171. .Cells(Index + HeadRow, "O").Value = BackBefore.TextEndTime
  172.  
  173. .Cells(Index + HeadRow, "P").Value = BackAfter.FlyNo
  174. .Cells(Index + HeadRow, "Q").Value = BackAfter.StartDate
  175. .Cells(Index + HeadRow, "R").Value = BackAfter.TextStartTime
  176. .Cells(Index + HeadRow, "S").Value = BackAfter.TextEndTime
  177.  
  178. End With
  179. End If
  180. End If
  181. End If
  182. Next OneAfter
  183. End If
  184. End If
  185. End If
  186.  
  187. Next OneBack
  188.  
  189. End If
  190. End If
  191. End If
  192. Next OneCnn
  193. End If
  194. End If
  195. End If
  196. Next OneGo
  197.  
  198. Set dUsed = Nothing
  199. Set dPlan = Nothing
  200. Set sht = Nothing
  201. Set osht = Nothing
  202. Set dBackDate = Nothing
  203.  
  204. End Sub

  

20171205xlVBA往返航班组合的更多相关文章

  1. 移动IP 它最初设想每个人都在编写应用层(7)API而不是传输层(4)API 对于QUIC,连接的标识符不是“套接字”(源/目标端口/地址协议组合)的传统概念,而是分配给连接的64位标识符

    小结: 1. 因为您对OSI模型的教育中缺少的一点是,它最初设想每个人都在编写应用层(7)API而不是传输层(4)API.应该有像应用程序服务元素之类的 东西,它们可以以标准方式处理文件传输和消息传递 ...

  2. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  3. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  4. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  5. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  6. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  7. 面向组合子设计Coder

    面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...

  8. Atitit 动态按钮图片背景颜色与文字组合解决方案

    Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...

  9. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

随机推荐

  1. python --- 21 MRO C3算法

    一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时   为   R 1 2 3 4 ...

  2. hihoCoder week227 Longest Subsequence

    题目链接 https://hihocoder.com/contest/hiho227/problem/1 题目详解 https://hihocoder.com/discuss/question/558 ...

  3. R class of subset of matrix and data.frame

    a = matrix(     c(2, 4, 3, 1, 5, 7), # the data elements     nrow=2,              # number of rows   ...

  4. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...

  5. Matconvnet 的一些记录

    Matconvnet 的一些记录 Example code from ADNet: Action-Decision Networks for Visual Tracking with Deep Rei ...

  6. 什么是 Meta Learning / Learning to Learn ?

    Learning to Learn Chelsea Finn    Jul 18, 2017 A key aspect of intelligence is versatility – the cap ...

  7. WebPack填坑笔记

    loader使用时不需要用require引入,在使用plugins(插件)才需要使用require引入 压缩js代码会导致热更新失效 所以开发环境先不要进行压缩 给css加前缀的 postcss-lo ...

  8. C++ getline判断空行

    C++中getline用于逐行读取字符, 格式 getline(字符串,字符数) 将该行“字符数”个的字符读入“字符串” 如何判断所读是否为空行呢? strlen(字符串)==0就是空行

  9. 草珊瑚理解IFC(inline formatting context)

    1. 认识字体font-family 字体渲染的实际高度, 由字体本身的设置(升部ascender,降部descender,大写字母高度Capital Height,小写字母高度X-Height等等) ...

  10. hdu 3094 A tree game 树上sg

    A tree game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...