2014-01-21 50 views
1

我正在使用excel vba 2010在已存在的工作簿中創建兩個電子表格。 這些新電子表格的源代碼是第一次創建這兩個電子表格的時間超過2小時的另一個帶有12個電子表格(每個包含40000行)的工作簿。 (我選擇了aprox。13000行來創建這兩個電子表格)。我怎樣才能減少時間消耗?我如何使用excel vba減少處理時間

Sub creaInventarios(wkArchivoROT, wkArchivoDatos) 

Dim book_I As Workbook, wbk1 As Workbook 
Dim sheet_IQB As Worksheet, sheet_I As Worksheet, sheet_P As Worksheet, sheet_FIN As Worksheet 
Dim longitudCampo As Integer 
Dim nf As Long, nfo As Long, orden As Long, divida As Long, queda As Long, nf1 As Long, canrow As Long 
Dim chkInventario As String 

Dim texto As Range 
Dim codigoItem As Range 
Dim descrItem As Range 
Dim itemVendedor As Range 
Dim puntoReorden As Range 
Dim qtyOnHand As Range 
Dim qtyOnSale As Range 
Dim qtyAvailable As Range 
Dim suggestReorden As Range 
Dim qtyReorden As Range 
Dim earlySale As Range 
Dim salesThisWeek As Range 

Dim errorCampo As Boolean 

Set book_I = Workbooks.Open(wkArchivoROT) 

Set sheet_I = book_I.Worksheets(9) 
Set sheet_P = book_I.Worksheets(8) 

Set wbk1 = Workbooks.Open(wkArchivoDatos) 
Set sheet_FIN = wbk1.Worksheets("Final") 
nf = 3 
nfo = 7 
orden = 0 

lee_Fin: 

If sheet_FIN.Range("C" & nf) = " " Or sheet_FIN.Range("C" & nf) = vbNullString Then 
    If sheet_FIN.Range("B" & nf).Value = " " Or sheet_FIN.Range("B" & nf) = vbNullString Then 
     GoTo finInventario 
    End If 
End If 
queda = Len(sheet_FIN.Range("C" & nf).Value) 
If queda = 0 Then 
    nf = nf + 1 
    GoTo lee_Fin 
End If 
Set codigoItem = sheet_FIN.Range("C" & nf) 
chkInventario = Mid(codigoItem.Value, 1, 3) 
If chkInventario = "MPA" Or chkInventario = "MPC" Or chkInventario = "PPA" Or chkInventario = "PTC" Then 
    GoTo checkIgual 
Else 
    nf = nf + 1 
    GoTo lee_Fin 
End If 

checkIgual: 

Set texto = sheet_FIN.Range("B" & nf) 

Set descrItem = sheet_FIN.Range("D" & nf) 
Set itemVendedor = sheet_FIN.Range("E" & nf) 
Set puntoReorden = sheet_FIN.Range("F" & nf) 
Set qtyOnHand = sheet_FIN.Range("G" & nf) 
Set qtyOnSale = sheet_FIN.Range("H" & nf) 
Set qtyEnsamble = sheet_FIN.Range("I" & nf) 
Set qtyAvailable = sheet_FIN.Range("J" & nf) 
Set suggestReorden = sheet_FIN.Range("L" & nf) 
Set qtyReorden = sheet_FIN.Range("M" & nf) 
Set earlySale = sheet_FIN.Range("N" & nf) 
Set salesThisWeek = sheet_FIN.Range("O" & nf) 

sheet_P.Range("A" & nfo).Value = codigoItem.Value 
sheet_I.Range("A" & nfo).Value = codigoItem.Value 

sheet_P.Range("B" & nfo).Value = descrItem.Value 
sheet_I.Range("B" & nfo).Value = descrItem.Value 

sheet_P.Range("C" & nfo).Value = puntoReorden.Value 

sheet_I.Range("C" & nfo).Value = qtyOnHand.Value 
sheet_P.Range("D" & nfo).Value = qtyOnHand.Value 

'sheet_I.Range("C" & nfo).Value = qtyAvailable.Value 
'sheet_P.Range("D" & nfo).Value = qtyAvailable.Value 

sheet_I.Range("D" & nfo).Value = qtyOnSale.Value 
sheet_P.Range("E" & nfo).Value = qtyOnSale.Value 

sheet_I.Range("E" & nfo).Value = qtyEnsamble.Value * -1 
sheet_P.Range("F" & nfo).Value = qtyEnsamble.Value * -1 

sheet_I.Range("F" & nfo).Value = qtyAvailable.Value 
sheet_P.Range("G" & nfo).Value = qtyAvailable.Value 

orden = orden + 1 
sheet_I.Range("U" & nfo).Value = orden 
sheet_P.Range("L" & nfo).Value = orden 
nfo = nfo + 1 
nf = nf + 1 
GoTo lee_Fin 

finInventario: 
MsgBox "Continuar", vbInformation, "WARNING" 
End Sub 
+0

我沒有時間設置基線工作簿ATM,但我認爲我可以快119分鐘。您是否研究過使用數組來收集數據,如果需要的話在內存中操作它,然後將它推入它的兩個輸出數組中?從整個變量數組讀取/寫入整個表單需要幾毫秒。陣列應該快得多。 –

回答

1

關閉屏幕更新和計算,而你的代碼運行時通常是有幫助的,並且可以像這樣做:

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

'Your code goes here 

Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 

Herehere是進入一些其他的一些好文章VBA速度最佳實踐。

+0

我也養成了這兩種習慣;) –

0

此外,如果你不想觸發Sheet_Change和Workbook_change,每個IME你改變一個單元格的值,加

application.enableevents=false 
' your code here 
application.enableevent=true 

,但要小心,如果你的代碼停止錯誤/調試,你會需要再次啓用事件(取決於是否需要事件來執行其他操作)