Solved

Trim multiple cells using a Do-Until loop

Posted on 2014-11-11
12
97 Views
Last Modified: 2014-11-12
I receive a weekly csv file from a database where several pieces of data have 3 or 4 empty spaces in a cell, depending on the database character type length.

I have set a routine to loop through 3 columns of data to trim each cell in turn (sample attached).
This routine, even with screen updating disabled is very slow.

Can you please suggest a faster method to trim the cells.

Many thanks
David
TrimCells-Sub.xlsm
0
Comment
Question by:David Phelops
12 Comments
 
LVL 27

Expert Comment

by:Glenn Ray
ID: 40435230
I'm presuming that your actual source data has more spaces than this example because the macro took less than a second on my laptop (Excel 2010 32-bit, Windows 7 64-bit, 2.5GHz processor).
0
 

Author Comment

by:David Phelops
ID: 40435252
This took 10 seconds on my desktop pc
0
 

Author Comment

by:David Phelops
ID: 40435260
Excel 2010 64-bit Windows 7 2.8 gHz processor
0
 
LVL 27

Expert Comment

by:Glenn Ray
ID: 40435285
I even ran it with this looping code instead of your Do...Loop and it only took 1 second at the most.
     lngLR = Range("A7").End(xlDown).Row
    Set rng = Union(Range("A7:A" & lngLR), Range("C7:C" & lngLR), _
              Range("E7:E" & lngLR))
    For Each cl In rng
        cl.Value = Trim(cl.Value)
    Next cl

Open in new window


Any chance your test data has more than 1,928 rows to process (size of example) ?

-Glenn
0
 

Author Comment

by:David Phelops
ID: 40435294
I'm using exactly the same data as in the  example
0
 
LVL 27

Expert Comment

by:Glenn Ray
ID: 40435323
Just for grins, replace your code with this:
Option Explicit
Sub Trim_Cells()
    'This routine trims cells in Columns 1, 3 and 5 using a Do-Until Loop
    
    'Declare Variables
    Dim tStart As Date
    Dim tFinish As Date
    Dim tRunTime As Double
    Dim R As Integer    'Row Number
    
    Dim lngLR As Long 'last row
    Dim rng As Range
    Dim cl As Object
        
    
    'Switch off screen refresh
    Application.ScreenUpdating = 0
    
    'Record Start Time
    tStart = Now()
        
    'Set user message in the staus bar
    Application.StatusBar = "Trimming Vendor Codes.  Please be patient"
    
    'R = 7 'First data row
    'Loop through all job records
    'Do Until Cells(R, 5) = ""           'Test for empty cell
    '    Cells(R, 1) = Trim(Cells(R, 1)) 'Trim Client_Code
    '    Cells(R, 3) = Trim(Cells(R, 3)) 'Trim Vendor_Code
    '    Cells(R, 5) = Trim(Cells(R, 5)) 'Trim Booking Ref
    '    R = R + 1
    'Loop
    
    'Alternate looping code
    lngLR = Range("A7").End(xlDown).Row
    Set rng = Union(Range("A7:A" & lngLR), Range("C7:C" & lngLR), _
              Range("E7:E" & lngLR))
    For Each cl In rng
        cl.Value = Trim(cl.Value)
    Next cl
        
    'Record the finish time
        tFinish = Now()
        
    'Reset status bar message
        Application.StatusBar = False
    
    'Calculate and show time taken for routine to run.
        tRunTime = (tFinish - tStart) * 24 * 60 * 60
        tRunTime = MsgBox("Time taken for routine is " & Round(tRunTime, 5) & " seconds", , "Run Time")

End Sub

Open in new window


I've left your original loop in-place (rows 25-32), just commented it out.

-Glenn
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:David Phelops
ID: 40435349
Thanks, I'll that a go... Will be tomorrow morning. Cheers.
0
 
LVL 45

Expert Comment

by:Martin Liss
ID: 40435406
When I ran the code it said it took 0 seconds so I changed the timing method to use GetTickCount as described in this article of mine and it showed that it took just 187 ms. (Excel 2010 32 bit in Windows XP running as virtual machine on a MAC). Have you checked to see how much free memory you have?
0
 

Author Comment

by:David Phelops
ID: 40435420
I'm going to try it on my home pc and see if It makes a difference
0
 
LVL 18

Accepted Solution

by:
krishnakrkc earned 500 total points
ID: 40435461
Hi

I copied the data in approx 12000 rows and run this code which took 0 secs.

Sub Trim_Cells()

'This routine trims cells in Columns 1, 3 and 5 using a Do-Until Loop

'Declare Variables
    Dim tStart As Date
    Dim tFinish As Date
    Dim tRunTime As Double

'Switch off screen refresh
    Application.ScreenUpdating = 0

'Record Start Time
    tStart = Now()
    
'Set user message in the staus bar
    Application.StatusBar = "Trimming Vendor Codes.  Please be patient"
    
    Dim x   As String
    
    With Range("a7:e" & Range("a" & Rows.Count).End(3).Row)
        x = .Address
        .Value = Evaluate("if(len(" & x & "),trim(" & x & ")," & x & ")")
    End With

'Record the finish time
    tFinish = Now()
    
'Reset status bar message
    Application.StatusBar = False

'Calculate and show time taken for routine to run.
    tRunTime = (tFinish - tStart) * 24 * 60 * 60
    tRunTime = MsgBox("Time taken for routine is " & Round(tRunTime, 5) & " seconds", , "Run Time")

End Sub

Open in new window


Kris
0
 
LVL 31

Expert Comment

by:Rob Henson
ID: 40435643
Does your real data have calculations associated to the values which are being trimmed?

If so try turning to Manual Calculation before running the macro.

If that helps the switch to manual calc (and back to auto) can be included in the routine.

Thanks
Rob H
0
 

Author Closing Comment

by:David Phelops
ID: 40437056
Thanks for all your help and comments:

Kris - brilliant - I don't quite understand (yet)  how your code works, but it certainly does - it ran at 0 seconds

Glenn - thanks, but your code also ran at 10 seconds

Rob - no in this case there are no calculations.  This is a text-only set of values.

Martin - I have plenty of free memory: I restarted the pc and ran the code with nothing else open.
0

Featured Post

Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

Join & Write a Comment

When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
This Micro Tutorial demonstrates how to create Excel charts: column, area, line, bar, and scatter charts. Formatting tips are provided as well.
This Micro Tutorial will demonstrate how to use longer labels with horizontal bar charts instead of the vertical column chart.

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now