不知是否理解正确。可以调整一下思路.原来的表1取消,增加一个表“课时名单”作为过度表,为“另表”和“流水表”计算做准备。代码如下。速度很快的,我的电脑耗时4秒。
e.Form.Controls("Label1").text="稍等..."
dim timestart,timeend as date
timestart=date.now
dim s as string ="上午,下午,读报"
dim h as integer =0
DataTables("课时名单").DataRows.Clear()
For Each dr As DataRow In DataTables("课时变化").DataRows
if dr("正课_星期") isnot nothing then
dim ksweek as string =dr("正课_星期")
for Each dc as Datacol In DataTables("课时变化").Datacols
if dc.name.IndexOf("_") >0 then
dim ksspan as string =dc.name.split("_")(1)
if s.IndexOf(ksspan)>=0 then
if dr(dc.name)=true then
For Each drkc As DataRow In DataTables("课程表").DataRows
for Each dckc as Datacol in DataTables("课程表").Datacols
if ksspan="读报" then
ksspan="班主任"
end if
if dckc.name.IndexOf(ksweek)>=0 and dckc.name.IndexOf(ksspan)>=0 and drkc(dckc) isnot nothing then
for j as integer =0 to (drkc(dckc) & "/") .split("/").Length - 1
if (drkc(dckc) & "/") .split("/")(j) <> "" then
Dim drmd As DataRow
h=h+1
drmd = DataTables("课时名单").DataRows.AddNew()
drmd("星期") = ksweek
drmd("时段") = ksspan
drmd("姓名") = (drkc(dckc) & "/") .split("/")(j).Replace("DU","")
IF (drkc(dckc) & "/") .split("/").Length >2 OR (drkc(dckc) & "/").split("/")(j).IndexOf("DU")>=0
drmd("计分") = 0.5
ELSE
drmd("计分") = 1
END IF
end if
next
end if
next
next
end if
end if
end if
next
end if
next
DataTables("另表").DataRows.Clear()
dim f As New Filler
f.SourceTable = DataTables("课时名单") '指定数据来源
f.SourceCols = "姓名" '指定数据来源列
f.DataTable = DataTables("另表") '指定数据接收表
f.DataCols = "姓名" '指定数据接收列
f.Fill() '填充数据
DataTables("另表").datacols("出现次数").Recalc()
DataTables("流水表").DataRows.Clear()
f.DataTable = DataTables("流水表") '指定数据接收表
f.DataCols = "正课_姓名" '指定数据接收列
f.Fill() '填充数据
DataTables("流水表").datacols("正课_课时").Recalc()
timeend=date.now
e.Form.Controls("Label1").text="耗时" & (timeend-timestart).TotalSeconds & "秒"
Messagebox.Show("处理完毕!")