'ClassPlan

Public Org As String
Public Des As String
Public FlyNo As String
Public StartDate As Variant
Public TextStartTime As Variant
Public TextEndTime As Variant
Public StartTime As Variant
Public EndTime As Variant
Public EndDate As Variant
Public BackDate As Variant 'mod_GetPlan
Public Sub GetPlan()
If Now() > #6/5/2018# Then Exit Sub
Dim sht As Worksheet
Dim osht As Worksheet
Set osht = ThisWorkbook.Worksheets("TOTAL")
Set sht = ThisWorkbook.Worksheets("Collocation-0")
Dim Origin, Connecting, Destination, TripDate, Stay
With sht
Origin = .Range("D3").Text
Connecting = .Range("F3").Text
Destination = .Range("H3").Text
TripDate = CDate(.Range("J3").Value)
Stay = CLng(.Range("K3").Value) .UsedRange.Offset(15).ClearContents
End With Dim dPlan As Object
Dim dUsed As Object
Dim dBackDate As Object Set dPlan = CreateObject("Scripting.Dictionary")
Set dUsed = CreateObject("Scripting.Dictionary") '记录所有航班信息
Dim Plan As ClassPlan
With osht
EndRow = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
EndCol = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
PlanCount = 0
Set Rng = .Range(.Cells(1, 1), .Cells(EndRow, EndCol))
Arr = Rng.Value
DateIndex = 0
For j = LBound(Arr, 2) + 8 To UBound(Arr, 2)
'获取初始日期
If Arr(2, j) <> "" Then
StartDate = DateAdd("d", DateIndex, CDate(Format(Arr(2, j), "yyyy/mm/dd")))
End If
'获取航班日期
FlyDate = DateAdd("d", DateIndex, StartDate)
DateIndex = DateIndex + 1 '逐行检查
For i = LBound(Arr) + 5 To UBound(Arr)
If Arr(i, j) = "Y" Then
PlanCount = PlanCount + 1
Set Plan = New ClassPlan
With Plan
.FlyNo = Arr(i, 3)
.Org = Arr(i, 5)
.Des = Arr(i, 6)
.StartDate = FlyDate
.TextStartTime = Replace(Arr(i, 7), " ", "")
.StartTime = CDate(FlyDate + Arr(i, 7))
If InStr(1, Arr(i, 8), "+1") > 0 Then
et = CDate(Replace(Arr(i, 8), "+1", ""))
.EndTime = CDate(DateAdd("d", 1, FlyDate) + et)
.TextEndTime = Replace(Arr(i, 8), "+1", "")
ElseIf InStr(1, Arr(i, 8), "-1") > 0 Then
et = CDate(Replace(Arr(i, 8), "-1", ""))
.EndTime = CDate(DateAdd("d", -1, FlyDate) + et)
.TextEndTime = Replace(Arr(i, 8), "-1", "")
Else
.EndTime = CDate(FlyDate + CDate(Arr(i, 8)))
.TextEndTime = Arr(i, 8)
End If .EndDate = CDate(Format(.EndTime, "yyyy/mm/dd"))
.BackDate = Format(DateAdd("D", 0, .EndDate), "yyyy/mm/dd") 'If .FlyNo = "S73211" Then Debug.Print "结束时间:"; .EndTime; "返回日期 :"; .BackDate
'Debug.Print .StartTime; " 抵达日期和时间 "; .EndTime
End With
Set dPlan(CStr(PlanCount)) = Plan
End If
Next i
Next j
End With ' 开始寻找符合条件的航班
'第一层循环 检查出发日期、出发地、中转地是否符合条件
Dim OneGo, GoBefore
Dim OneCnn, GoAfter
Dim OneBack, BackBefore
Dim OneAfter, BackAfter
Dim Index As Long
Dim HeadRow As Long
HeadRow = 15
For Each OneGo In dPlan.keys
If dUsed.exists(OneGo) = False Then
Set GoBefore = dPlan(OneGo)
'若出发日期符合条件
If Abs(DateDiff("d", GoBefore.StartDate, TripDate)) <= 3 Then
'若出发地和中转地符合条件
If GoBefore.Org = Origin And GoBefore.Des = Connecting Then
'Debug.Print GoBefore.FlyNo
dUsed(OneGo) = ""
'第二层循环 中转地、目的地、检查出发时间是否符合条件
For Each OneCnn In dPlan.keys
If dUsed.exists(OneCnn) = False Then
Set GoAfter = dPlan(OneCnn)
'若中转地和目的地符合条件
If GoAfter.Org = Connecting And GoAfter.Des = Destination Then
'若中转起飞时间符合条件
If DateDiff("h", GoBefore.EndTime, GoAfter.StartTime) > 2 And DateDiff("h", GoBefore.EndTime, GoAfter.StartTime) < 48 Then
dUsed(OneCnn) = ""
'Debug.Print GoBefore.FlyNo; " "; GoBefore.StartDate; ">>>>"; GoAfter.FlyNo; " "; GoAfter.BackDate Set dBackDate = CreateObject("Scripting.Dictionary")
'保留符合返程条件的出发日期
For off = -3 To 3
bd = Format(DateAdd("d", Stay + off, CDate(GoAfter.BackDate)), "yyyy/mm/dd")
'Debug.Print "回程日期 "; bd
dBackDate(bd) = ""
Next off '第三层循环返程
For Each OneBack In dPlan.keys
If dUsed.exists(OneBack) = False Then
Set BackBefore = dPlan(OneBack)
'回程日期
bd = Format(BackBefore.StartDate, "yyyy/mm/dd")
'若回程日期符合预设范围
If dBackDate.exists(bd) Then
'如果出发地与中转地相符,记下航班信息
If BackBefore.Org = Destination And BackBefore.Des = Connecting Then
'Debug.Print "回程航班:"; BackBefore.FlyNo; " "; BackBefore.StartDate
dUsed(OneBack) = ""
'第四层循环 返程中转
For Each OneAfter In dPlan.keys
Set BackAfter = dPlan(OneAfter)
If dUsed.exists(OneAfter) = False Then
'若回程中转出发地和目的地符合条件
If BackAfter.Org = Connecting And BackAfter.Des = Origin Then
'若中转时间符合要求
If DateDiff("h", BackBefore.EndTime, BackAfter.StartTime) > 2 And DateDiff("h", BackBefore.EndTime, BackAfter.StartTime) < 48 Then dUsed(OneAfter) = ""
Index = Index + 1
With sht
Debug.Print "往返完全符合条件的线路" & Index
.Cells(Index + HeadRow, "C").Value = Index
'GO
.Cells(Index + HeadRow, "D").Value = GoBefore.FlyNo
.Cells(Index + HeadRow, "E").Value = GoBefore.StartDate
.Cells(Index + HeadRow, "F").Value = GoBefore.TextStartTime
.Cells(Index + HeadRow, "G").Value = GoBefore.TextEndTime .Cells(Index + HeadRow, "H").Value = GoAfter.FlyNo
.Cells(Index + HeadRow, "I").Value = GoAfter.StartDate
.Cells(Index + HeadRow, "J").Value = GoAfter.TextStartTime
.Cells(Index + HeadRow, "K").Value = GoAfter.TextEndTime
'Back
.Cells(Index + HeadRow, "L").Value = BackBefore.FlyNo
.Cells(Index + HeadRow, "M").Value = BackBefore.StartDate
.Cells(Index + HeadRow, "N").Value = BackBefore.TextStartTime
.Cells(Index + HeadRow, "O").Value = BackBefore.TextEndTime .Cells(Index + HeadRow, "P").Value = BackAfter.FlyNo
.Cells(Index + HeadRow, "Q").Value = BackAfter.StartDate
.Cells(Index + HeadRow, "R").Value = BackAfter.TextStartTime
.Cells(Index + HeadRow, "S").Value = BackAfter.TextEndTime End With
End If
End If
End If
Next OneAfter
End If
End If
End If Next OneBack End If
End If
End If
Next OneCnn
End If
End If
End If
Next OneGo Set dUsed = Nothing
Set dPlan = Nothing
Set sht = Nothing
Set osht = Nothing
Set dBackDate = Nothing 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. wait()和notify()的理解与使用

    void notify() Wakes up a single thread that is waiting on this object’s monitor. 译:唤醒在此对象监视器上等待的单个线程 ...

  2. jsoup对 HTML 文档的解析和操作

    本文手动转载自http://www.cnblogs.com/chenying99/archive/2013/01/04/2844615.html,仅根据个人需要对实用部分进行转载,详细请阅读原文. j ...

  3. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(5)

    7.其他 名称 类型 说明 FindKey 类似于BDE的相关功能,在当前数据集中查找指定的记录 FindNearest 移动游标到最符合查找要求的第一条记录处 FindMacro 当前数据集中是否存 ...

  4. android 6 中init.rc的生成过程【转】

    本文转载自:https://blog.csdn.net/quhj/article/details/51819638 android 系统开机是会有一个初始化过程 init ,整个初始化过程是根据配置脚 ...

  5. hdfoo站点开发笔记-2

    httpd的目录的 Options: (里面的单词都是用的复数): Options Indexes FollowSymLinks 为了避免有些目录下没有生成deny.htm而显示列表, 可以直接给 / ...

  6. luoguP4072 [SDOI2016]征途

    [SDOI2016]征途 大体 大概就是推推公式,发现很傻逼的\(n^3\)DP get60 进一步我们发现状态不能入手,考虑优化转移 套个斜率优化板子 每一层转移来一次斜率优化 思路 先便便式子 \ ...

  7. [CodeForces 892A] Greed (Java中sort实现从大到小排序)

    题目链接:http://codeforces.com/problemset/problem/892/A 具体的Java 中 sort实现降序排序:https://www.cnblogs.com/you ...

  8. (转载)windows下安装配置Xampp

    XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Windows中安装XAMPP(Apache+Mysql+PHP)及使用方法及其相关问题的总 ...

  9. kubernetes 实战5_命令_Assign Pods to Nodes&Configure a Pod to Use a ConfigMap

    Assign Pods to Nodes how to assign a Kubernetes Pod to a particular node in a Kubernetes cluster. Ad ...

  10. 非托管C++互操作

    .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NE ...