906379829 发表于 2016-4-4 09:08:57

求高手改进程序

Sub 材料汇总()
Dim wb As Workbook, myfile$, s&
Dim i As Integer
Dim k As Integer
Application.ScreenUpdating = False
myfile = Dir(ThisWorkbook.Path & "\决算\*.xls")
s = 4
Do While myfile <> ""
    If ThisWorkbook.Name <> myfile Then
      s = s + 1
      Set wb = GetObject(ThisWorkbook.Path & "\决算" & "\" & myfile)
      With wb.Sheets(1)
         For i = 2 To 496
         Cells(1, s) = wb.Sheets("封面").Cells(3, 3)
         Cells(i, s) = wb.Sheets("新材料表").Cells(i + 5, 5)
         Next i

   End With
      wb.Close False
    End If
    myfile = Dir
Loop
Application.ScreenUpdating = True

End Sub


这是一个汇总材料的宏程序,但运行比较慢,求高手改进(用数组怎么改进啊)




Real_King 发表于 2016-4-4 09:28:44

本帖最后由 Real_King 于 2016-4-4 09:31 编辑

给我的感觉。。。VBA OLE运行效率确实不高吧,你这个遍历单元格可以尝试缩小范围,也可以采用数据库访问形式比较快,具体看格式了,大概看了眼你的行是从第二行起读的,可以采取这种方式

906379829 发表于 2016-4-4 16:59:04

Real_King 发表于 2016-4-4 09:28 static/image/common/back.gif
给我的感觉。。。VBA OLE运行效率确实不高吧,你这个遍历单元格可以尝试缩小范围,也可以采用数据库访问形式 ...

我想采用数组进行读写操作,总是失败,前辈能帮帮我吗

Real_King 发表于 2016-4-4 21:17:46

906379829 发表于 2016-4-4 16:59 static/image/common/back.gif
我想采用数组进行读写操作,总是失败,前辈能帮帮我吗

我用的是C#,不过你提到的数组,完全可以以dataset的形式啊,读写比你以遍历单元格形式快得多

906379829 发表于 2016-4-4 22:48:34

Real_King 发表于 2016-4-4 21:17 static/image/common/back.gif
我用的是C#,不过你提到的数组,完全可以以dataset的形式啊,读写比你以遍历单元格形式快得多

Sub 预算材料汇总()

Dim wb As Workbook, wk As Workbook, myfile$, s&
Dim i As Integer
Dim k As Integer
Dim arr
Application.ScreenUpdating = False
myfile = Dir(ThisWorkbook.Path & "\预算\*.xls")
s = 2
Do While myfile <> ""
    If ThisWorkbook.Name <> myfile Then
      s = s + 1
      Set wb = Workbooks.Open(ThisWorkbook.Path & "\预算" & "\" & myfile)
      Set wk = GetObject(ThisWorkbook.Path & "\预算" & "\" & myfile)
      With wb.Sheets(1)
          arr = wb.Sheets("主材清单").Range(Cells(7, 5), Cells(299, 5))
         Cells(1, s) = wb.Sheets("封面").Cells(3, 1)
         Range(Cells(2, s), Cells(297, s)).Value = arr
         

   End With
    ActiveWorkbook.CheckCompatibility = False
      wb.Close False
      
    End If
    myfile = Dir
Loop
Application.ScreenUpdating = True


End Sub

906379829 发表于 2016-4-4 22:50:00

上述程序是我采用数组编的,红色部分调试不成功,不知道哪里出问题了

Real_King 发表于 2016-4-5 00:08:17

本帖最后由 Real_King 于 2016-4-5 00:11 编辑

906379829 发表于 2016-4-4 22:50 static/image/common/back.gif
上述程序是我采用数组编的,红色部分调试不成功,不知道哪里出问题了
如你所见,arr是 Excel Range 对象,你理解的数组不是这样,声明arrDim arr as Excel.Application.Range,不知道VB是不是这样你试试

mikewolf2k 发表于 2016-4-5 13:07:36

这段代码应该慢不到哪去,看看是不是打开各个xls文件比较花时间。楼主可以在各个不同阶段输出下时间,看看最慢在哪里。

煽风点火聊电影 发表于 2016-4-25 14:36:44

对于excel的工作表单元格的操作,肯定是用数组计算比直接访问单元格快多了

xinght99 发表于 2016-4-25 21:40:18

来学习一下
页: [1]
查看完整版本: 求高手改进程序