Office中国论坛/Access中国论坛

标题: 在打开EXCEL后,标注休息日的速度很慢,帮我优化一下吧 [打印本页]

作者: kent_73    时间: 2012-7-11 16:31
标题: 在打开EXCEL后,标注休息日的速度很慢,帮我优化一下吧
在打开EXCEL后,标注休息日的速度很慢,帮我优化一下吧
谢谢
[attach]49643[/attach]
作者: Benjamin_luk    时间: 2012-7-11 16:52
本帖最后由 Benjamin_luk 于 2012-7-11 16:53 编辑

给你个思路:
1.在EXCEL表中用代码读取MDB的工厂日历
2.用代码进行EXCEL标注,记得头尾加上Application.ScreenUpdating = false, Application.ScreenUpdating = True
3.将Excel的区域转存到数组中,这样代码处理会快很多

作者: todaynew    时间: 2012-7-11 17:08
不要Excel表不就完事了,直接在Access中完成报表即可。
作者: roych    时间: 2012-7-11 21:21
本帖最后由 roych 于 2012-7-12 01:48 编辑

个人建议不必在Access中处理,而是考虑在Excel中处理。
1、用Weekday函数可以有效地查找到周末。
2、个别传统节日可以通过内置数据来完成。
详细看附件吧~~~不知道附件中讲清楚了没有。如果还不理解,就去http://www.office-cn.net/thread-113291-1-1.html看看{:soso_e128:}
[attach]49646[/attach]
作者: kent_73    时间: 2012-7-12 07:55
Benjamin_luk 发表于 2012-7-11 16:52
给你个思路:
1.在EXCEL表中用代码读取MDB的工厂日历
2.用代码进行EXCEL标注,记得头尾加上Application.Scr ...

我需要从二个方面读取假期的信息:1、MDB中的工厂日历;2、一年中的星期日
现在是能够完成,只是用for循环,速度慢了,请帮我用数组写个示例吧
作者: kent_73    时间: 2012-7-12 07:56
todaynew 发表于 2012-7-11 17:08
不要Excel表不就完事了,直接在Access中完成报表即可。

因为需要导出到特定的格式中,所以做了一个EXCEL模板。
如果在ACCESS中生成报表的话,能得到如我附件中的EXCEL模板一样的格式吗?
作者: kent_73    时间: 2012-7-12 07:59
roych 发表于 2012-7-11 21:21
个人建议不必在Access中处理,而是考虑在Excel中处理。
1、用Weekday函数可以有效地查找到周末。
2、个别 ...

我的数据都保存在ACCESS中,只能通过在导出数据时,一次性的处理。
作者: Benjamin_luk    时间: 2012-7-12 12:00
这是在ACCESS里的代码,大概需要8秒可以执行完毕:
替换你的代码就可以了:

Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As New Excel.Worksheet
Dim Rs As New ADODB.Recordset, conn
Dim i As Integer, j As Integer, n As Integer
Dim mydb As ADODB.Connection, c2, SQL As String
Dim TargetR, stime
Set mydb = CurrentProject.Connection
stime = Timer
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\计划.xlt")
Set xlSheet = xlBook.Worksheets(1)
Set conn = CurrentProject.Connection
xlApp.ScreenUpdating = False
With xlSheet
Set TargetR = .Range("A1:AG300")
    For n = 1 To 33
    For i = 1 To 330
   'MsgBox TargetR(i, n)
    If IsDate(TargetR(i, n)) = True Then
    If Nz(DCount("[日期]", "Tb_工厂日历", "[日期]=#" & TargetR(i, n) & "# AND [是否休息]=-1"), 0) > 0 Then
    .Cells(i, n).Font.ColorIndex = 3  '符合条件的用红色字体表示
    ElseIf Weekday(TargetR(i, n)) = 7 Then
    .Cells(i, n).Interior.ColorIndex = 15  '星期日用灰色底纹表示
    Else
     .Cells(i, n).Interior.ColorIndex = 2
    End If
    End If
    Next i
    Next n
xlApp.ScreenUpdating = True
End With
xlApp.Visible = True
'MsgBox Round(Timer - stime, 2)


作者: Benjamin_luk    时间: 2012-7-12 12:02
设xlApp.Visible =False 大概可以省一半的时间
{:soso_e100:}

作者: kent_73    时间: 2012-7-12 12:08
谢谢了,我试试
作者: Benjamin_luk    时间: 2012-7-12 12:38
本帖最后由 Benjamin_luk 于 2012-7-12 12:39 编辑

Weekday(TargetR(i, n)) = 7, 实际上是周六,因为你没有指定一周开始的第一天是周几
默认是从周日开始的,所以
Weekday(TargetR(i, n)) = 1 才是周日
你自己改一下.
作者: todaynew    时间: 2012-7-12 12:47
kent_73 发表于 2012-7-12 07:56
因为需要导出到特定的格式中,所以做了一个EXCEL模板。
如果在ACCESS中生成报表的话,能得到如我附件中的 ...

当然可以,犯不着在Excel中折腾一遍。


作者: kent_73    时间: 2012-7-12 13:28
Benjamin_luk 发表于 2012-7-12 12:38
Weekday(TargetR(i, n)) = 7, 实际上是周六,因为你没有指定一周开始的第一天是周几
默认是从周日开始的,所 ...


导出的结果不对啊

[attach]49651[/attach]
作者: kent_73    时间: 2012-7-12 13:53
todaynew 发表于 2012-7-12 12:47
当然可以,犯不着在Excel中折腾一遍。


我的格式中,有多个部门,每个部门的每个合同都有好几个数据,怎么放到报表中啊
我把需要导出的数据放上来,帮我做个示例吧。谢谢

