该实战与实战二的思路相反
问题
将每个表格中的数据进行汇总到一个表格内并按照时间的顺序进行排序
思路
1、本次项目打算使用折半查找的方法进行插入,注意折半查找使用时必须保证带查找的内容时有序的。
2、首先将Sheet2即一车间中的数据按照时间顺序进行排列(这里可以尝试采用代码将Sheet2中乱序的数据按照折半查找方法直接插入至总表格内,本人直接在excel中直接排序,后期更新方法),然后读取每个表格中每行数据中的月与日,按照折半查找的思路找到其对应的位置,复制整行数据并插入该位置
3、折半查找
基本思想:将中间值与待查找值进行对比,进而缩小待查找的区域。
思路:
其中low为最小的,high代表最大的,mid为中间的,target为待对比的
》mid == target , 则C = mid ,退出循环
》mid >target , 则high = mid
》mid<target , 则low = mid
本程序中直接在low+1=high时进行判断,当target<low,则C=low,否则C=high
代码展示
Sub merge2()
Dim i, k, k1, m, d As Integer
Dim first, last, mid As Integer
'将sheet2中的数据复制到sheet1即汇总表内
Sheet2.Range("a2:f38").Copy Sheet1.Range("a2")
'循环每个工作表
For i = 3 To Sheets.Count
k = Sheets(i).Range("a65535").End(xlUp).Row
'循环工作表中每一行
For j = 2 To k
k1 = Sheet1.Range("a65535").End(xlUp).Row
first = 2
last = k1
m = Sheets(i).Range("a" & j).Value
d = Sheets(i).Range("b" & j).Value
'查找应该插入的位置
For g = 0 To 10000
mid = (first + last) / 2
If Sheet1.Range("a" & mid) > m Then
last = mid
ElseIf Sheet1.Range("a" & mid) < m Then
first = mid
ElseIf Sheet1.Range("b" & mid) > d Then
last = mid
ElseIf Sheet1.Range("b" & mid) < d Then
first = mid
Else
c = mid
End If
If first + 1 = last Then
If Sheet1.Range("a" & first) = m And Sheet1.Range("b" & first) > d Then
c = first
Exit For
Else
c = last
Exit For
End If
End If
Next
'复制整行数据至汇总表(待学知识点)
Sheets(i).Range("a" & j).EntireRow.Copy
Sheet1.Range("a" & c).EntireRow.Select
Selection.Insert Shift:=xlDown
Next
Next
End Sub