2011-07-21 41 views
0

我知道一點VBA,但我一直在尋找更聰明的方式(人們工作的方式!!)。如何加速這個Excel VBA宏?

這是我正在做的。我必須處理一些數據,這些數據有:

年份|月| Day |小時|分鐘| Data1 | Data2 .... | DataN

每個在一個單獨的列,並有成千上萬的行。 「數據」列的數量由用戶在運行時間內定義(至少1和最大100)。數據可以有任何時間步長,例如每分鐘,5分鐘,10分鐘,每小時,每天等等。然後用戶指定輸出數據間隔,該間隔將總是大於輸入數據間隔。

所以,這個宏應該在用戶指定的時間間隔內寫入數據。輸出時間步驟之間的每列中的數據必須添加到其中。見下面的兩個表:

輸入:

Yr  Mth Day Hr Min Data_1 Data_2 

2010 2 7 8 0 1.01 2.01 

2010 2 7 8 5 1.02 2.02 

2010 2 7 8 10 1.03 2.03 

2010 2 7 8 15 1.04 2.04 

2010 2 7 8 20 1.05 2.05 

2010 2 7 8 25 1.06 2.06 

2010 2 7 8 30 1.07 2.07 

2010 2 7 8 35 1.08 2.08 

2010 2 7 8 40 1.09 2.09 

2010 2 7 8 45 1.10 2.10 

2010 2 7 8 50 1.11 2.11 

2010 2 7 8 55 1.12 2.12 

2010 2 7 9 0 1.13 2.13 

2010 2 7 9 5 1.14 2.14 

輸出:

Yr  Mth Day Hr Min Data_1 Data_2 

2010 2 7 8 0 1.01 2.01 

2010 2 7 8 15 3.09 6.09 

2010 2 7 8 30 3.18 6.18 

2010 2 7 8 45 3.27 6.27 

2010 2 7 9 0 3.36 6.36 

所以,輸入數據是每5分鐘,輸出數據必須是每15分。連續15分鐘間隔內的每行數據必須加在一起。

我有這個工作,因爲我使用兩個循環水平和垂直遍歷,並在每個步驟將值寫入電子表格。但它真的很慢。

任何幫助加快這一進程將不勝感激。

在此先感謝我一直用它來寫處理的數據到一個文本文件

-MP

* *代碼:

Open FName For Output Access Write As #FNum 
For RowNdx = StartRow To endrow 
done = Int((RowNdx/endrow) * 100) 
Application.StatusBar = "Exporting *.gag file... (" & done & " % done)" 
    WholeLine = "" 
    For colNdx = StartCol To Endcol 
     If Sheets("Output").Cells(RowNdx, colNdx).Text = "" Then 
      CellValue = "" 
     Else 
      CellValue = Sheets("Output").Cells(RowNdx, colNdx).Text 
     End If 
     WholeLine = WholeLine & CellValue & sep 
    Next colNdx 
    WholeLine = Left(WholeLine, Len(WholeLine) - Len(sep)) 
    Print #FNum, WholeLine 
Next RowNdx 
Close #FNum 

是否有寫的方式範圍一次到一個文本文件。我試圖避免循環。

感謝您的幫助

MPD

回答

0

你有沒有嘗試設置

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
您的循環前

記得設置

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 

您的循環完成後。

您也可以將所有數據保存到循環中的數組中,然後將整個數組作爲範圍輸出到輸出電子表格,而不是逐個單元格地寫入值,這與您看起來相似現在正在做。

+0

嗨,PaulR,謝謝你的迴應。我屏幕更新關閉,但我沒有嘗試 Application.Calculation = xlCalculationManual 我會試試看。是的,現在我在寫單元格到單元格。我想將所有數據存儲到數組並寫入最後,但問題是我不知道有多少數據列會在運行時出現,因此我不知道要啓動多少個數組。任何想法? – MPD

+0

如果數據按列排列,可以使用Worksheets(「YourWorksheetName」),UsedRange.Columns.Count獲取列數,然後將數組大小設置爲該長度。它也適用於行,只需使用Worksheets(「YourWorksheetName」)。UsedRange.Rows.Count。 –

+0

謝謝PaulR。我結束了使用範圍,而不是循環通過每個單元格。這加快了這個過程。使用我的舊代碼處理數據大約需要4分鐘,現在大約需要40秒。我需要將處理後的數據導出到文本文件,並且佔用時間很短。有沒有辦法將範圍直接導出到文本文件(而不是每行)?我試圖在這裏發佈我的代碼,但它嚴重格式化代碼。所以,我已經在我的原始文章的末尾插入了我用來寫入文本文件的代碼。 感謝您的幫助 – MPD