需要导出的表是:Tb_计划_主表
需要导出的字段是:合同号、样板、合同数量、日产量、产品号、预计到货日、产品完成日、交货期
已禁用的数据不导出
日期必须是整月的
将属于休息日的日期,在工厂日历中为休息日的,用红色字体;属于法定假日的,用灰色底纹表示。

如需要导出的数据的【预计投入日】为1月的话,生产部门是【A】(生产部门如果是【B】的话,按照下面的行号+8,即:合同号——C14~AG14……)
导出的数据对应在EXCEL中所处的位置:合同号——C6~AG6
                                                                样板——C7~AG7
                                                               合同数量——C8~AG8
                                                               日产量——C9~AG9
                                                               产品号——C10~AG10
                                                               预计到货日——C11~AG11
                                                              产品完成日——C12~AG12
                                                               交货期——C13~AG13


[attach]49652[/attach]
作者: todaynew    时间: 2012-7-12 14:43
本帖最后由 todaynew 于 2012-7-12 14:43 编辑
kent_73 发表于 2012-7-12 13:53
我的格式中,有多个部门,每个部门的每个合同都有好几个数据,怎么放到报表中啊
我把需要导出的数据放 ...


你可以先按照需要的格式做出对应的查询来,如果查询很麻烦,可以先设一个对应报表格式的数据表,用ADO将需要的数据读入到该表中,然后以该表作为报表的数据源即可。

这样处理是和向Excel导出数据是一个道理,无非是接收数据的对象从Excel表转为了一个查询或者一个临时数据表而已。
作者: kent_73    时间: 2012-7-12 15:42
todaynew 发表于 2012-7-12 14:43
你可以先按照需要的格式做出对应的查询来,如果查询很麻烦,可以先设一个对应报表格式的数据表,用ADO将 ...

像这样的格式怎么样在ACCESS中做查询啊
我不会做,辛苦版主帮做一个吧
谢谢了

[attach]49653[/attach]
作者: Benjamin_luk    时间: 2012-7-12 15:54
kent_73 发表于 2012-7-12 13:28
导出的结果不对啊

改为并列的条件就可以了,差不多要8秒
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As New Excel.Worksheet
Dim Rs As New ADODB.Recordset, conn
Dim i As Integer, j As Integer, n As Integer
Dim mydb As ADODB.Connection, c2, SQL As String
Dim TargetR, stime
Set mydb = CurrentProject.Connection
stime = Timer
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\计划.xlt")
Set xlSheet = xlBook.Worksheets(1)
Set conn = CurrentProject.Connection
xlApp.ScreenUpdating = False
With xlSheet
Set TargetR = .Range("A1:AG300")
    For n = 1 To 33
    For i = 1 To 300
   'MsgBox TargetR(i, n)
    If IsDate(TargetR(i, n)) = True Then
    If Nz(DCount("[日期]", "Tb_工厂日历", "[日期]=#" & TargetR(i, n) & "# AND [是否休息]=-1"), 0) > 0 Then
    .Cells(i, n).Font.ColorIndex = 3  '符合条件的用红色字体表示
    Else
     .Cells(i, n).Interior.ColorIndex = 2
    End If
    If Weekday(TargetR(i, n)) = 1 Then
    .Cells(i, n).Interior.ColorIndex = 15  '星期日用灰色底纹表示
    Else
     .Cells(i, n).Interior.ColorIndex = 2
    End If
    End If

    Next i
    Next n
xlApp.ScreenUpdating = True
End With
xlApp.Visible = True
'MsgBox Round(Timer - stime, 2)

作者: todaynew    时间: 2012-7-12 15:57
本帖最后由 todaynew 于 2012-7-12 16:00 编辑
kent_73 发表于 2012-7-12 15:42
像这样的格式怎么样在ACCESS中做查询啊
我不会做,辛苦版主帮做一个吧
谢谢了


鬼打架,你的实例中没有其他表,没法帮你折腾。

实际上就是一个简单的交叉查询做报表的数据源而已。
作者: kent_73    时间: 2012-7-12 16:02
Benjamin_luk 发表于 2012-7-12 15:54
改为并列的条件就可以了,差不多要8秒
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbo ...

现在对了,谢啦
作者: kent_73    时间: 2012-7-12 16:10
todaynew 发表于 2012-7-12 15:57
鬼打架,你的实例中没有其他表,没法帮你折腾。

实际上就是一个简单的交叉查询做报表的数据源而已。

没有表?应该有二个表呀,在14楼的附件中
附件中的ACCESS中有二个表,1、Tb_工厂日历(这是工厂定的作息时间);2、Tb_计划_主表

是否为休息日要看表:Tb_工厂日历和国家的法定假日(指星期日,呵呵,采用综合工时,星期六要加班的),这里用字体颜色和底纹区分

需要的计划数据都在表:Tb_计划_主表 中。

再次上传附件


[attach]49659[/attach]
作者: Benjamin_luk    时间: 2012-7-12 16:11
你可以在
.Cells(i, n).Interior.ColorIndex = 2
后面加上:
.Cells(i, n).Font.ColorIndex = 1
将字体改为黑色.
{:soso_e100:}
作者: todaynew    时间: 2012-7-12 17:42
kent_73 发表于 2012-7-12 16:10
没有表?应该有二个表呀,在14楼的附件中
附件中的ACCESS中有二个表,1、Tb_工厂日历(这是工厂定的作息 ...

建一个临时表,向临时表写入数据(写入临时表的逻辑与写入Excel表相同),并用临时表做报表数据源。
[attach]49660[/attach]




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3