簡體   English   中英

Excel VBA FormulaArray太慢

[英]Excel VBA FormulaArray Too Slow

我有一個宏,它根據會計期間填充開始日期和完成日期。 例如:產品X在1月12日-12月12日銷售。 該宏將使用vlookup / min數組查找開始,並使用vlookup / max數組查找結束。 日期采用YYYYMM格式,因此vlookup正在查看日歷選項卡,該選項卡將對應的YYYYMM映射到開始或結束日期。 編碼工作正常,但在某些情況下,存在30,000-100,000行,可能需要15-20分鍾才能運行。 是否有人對如何使其運行更快有任何想法?

這是代碼:

Cells(Rcnt,5).FormulaArray =“ = VLOOKUP(MIN(IF('Normalized'!A:A =”&Cells(Rcnt,1).Address(False,False)&“,'Normalized'!J:J )),'Calendar'!A:C,2,FALSE)“

任何幫助將不勝感激。

不要在宏中使用公式。 您可以通過自己在VBA中編寫代碼來使代碼更快。 您可以遍歷一行中的所有值並存儲最小值和最大值(可以保留max和min,因此只需要一個循環)。 然后將這些值寫入適當的位置。 這應該已經超過了excel公式。

要開始用VBA編寫宏,請看這里 您將特別想看看如何在單元格之間循環 您將需要設置max = Jan 1和min = Dec 31,然后如果當前檢查的值大於max,則將max設置為等於該值,同樣將min設置為最小值。 遍歷該行后,您將在該行中具有最大值和最小值。 然后,您可以將這些值寫入其他列,重置最大和最小,然后移至下一行。

我對您的問題的理解是,您的數據列出了每個月每個產品的銷售額,因此對於每個產品,您都在搜索前幾個月和最后幾個月。 您可以按產品和日期對數據進行排序嗎? 如Emschorsch所述,這將是實現循環的最簡單方法,因為您一次只能處理一種產品。

嘗試加快速度的其他幾件事:

  • 將代碼的第一行設置為:

     Application.Calculation = xlCalculationManual 

    最后一行是:

     Application.Calculation = xlCalculationAutomatic 

    (您仍然有大量的查詢,但是它們將一次計算全部,而不是在創建每一行的公式時一次計算一次)

  • 如果無法對數據進行排序,則可以連續對每個產品進行自動過濾,並使用SUBTOTAL()函數(引用日期列)來獲取最小值和最大值。 (您可以將SUBTOTAL()公式放在未使用的單元格中,並在您的代碼中引用該單元格,或者使用Application.WorksheetFunction在代碼中直接使用它)

似乎沒有必要的另一部分(如果無法看到您的數據,我們無法確定)是使用查找將YYYYMM轉換為日期,如果這確實是所有日期都采用的格式的話,那么無需使用VBA即可輕松實現DATE()公式,或者如果您需要在宏中使用它:

cells(Rcnt, 5).Value = DateSerial(Left(x, 4), Right(x, 2), 1)  'x is your date in YYYYMM format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM