2016-02-02 10 views
5

Aşağıdaki komut dosyası, daha küçük veri kümeleriyle (30 bin satırdan az) çalışmaktadır, ancak aralık daha büyük olduğunda, seçili aralıktaki her hücre için "# VALUE" hatasıyla sonuçlanır. Aşağıda gösterilen büyük veri için konuyu üstesinden olarakVBA ve Excel: TRIM komut dosyasım neden büyük veri kümelerinde # VALUE ile sonuçlanıyor?

Dim FirstCell As Range, LastCell As Range, MyRange As Range 

Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Column) 

Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Column) 

Set MyRange = Range(FirstCell, LastCell) 
     MyRange.Select 
     If MyRange Is Nothing Then Exit Sub 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 
    With Selection 
     .Value = Evaluate("if(row(" & .Address & "),clean(trim(" & .Address & ")))") 
    End With 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

VBA TRIM Error

+0

Bu kodla kaç tane hücre değiştiriyorsunuz? Sadece 1,7 milyon hücre üzerinde test ettim ve uygulama belgesine – TMH8885

+0

8,106,860 hücre hatası vermedim. Bu 161,363 satır. –

+0

Yaklaşık 70 bin satıra kadar çalışıyor gibi görünüyor. Bundan çok daha fazlası, yalnızca seçilen aralıktaki her hücrenin değerini # VALUE olarak ayarlar. –

cevap

1

ben Başvuru için

Dim FirstCell As Range, LastCell As Range, MyRange As Range 
Dim DataRange() As Variant 
Dim lRows As Long 
Dim lCols As Long 
Dim i As Long, j As Long 
Dim value As String 

Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlPrevious, LookIn:=xlValues).Column) 

Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Row, _ 
     Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ 
     SearchDirection:=xlNext, LookIn:=xlValues).Column) 

Set MyRange = Range(FirstCell, LastCell) 
    MyRange.Select 
    If MyRange Is Nothing Then Exit Sub 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    lRows = MyRange.Rows.Count 
    lCols = MyRange.Columns.Count 
    ReDim DataRange(1 To lRows, 1 To lCols) 
    DataRange = MyRange.value 
    For j = 1 To lCols 
    For i = 1 To lRows 
     DataRange(i, j) = Trim(DataRange(i, j)) 
    Next i 
    Next j 

    MyRange.value = DataRange 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

setleri sorununuzu çoğaltmak ve varyant dizisi kullanarak başardı, ben yardımcı olmak için bu makaleye kullanılan Cevapla gel: https://blogs.office.com/2008/10/03/what-is-the-fastest-way-to-scan-a-large-range-in-excel/

+0

Linkler gelecekte bozulabilir. Lütfen soruyu cevaplamak için gerekli bilgileri kopyalayıp yapıştırın. Bağlantıyı sadece referans olarak kullanın. – eirikdaude

+0

Bağlantının sadece referans amaçlı olduğunu daha iyi açıklamak için cevabı güncelledim, cevap yukarıda belirtildi – TrtlBoy