2017-08-22 27 views
1

我有巨大的文件(超過500,000行),我需要找到如果「M」列等於「」,如果它等於「」 ,而不是我需要在「N」列中寫下某些內容。找到一個空單元格,並在一個巨大的文件中的另一列寫東西

我這樣做=「」,因爲IsEmpty()不在這些文件中工作(不知道爲什麼)。

這是我當前的代碼:(我刪除的內容,沒有必要)

Sub sbVBA_COMMENTS_ExcelSheets() 

'CONSTANTS SERVICENTRE FILES (PROD FOUR) 
Const SC_STRLINE As Integer = 4 'FIRST PART IS ALWAYS AT LINE 4 
Const SC_COLNUM As String = "B" 'PART NUMBERS WILL ALWAYS BE IN THE B COLUM FOR EVERY EXCEL FILES 
Const SC_COLMKT As String = "K" 'NEW MARKETING CODE WILL ALWAYS BE IN THE K COLUM FOR EVERY EXCEL FILES 
Const SC_COLDCT As String = "M" 'NEW DISCOUNT CODE WILL ALWAYS BE IN THE M COLUM FOR EVERY EXCEL FILES 
Const SC_COLPRB As String = "N" 'NEW COMMENTS AND PROBLEM CODE WILL ALWAYS BE IN THE M COLUM FOR EVERY EXCEL FILES 

'VARIABLES 
Dim RowCount As Long 
Dim ct As Long 

'SET VARIABLES 
RowCount = 0 
ct = SC_STRLINE 

Sheets(4).Select 

'ADD COMMENTS 
With Sheets(4) 
    RowCount = .Cells(.Rows.Count, "A").End(xlUp).Row 
End With 

While ct <= RowCount 

    If Sheets(4).Range(SC_COLDCT & ct).Value = "" Then 

     Sheets(4).Range(SC_COLPRB & ct).Value = "EMPTY" 

    End If 

    ct = ct + 1 

Wend 

'FILTER BY COMMENTS 
ActiveWorkbook.Worksheets(4).AutoFilter.Sort.SortFields.Clear 
ActiveWorkbook.Worksheets(4).AutoFilter.Sort.SortFields.Add Key:= _ 
    Range(SC_COLPRB & (SC_STRLINE - 1)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
With ActiveWorkbook.Worksheets("PROD FOUR").AutoFilter.Sort 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

End Sub 

這是工作......莫名其妙......但它是超慢,當我運行宏,我的Excel死亡幾乎70%的時間。

而且有時候,這個宏會導致一個問題,即它會到處寫下來EMPTY出於某種原因...

基本上,我在找一個更快和更清潔的方式做同樣的事情。

有沒有辦法在做同樣的事情時獲得表現?

請注意,我不是一個編碼器,所以如果你能以一種我能理解的方式回答我,那將不勝感激。

+0

嘗試使用的'.Value2'代替'.Value' – sourceCode

+0

是否使用'Application.ScreenUpdating = Fals'e,'Application.Calculation = xlManual'等。?? – dwirony

回答

2

請嘗試使用以下代碼。這不是處理範圍,而是將範圍轉換成希望速度更快的數組。

Sub sbVBA_COMMENTS_ExcelSheets() 

'CONSTANTS SERVICENTRE FILES (PROD FOUR) 
Const SC_STRLINE As Integer = 4 'FIRST PART IS ALWAYS AT LINE 4 
Const SC_COLNUM As String = "B" 'PART NUMBERS WILL ALWAYS BE IN THE B COLUM FOR EVERY EXCEL FILES 
Const SC_COLMKT As String = "K" 'NEW MARKETING CODE WILL ALWAYS BE IN THE K COLUM FOR EVERY EXCEL FILES 
Const SC_COLDCT As String = "M" 'NEW DISCOUNT CODE WILL ALWAYS BE IN THE M COLUM FOR EVERY EXCEL FILES 
Const SC_COLPRB As String = "N" 'NEW COMMENTS AND PROBLEM CODE WILL ALWAYS BE IN THE M COLUM FOR EVERY EXCEL FILES 

'VARIABLES 
Dim RowCount As Long 
Dim varray As Variant 
Dim i As Long 

'SET VARIABLES 
RowCount = 0 
ct = SC_STRLINE 

'disable unnecessary hindrances 
Application.ScreenUpdating = False 
Application.Calculation = xlManual 

With ThisWorkbook.Sheets(4) 

'find last row 
RowCount = .Cells(.Rows.Count, "A").End(xlUp).Row 

varray = Range(SC_COLDCT & SC_STRLINE & ":" & SC_COLDCT & RowCount).Value 

For i = UBound(varray, 1) To LBound(varray, 1) Step -1 
    If varray(i, 1) = "" Then 'if nothing 
     .Range(SC_COLPRB & i + 4).Value = "EMPTY" 
    End If 
Next 


'FILTER BY COMMENTS 
.AutoFilter.Sort.SortFields.Clear 
.AutoFilter.Sort.SortFields.Add Key:= _ 
    Range(SC_COLPRB & (SC_STRLINE - 1)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 

End With 

With ActiveWorkbook.Worksheets("PROD FOUR").AutoFilter.Sort 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 


End Sub 
+0

林不知道我明白這是如何工作的。我應該在下一步之前放置ct = ct + 1嗎? 什麼時候會停止使用? – Konsume

+1

由於處理數組的速度很快,因此處理範圍時,我將範圍內的值轉換爲數組中的值。 for循環遍歷數組的每個元素(又稱每個單元格值),然後檢查條件,如果沒有,則用「EMPTY」填充N列。 – sourceCode

+0

好吧,我已經試過了,它的速度更快...謝謝!我也看到你更新了你的代碼來解決「ct」問題。完美的人!謝謝一堆。 – Konsume

0

下面的簡單代碼可以快速完成您想要的操作。您也可以使用「」而不是vbNullString。

Dim i As Long 
Dim lR As Long 

lR = Cells(Rows.Count, "A").End(xlUp).Row 

    For i = 2 To lR 
     If Cells(i, "M").Value = vbNullString Then 
      Cells(i, "N").Value = "Empty" 
     End If 
    Next i 
相關問題