2017-10-06 41 views
1

這是我正在看的。我有我導入使用下面的VBA的部分片:VBA - 檢查公式是否在單元格運行緩慢

Sheets("Sheet1").Select 
Range("D1:D1").Select 
Selection.QueryTable.Refresh BackgroundQuery:=False 

與此有關的問題是,每當我運行它,它打亂了我的公式中的A和B列。所以,我創建了一個子,將檢查是否存在如下:

Sub fixAnB() 
    Dim sh As Sheet9 
    Dim rw As Range 
    Set sh = Sheet9 
    sh.EnableCalculation = False 
    'Sheets("Sheet1") 
    Dim i As Long 
    i = 0 
    Dim f1 As String, f2 As String 
    For Each rw In sh.Rows 
     i = i + 1 
     If i > 1 And sh.Cells(rw.Row, 4).Value <> "" Then 
      f1 = "=CONCATENATE(G" & i & ",J" & i & ")" 
      f2 = "=CONCATENATE(I" & i & ",H" & i & ",J" & i & ")" 
      If sh.Cells(rw.Row, 1).Formula <> f1 Then sh.Cells(rw.Row, 1).Formula = f1 
      If sh.Cells(rw.Row, 2).Formula <> f2 Then sh.Cells(rw.Row, 2).Formula = f2 
     End If 
     If sh.Cells(rw.Row, 4).Value = "" Then Exit For 
    Next rw 
    sh.EnableCalculation = True 
End Sub 

我這個問題是我可以20,000-200,000記錄上板之間有任何地方。所以使用該子來修復這些公式大約需要10-15分鐘。我在尋找解決方案之一:

  1. 一種方式,以便它不亂,當我輸入我的數據

或 2.做出的方式引用來解決原來的問題修復者子跑的方式更快。

你覺得怎麼樣?

+0

如果一切正常,但僅僅是緩慢的,我建議,而不是張貼到[代碼審查(https://開頭codereview.stackexchange.com/)。也就是說,在開始時嘗試轉換screenupdating('Application.ScreenUpdating = False')。 – BruceWayne

+0

我實際上希望得到#1的答案,所以我根本不必運行子程序 –

+0

如果您的數據設置爲表格,會發生這種情況嗎? – QHarr

回答

1

試試這個代碼(只需不到0.5秒在我的測試上20萬行):

Sub Test() 
t = Timer 
' Application.ScreenUpdating = False 
' Application.EnableEvents = False 
' Application.Calculation = xlCalculationManual 

Dim sh As Worksheet 
Set sh = ActiveSheet 
Dim i As Long 
i = sh.Range("D1").End(xlDown).Row 
sh.Range("A2:A" & i).Formula = "=CONCATENATE(G2,J2)" 
sh.Range("B2:B" & i).Formula = "=CONCATENATE(I2,H2,J2)" 

' Application.ScreenUpdating = True 
' Application.EnableEvents = True 
' Application.Calculation = xlCalculationAutomatic 
MsgBox Timer - t 
End Sub